蜜蜂号覚書 PL > SQL

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

PL/SQL 雑記

独立トランザクション

PL/SQLの宣言部(ISからBEGINの間)に次のように記述する。
PRAGMA AUTONOMOUS_TRANSACTION;
  • メインのトランザクションから独立したトランザクションとなる。
  • プロシージャ(orファンクション)を抜けた時点でトランザクションは開放される。commitしてなければrollbackされると言うこと。
  • デッドロックに注意。

CURSORの中身を配列に保持。

LOOOP内でCURSORのOPEN,CLOSEを繰り返さないために。
--カーソル定義
CURSOR C01 IS
SELECT ID, NAME FROM HOGE_TABLE;
--ROWTYPE定義
R01 C01%ROWTYPE;
--コレクション型の定義
TYPE ARRAY IS TABLE OF C01%ROWTYPE;
LIST ARRAY := ARRAY(); --コレクションの初期化
I NUMBER := 0; --添え字の定義

OPEN C01;
LOOP
  FETCH C01 INTO R01;
  EXIT WHEN C01%NOTFOUND; --フェッチ終了したら抜ける。
  I := I+1; --添え字をインクリメント
  LIST.EXTEND(I); --Rowを保持するために配列を拡張する。
  LIST(I) := R01; --拡張した領域にRow情報を代入。
END LOOP;
CLOSE C01;

FOR X IN 1 .. I
  --こんな感じにカーソルを閉じた後もアクセス可能。
  DBMS_OUTPUT.PUT_LINE(LIST(X).ID || LIST(X).NAME);
END LOOP;
他にもっといいやり方知っている方、教えてください。

ストアド実行

  • 引数、戻り値無しの場合。
exec hoge
  • 引数有り、戻り値無しの場合。
exec hoge(1,2,3);
  • 引数有り、戻り値有りの場合。
declare
x integer;
begin
x := hoge;
end;
/
無名プロシージャ宣言と実行。
他のやり方がわかりません。

何かあればどうぞ

名前:
コメント: