ORA-06550(PLS-00907)とは
ORA-06550(PLS-00907)はプロシージャ実行時、前回のコールで使用可能だったライブラリユニットが何らかの理由でロードできなかった際に発生するエラー。(例えば古いライブラリキャッシュの情報をロードしてしまったとか)
なので、ORA-06550(PLS-00907)は前回のコールで使用された情報を呼び出さなければ回避が可能となる。
エラー行: 1: エラーが発生しました。 ORA-06550: 行 0、列 0: PLS-00907: ライブラリ単位'HELLOMYWORLD.MYWORLD'(参照先'')をロードできません。
回避策
SERIALLY_REUSABLE を使えば、プロシージャがコールされて終了するたびに情報がリセットされるので、ORA-06550(PLS-00907)の発生を回避することが可能となる。
SERIALLY_REUSABLEパッケージを使用すると、スケーラビリティを向上させるためにメモリーをより効率的に管理するアプリケーションを設計できます。
パッケージがSERIALLY_REUSABLEでない場合、そのパッケージ状態は各ユーザーのユーザー・グローバル領域(UGA)に格納されます。したがって、UGAのメモリー量をユーザー数に比例して増加させる必要があり、スケーラビリティが制限されます。パッケージの状態はセッションが存続する間維持でき、UGAメモリーはセッションが終了するまでロックされます。Oracle Officeなどの一部のアプリケーションの標準的なセッションは数日間存続します。パッケージがSERIALLY_REUSABLEである場合、そのパッケージ状態はシステム・グローバル領域(SGA)内の小規模なプールにある作業領域に格納されます。https://docs.oracle.com/cd/E57425_01/121/LNPLS/packages.htm#GUID-001EF960-7491-411B-A5F3-D1260A45794B
パッケージの状態は、サーバー・コールが存続する間のみ維持されます。サーバー・コールの後、作業領域はプールに戻されます。以降のサーバー・コールがこのパッケージを参照すると、Oracle Databaseはこのプールからインスタンス化を再利用します。インスタンス化を再利用すると、インスタンス化は再初期化されるため、それまでのサーバー・コールで実行されたパッケージ状態に対する変更は参照できなくなります。
SERIALLY_REUSABLE を使ってみる
SERIALLY_REUSABLE パッケージを利用した時としない時、プロシージャがコールされるたびに情報がリセットされることが分かる例が以下。
パッケージ作成
- non_serially_reuse : デフォルトのパッケージ
- serially_reuse : SERIALLY_REUSABLE パッケージ
SQL> create or replace package non_serially_reuse as
2 non_serially_reuse_value int :=0;
3 end;
4 /
Package created.
SQL> create or replace package serially_reuse as
2 pragma serially_reusable;
3 serially_reuse_value int :=0;
4 end;
5 /
Package created.
プロシジャー実行
それぞれのパッケージに変数代入をしてみる。
SQL> begin
2 non_serially_reuse.non_serially_reuse_value:= 1;
3 serially_reuse.serially_reuse_value := 1;
4 end;
5 /
PL/SQL procedure successfully completed.
代入した変数の確認
SERIALLY_REUSABLE パッケージを利用した変数だけがリセットされていることがわかる。
SQL> set serveroutput on size 30000;
SQL> begin
2 dbms_output.put_line ('non_serially_reuse.non_serially_reuse_value...' || non_serially_reuse.non_serially_reuse_value);
3 dbms_output.put_line ('serially_reuse.serially_reuse_value...' || serially_reuse.serially_reuse_value );
4 end;
5 /
non_serially_reuse.non_serially_reuse_value...1
serially_reuse.serially_reuse_value...0
PL/SQL procedure successfully completed.
-
PL/SQLパッケージ
docs.oracle.com
-
Oracle By Mahendra: PRAGMA SERIALLY_REUSABLE in ORACLE
oraclebymahendra.blogspot.com