0

以下のようなカーソルを実行しようとしていますが、さまざまなアプローチに苦労して結果が得られません。どうやら私一人では無理そうで、あなたに手伝ってもらうことにしました。以下のコードは、準備が整ったアプローチではなく、私が達成したいことを示しています。助けてください。

重要なことはわかりませんが、顧客をループで更新する必要があることに注意してください。また、このループで顧客を参照する別のテーブルからいくつかのデータを選択し、3 番目のテーブルに何かを挿入して顧客テーブルを更新する必要があります。

DECLARE
  CURSOR MY_CURSOR
  IS
    SELECT CUSTOMERID FROM CUSTOMERS WHERE ACTIVE = 1 ;
  MY_RECORD MY_CURSOR%ROWTYPE;
BEGIN
  FOR MY_RECORD IN MY_CURSOR
  LOOP

 DECLARE TEMPORARY_TABLE TABLE (A DATE, B NUMBER, C VARCHAR)

 INSERT INTO @TEMPORARY_TABLE(A,B,C) (SELECT CREATEDDATE, ID, NAME FROM ACCOUNT WHERE CUSTOMER = MY_RECORD.CUSTOMERID)

 INSERT INTO SOME_EVENT_TABLE(ID, NAME, DATE, ACCOUNT_ID) VALUE (some_seq.NEXTVAL, @TEMPORARY_TABLE[C], @TEMPORARY_TABLE[A], @TEMPORARY_TABLE[B])

     UPDATE CUSTOMERS SET LAST_ACCOUNT_CHECK_NAME=@TEMPORARY_TABLE(C), LAST_INSERTED_EVENT_ID = some_seq.CURRVAL  WHERE ID = MY_RECORD.CUSTOMERID


  END LOOP;
  COMMIT;
END;
4

2 に答える 2

1

まず、SQL Serverのように、Oracleで一時テーブルを宣言することはできません。ただし、とにかくここでは本当に必要ありません。

このようなものが機能するはずです:

FOR MY_RECORD IN MY_CURSOR LOOP
  FOR  R IN (SELECT CREATEDDATE, ID, NAME 
               FROM ACCOUNT WHERE CUSTOMER = MY_RECORD.CUSTOMERID) LOOP
    INSERT INTO some_event_table(ID, NAME, DATE, ACCOUNT_ID)
    VALUES (some_seq.NEXTVAL, R.NAME, R.CREATEDATE, R.ID);

    UPDATE customers 
       SET last_account_check_name = R.name
         , last_inserted_event_id = some_seq.CURRVAL
     WHERE id = MY_RECORD.CUSTOMER_ID;
  END LOOP;
END LOOP;
COMMIT;
于 2013-01-27T19:53:43.457 に答える