如何通过 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 中的查询文本是不是有最大长度?