1

在 PL SQL 中,我正在编写一个使用 DB 链接的存储过程:

CREATE OR REPLACE PROCEDURE Order_Migration(us_id IN NUMBER, date_id in DATE) 
as 
begin
  INSERT INTO ORDERS(order_id, company_id)
  SELECT ORDER_ID_SEQ.nextval, COMPANY_ID 
  FROM ORDERS@SOURCE
  WHERE USER_ID = us_id  AND DUE_DATE = date_ID;   
end;  

它接受某个用户在某一天完成的所有订单,并将它们插入新数据库中。它调用一个序列来确保订单上没有重复的 PK,并且运行良好。

但是,我希望使用相同的过程对另一个具有 order_id 作为外键的表执行第二次 INSERT。所以我需要添加所有刚刚创建的 order_id,以及来自 SOURCE 的匹配数据:

INSERT INTO  ORDER_COMPLETION(order_id, completion_dt)
SELECT ????, completion_dt                    
FROM ORDER_COMPLETION@SOURCE

如何跟踪刚刚创建的哪个 order_id 与我需要从源数据库中提取其数据的那个相匹配?

我考虑制作一个临时表,但您不能在过程中创建它们。

其他信息:我将从我正在编写的 C# 应用程序中调用此过程

4

2 回答 2

5

我不确定我是否遵循了这个问题。如果远程数据库中有一个ORDERS表和一个ORDER_COMPLETION表,那么源系统上不会有一些与这两个表相关的键吗?如果那个键是ORDER_ID,你为什么要在你的过程中重新分配那个键?您不想ORDER_ID从源系统维护吗?

如果您确实想在本地重新分配ORDER_ID,我倾向于认为您想要做类似的事情

CREATE OR REPLACE PROCEDURE order_migration( p_user_id IN orders.user_id%type,
                                             p_due_date IN orders.due_date%type )
AS
  TYPE order_rec IS RECORD( new_order_id  NUMBER,
                            old_order_id  NUMBER,
                            company_id    NUMBER,
                            completion_dt DATE );
  TYPE order_arr IS TABLE OF order_rec;
  l_orders order_arr;
BEGIN
  SELECT order_id_seq.nextval,
         o.order_id,
         o.company_id,
         oc.completion_dt
    BULK COLLECT INTO l_orders
    FROM orders@source o,
         order_completion@source oc
   WHERE o.order_id = oc.order_id
     AND o.user_id  = p_user_id
     AND o.due_date = p_due_date;

  FORALL i IN l_orders.FIRST .. l_orders.LAST
    INSERT INTO orders( order_id, company_id )
      VALUES( l_orders(i).new_order_id, l_orders(i).company_id );

  FORALL i IN l_orders.FIRST .. l_orders.LAST
    INSERT INTO order_completion( order_id, completion_dt )
      VALUES( l_orders(i).new_order_id, l_orders(i).completion_dt );
END;

FOR你也可以用两个INSERT语句而不是两个循环来做一个FORALL循环。如果您每次都提取大量数据,您可能希望通过LIMITBULK COLLECT

于 2011-08-12T14:13:44.793 回答
1

ORDERS@SOURCE 和 ORDERS 中的行之间,以及 ORDERS@SOURCE 和 ORDER_COMPLETION@SOURCE 之间的行之间必须有一些链接,所以你不能使用连接吗?

就像是:

INSERT INTO  ORDER_COMPLETION(order_id, completion_dt)
SELECT o.order_id, ocs.completion_dt                    
FROM ORDER_COMPLETION@SOURCE ocs
JOIN ORDERS o ON o.xxx = ocs.xxx
于 2011-08-12T14:09:49.800 回答