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 を外部キーとして持つ別のテーブルに 2 回目の 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、これら 2 つのテーブルを関連付けるキーがソース システムにあるのではないでしょうか? そのキーが の場合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;

2 つのループではなく、2 つのステートメントで1 つのFORループを実行することもできます。また、毎回大量のデータをプルする場合は、ループと aをINSERTFORALLLIMITBULK 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 に答える