0

Oracle データベースで Bulk all と Forall を使用しようとしています。

Procedure の元のコードは次のとおりです。

IF NVL(v_mc,0) != 0 THEN
        FOR rec IN
        (SELECT a.testid,
            SUM(pct * NVL(cap,0))/v_mc lead1
            BULK COLLECT INTO testids1, testids2
        FROM testtable a
        WHERE a.id      = n_id
        AND a.type      =n_type

        GROUP BY a.testid;
        )
        LOOP
            UPDATE testtable
            SET LEAD1    =ROUND(testids2(i),2)
            WHERE tid  = n_id
            AND type  = n_type
            AND testid   =testids1(i);
        END LOOP;
END IF;

そのため、選択ステートメントでは、Sum 関数を使用し、ここでもエイリアシングを使用しています。

コード 、Bulk collect と Forall を使用するコードは次のとおりです。

PROCEDURE test
IS

    TYPE test1Tab IS TABLE OF sh_rpt_temp_peer_wip.test1%TYPE;
    TYPE test2Tab IS TABLE OF testtable.lead1%TYPE;
    testids1 testidTab; --Error 1 and Error 2
    testids2 LeadTab;

BEGIN

IF NVL(v_mc,0) != 0 THEN

     SELECT testid,
            SUM(pct * NVL(cap,0))/v_mc lead1
            BULK COLLECT INTO testids1, testids2
        FROM testtable a               --Error 3
        WHERE a.id      = n_id
        AND a.type      =n_type

        GROUP BY a.testid ORDER BY a.testid;

        FORALL i IN testids1.FIRST..testids1.LAST
          UPDATE testtable
            SET LEAD1    =ROUND(testids2(i),2)
            WHERE tid  = n_id  --Error 3
            AND type  = n_type
            AND testid   =testids1(i);

END IF;

END;

しかし、プロシージャーをコンパイルしているときに、複数のエラーが発生します。私はPL/SQLを初めて使用します。Bulk Collect で計算値を列として取得できるかどうか教えてください。手順で以下のエラーが発生しています:

  • エラー 1) PL/SQL: アイテムは無視されました
  • エラー 2) コンポーネント 'LEAD' を宣言する必要があります
  • エラー 3) 式の型が間違っています

ここで何が間違っているのか教えてください

ありがとう

4

1 に答える 1