Oracle ORAエラー PL/SQL

SERIALLY_REUSABLE の使い方|ORA-06550(PLS-00907)の回避策?

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)内の小規模なプールにある作業領域に格納されます。


パッケージの状態は、サーバー・コールが存続する間のみ維持されます。サーバー・コールの後、作業領域はプールに戻されます。以降のサーバー・コールがこのパッケージを参照すると、Oracle Databaseはこのプールからインスタンス化を再利用します。インスタンス化を再利用すると、インスタンス化は再初期化されるため、それまでのサーバー・コールで実行されたパッケージ状態に対する変更は参照できなくなります。

https://docs.oracle.com/cd/E57425_01/121/LNPLS/packages.htm#GUID-001EF960-7491-411B-A5F3-D1260A45794B

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パッケージ
PL/SQLパッケージ

docs.oracle.com

Oracle By Mahendra: PRAGMA SERIALLY_REUSABLE in ORACLE
Oracle By Mahendra: PRAGMA SERIALLY_REUSABLE in ORACLE

oraclebymahendra.blogspot.com

この記事が役に立ったという方は
ボタンをポチッとしてくれたら喜びます

-Oracle, ORAエラー, PL/SQL