サブプログラムの起動の解決

PL/SQLコンパイラは、サブプログラムの起動を検出すると、まず現在の有効範囲内で一致するサブプログラムの宣言を検索し、次に必要に応じて連続する外側の有効範囲内を検索します。

サブプログラムの名前およびパラメータ・リストが一致した場合に、宣言と起動は一致します。パラメータ・リストは、宣言内の必須仮パラメータがそれぞれ起動内で対応する実パラメータを持つ場合に一致します。

コンパイラが起動に対して一致する宣言を見つけられない場合、セマンティック・エラーが生成されます。

図9-1に、PL/SQLコンパイラがサブプログラムの起動を解決する方法を示します。

図9-1 PL/SQLコンパイラによる起動の解決方法

図9-1の説明が続きます
「図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