【PL/SQL】バルク処理

バルク処理もやってみた。

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;
/

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください