Как передать идентификатор родительской таблицы в Child с помощью OracleTransaction через OracleCommand - PullRequest
0 голосов
/ 28 апреля 2011

Недавно я перенес некоторые из своих кодов для использования OracleTransaction из ODP.NET

У меня есть следующие коды 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;

Предполагая, что я создал OracleCommand для insertneworder и insertneworderdetails, я передам егок этому коду ...

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;
            } 

МОЙ ВОПРОС IS "Как передать идентификатор таблицы PARENT, возвращенной функцией insertneworder, в insertneworderdetails через OracleCommand"?

ЛЮБАЯ ПОМОЩЬ ОЧЕНЬ ЦЕНА ...

1 Ответ

0 голосов
/ 28 апреля 2011

Похоже, вам нужно добавить некоторый код в цикл 'foreach' в вашей функции ExecuteTransaction, чтобы определить, когда была вызвана функция 'insertneworder', захватить ее возвращаемое значение, а затем определить, когда функция 'insertneworderdetails'собирается вызвать и связать ранее захваченное возвращаемое значение с соответствующим маркером параметра в вызове 'insertneworderdetails'.Извините, я не могу быть более конкретным, но я думаю, что это общий путь вперед.

Поделитесь и наслаждайтесь.

...