PL/SQLではプログラム内にネストしたサブプログラムは前方宣言して使います。

前方宣言というのは、コードを書くよりも先に宣言を書くということ。これではわからないと思うので例をあげると、以下 BASE_PROGRAMというプログラム内にSUB1_PRGとSUB2_PRGの2つのサブプログラムがあった場合の例です。

PROCEDURE BASE_PROGRAM IS
  PROCEDURE SUB1_PRG;
  PROCEDURE SUB2_PRG;

  PROCEDURE SUB1_PRG IS
  BEGIN
    SUB2_PRG;
  END;

  PROCEDURE SUB2_PRG IS
  BEGIN
    DBMS_OUTPUT.PUT_LINE('SUB1から呼ばれます。'); 
  END;

BEGIN
  SUB1_PRG;
END;

2行目、3行目の”PROCEDURE SUB1_PRG;”と “PROCEDURE SUB2_PRG;” が前方宣言です。必ず必要というわけではないのですが、これをかかないとそのサブプログラム内から他のサブプログラムを呼ぶ場合、自分より上に実装したサブプログラムしか呼ぶことができません。

前方宣言をしていれば、自分より下に実装したサブプログラムも呼ぶことができます。サブプログラム同士が相互に参照している場合は必須です。サブプログラムの定義順を気にするくらいなら、最初から前方宣言しておくのが得策です。