如何通过 OracleCommand 使用 OracleTransaction 将父表的 id 传递给子表

Posted

技术标签:

【中文标题】如何通过 OracleCommand 使用 OracleTransaction 将父表的 id 传递给子表【英文标题】:How to pass id of Parent Table to Child using OracleTransaction through OracleCommand 【发布时间】:2011-04-28 05:25:25 【问题描述】:

我最近移植了一些代码以使用 ODP.NET 的 OracleTransaction

我有以下 PL/SQL 代码:

父表

CREATE OR REPLACE FUNCTION insertneworder (
   orderdate        IN   orders.order_date%TYPE,
   orderdescription IN   orders.order_description%TYPE
)
   RETURN orders.order_id%TYPE
IS
  orderid   orders.order_id%TYPE;

BEGIN
   INSERT INTO orders
               (order_date, order_description
               )
        VALUES (orderdate,orderdescription
               )
     RETURNING order_id
          INTO orderid;

   RETURN orderid;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      NULL;
   WHEN OTHERS
   THEN
      -- Consider logging the error and then re-raise
      RAISE;
END insertneworder;

父表触发器

CREATE OR REPLACE TRIGGER bi_orders_pk
   BEFORE INSERT
   ON orders
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
   SELECT TO_CHAR (SYSTIMESTAMP, 'yyyymmddhh24missff3')
     INTO :NEW.order_id
     FROM DUAL;
END;

子表

CREATE OR REPLACE PROCEDURE insertneworderdetails (
   orderid     IN   order_details.order_id%TYPE,
   quantity    IN   order_details.quantity%TYPE,
   productid   IN   order_details.prod_id%TYPE,
   itemcost    IN   order_details.itemcost%TYPE
)
IS
BEGIN
   INSERT INTO order_details
               (order_id, quantity, prod_id, itemcost
               )
        VALUES (orderid, quantity, productid, itemcost
               );
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      NULL;
   WHEN OTHERS
   THEN
      -- Consider logging the error and then re-raise
      RAISE;
END insertneworderdetails;

子表触发器

CREATE OR REPLACE TRIGGER bi_order_details_pk
   BEFORE INSERT
   ON order_details
   REFERENCING NEW AS NEW OLD AS OLD
   FOR EACH ROW
BEGIN
   SELECT TO_CHAR (SYSTIMESTAMP, 'yyyymmddhh24missff3')
     INTO :NEW.item_id
     FROM DUAL;
END;

假设我为 insertneworder 和 insertneworderdetails 创建了一个 OracleCommand 我会将它传递给这段代码...

public static bool ExecuteTransaction(List<OracleCommand> command) 
            
                OracleConnection conn;
                conn = OraConnection.Instance.OracleConnection;
                if (conn.State == ConnectionState.Closed) 
                    conn.Open();
                    
                OracleTransaction trans;
                trans = conn.BeginTransaction();

                try 
                    
                    foreach (OracleCommand cmd in command) 
                        
                        cmd.Connection = conn;
                        cmd.ExecuteNonQuery();
                        
                    trans.Commit(); 
                    

                catch (Exception ex)
                    
                    trans.Rollback();
                    return false;
                    
            return true;
             

我的问题是“如何将 insertneworder 函数返回的 PARENT 表的 id 通过 OracleCommand 传递给 insertneworderdetails”?

非常感谢任何帮助...

【问题讨论】:

【参考方案1】:

看起来您需要在 ExecuteTransaction 函数的“foreach”循环中添加一些代码,以检测“insertneworder”函数何时被调用,捕获其返回值,然后检测“insertneworderdetails”函数何时被调用即将被调用并将先前捕获的返回值绑定到“insertneworderdetails”调用中的适当参数标记。抱歉,我不能更具体,但我认为这是一个普遍的前进方向。

分享和享受。

【讨论】:

以上是关于如何通过 OracleCommand 使用 OracleTransaction 将父表的 id 传递给子表的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 OracleCommand C# 执行不同的多条 SQL 语句

如何在 OracleCommand INSERT INTO 之后检索 sys_guid() 的值

OracleCommand.CommandText 中的查询文本是不是有最大长度?

OracleCommand SQL 参数绑定

OracleCommand ExecuteScalar 有时返回 null

oracle reader 返回 System.Data.OracleClient.OracleCommand 作为值