0

3 つの異なるテーブルからデータを返すストアド プロシージャがあります。コードでそのプロシージャを呼び出すたびに、新しいデータを別のテーブルに挿入する必要があります (データを複製することはベスト プラクティスではありませんが、この場合は必要です)。

これは私がこれまでに持っているものです:

BEGIN

DECLARE
 v_cc COMM_CUSTOMER%ROWTYPE;

CURSOR c1 is 
SELECT d.customer_name, d.active, f.street, f.state, f.zip, t.amount_due, t.due_date
FROM tables t 
INNER JOIN othertable on ect, ect
WHERE t.due_date < sysdate
c_row c1%rowtype;

BEGIN
      OPEN c1;
      LOOP
        FETCH c1
          INTO c_row;
        EXIT WHEN c1%NOTFOUND;
        MERGE INTO COMM_CUSTOMER cc
        USING DUAL
on (cc.customer_name= v_cc.customer_name and 
    cc.active = v_cc.active and
    cc.street = v_cc.street and
    cc.amount_due = v_cc.amount_due)

 when not matched then
      insert values c_row; 

    COMMIT;
  END LOOP;
  CLOSE c1; 

これはコンパイルされますが、何もしません。

私はオラクルで約1週間働いていますが、カーソルについてはあまり知りませんし、全体的にSQLの経験もあまりありません...誰かが私が間違っていること/これを行う別の方法を教えてもらえますか? ありがとう!

4

2 に答える 2

0

このようなことを試してください:

merge into COMM_CUSTOMER cc 
using 
(
  SELECT d.customer_name, d.active, f.street, f.state, f.zip, t.amount_due, t.due_date
  FROM tables t 
  INNER JOIN othertable on ect, ect
  WHERE t.due_date < sysdate 
) input
on (cc.customer_name= input.customer_name and 
    cc.active = input.active and
    cc.street = input.street and
    cc.amount_due = input.amount_due)
when not matched then
      insert values cc.customer_name, cc.active, cc.street, cc.state, cc.zip, cc.amount_due, cc.due_date; 

merge 句についてもっと読む必要があります

于 2013-07-01T05:12:03.873 に答える
0

これを試して:

DECLARE
     v_cc COMM_CUSTOMER%ROWTYPE;
     CURSOR c1
     IS
          SELECT d.customer_name,
               d.active,
               f.street,
               f.state,
               f.zip,
               t.amount_due,
               t.due_date
          FROM tables t
          INNER JOIN othertable
          ON (ect          = ect1)
          WHERE t.due_date < sysdate;
     c_row c1%rowtype;
BEGIN
OPEN c1;
LOOP
     fetch c1 into c_row;
     exit when c1%notfound;

merge into comm_customer cc 
using dual 
ON (cc.customer_name= v_cc.customer_name AND cc.active = v_cc.active AND cc.street = v_cc.street AND cc.amount_due = v_cc.amount_due)
WHEN NOT matched THEN
     INSERT
          ( col1_name, col2_name
          )VALUES
          (c_row.customer_name, c_row.active
          );
     COMMIT;
END LOOP;
CLOSE c1; 
END;
于 2013-07-01T05:09:15.253 に答える