バルク処理もやってみた。
SELECT
DECLARE
-- コレクション型を定義
TYPE tra1_type IS TABLE OF TRANSACTION1%rowtype;
-- コレクション型の変数を定義
tra1 tra1_type;
BEGIN
SELECT * BULK COLLECT INTO tra1 FROM TRANSACTION1;
END;
/
DECLARE
-- コレクション型を定義
TYPE tra1_type IS TABLE OF TRANSACTION1%rowtype;
-- コレクション型の変数を定義
tra1 tra1_type;
-- カーソル定義
CURSOR tra1_rows IS SELECT * FROM TRANSACTION1;
BEGIN
OPEN tra1_rows;
-- フェッチする
FETCH tra1_rows BULK COLLECT INTO tra1;
FOR i IN 1 .. tra1.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(tra1(i).NAME);
END loop;
CLOSE tra1_rows;
END;
/
2通り書きましたが、結果は同じ↓
PL/SQLプロシージャが正常に完了しました。 AAA BBB CCC DDD EEE FFF GGG HHH
INSERT
DECLARE
-- コレクション型を定義
TYPE tra1_type IS TABLE OF TRANSACTION1%rowtype;
-- コレクション型の変数を定義
tra1 tra1_type;
BEGIN
SELECT * BULK COLLECT INTO tra1 FROM TRANSACTION1;
-- TRANSACTION2 に新規登録
FORALL i IN 1 .. tra1.COUNT
INSERT INTO TRANSACTION2 VALUES(
tra1(i).ID,
tra1(i).NAME
);
-- TRANSACTION1 と TRANSACTION2 が同じ項目なら以下でも良い
-- INSERT INTO TRANSACTION2 VALUES tra1;
END;
/
UPDATE
DECLARE
-- コレクション型を定義
TYPE tra1_id_tyep IS TABLE OF TRANSACTION1.ID%TYPE;
-- コレクション型の変数を定義
tra1_id tra1_id_tyep;
BEGIN
-- 取得
SELECT ID BULK COLLECT INTO tra1_id FROM TRANSACTION1;
-- 全件ループして1.5倍
FORALL i IN 1 .. tra1_id.COUNT
UPDATE TRANSACTION1 SET PRICE = PRICE * 1.5 WHERE ID = tra1_id(i);
END;
/