サブプログラムの起動の解決
PL/SQLコンパイラは、サブプログラムの起動を検出すると、まず現在の有効範囲内で一致するサブプログラムの宣言を検索し、次に必要に応じて連続する外側の有効範囲内を検索します。
サブプログラムの名前およびパラメータ・リストが一致した場合に、宣言と起動は一致します。パラメータ・リストは、宣言内の必須仮パラメータがそれぞれ起動内で対応する実パラメータを持つ場合に一致します。
コンパイラが起動に対して一致する宣言を見つけられない場合、セマンティック・エラーが生成されます。
図9-1に、PL/SQLコンパイラがサブプログラムの起動を解決する方法を示します。
例9-25では、ファンクションbalance
が、適切な実パラメータを使用して、外側のプロシージャswap
を起動しようとしています。ただし、balance
には、swap
という2つのネストしたプロシージャがありますが、どちらにも外側のプロシージャswap
と同じ型のパラメータが存在しません。このため、この起動によって、コンパイル・エラーPLS-00306が発生します。
例9-25 PL/SQLプロシージャ名の解決
DECLARE PROCEDURE swap ( n1 NUMBER, n2 NUMBER ) IS num1 NUMBER; num2 NUMBER; FUNCTION balance (bal NUMBER) RETURN NUMBER IS x NUMBER := 10; PROCEDURE swap ( d1 DATE, d2 DATE ) IS BEGIN NULL; END; PROCEDURE swap ( b1 BOOLEAN, b2 BOOLEAN ) IS BEGIN NULL; END; BEGIN -- balance swap(num1, num2); RETURN x; END balance; BEGIN -- enclosing procedure swap NULL; END swap; BEGIN -- anonymous block NULL; END; -- anonymous block /
結果:
swap(num1, num2); * ERROR at line 33: ORA-06550: line 33, column 7: PLS-00306: wrong number or types of arguments in call to 'SWAP' ORA-06550: line 33, column 7: PL/SQL: Statement ignored