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) 式の型が間違っています
ここで何が間違っているのか教えてください
ありがとう