読者です 読者をやめる 読者になる 読者になる

PLS-00231: 関数’string’はSQLでは使用できません。が罠過ぎる件について

Oracle

ごりごりとSQLを書いているときにふと詰まったのでめも。

Oracle 10g のPL/SQLで以下のようなコードを書いたら
コンパイルエラーになった。
どうやらOracleのFUNCTIONはPACKAGE内に記述しても
プライベートな処理として呼び出せないみたい。。。

CREATE OR REPLACE PACKAGE BODY PACK_TEST
IS

FUNCTION FOO( IN_STR IN VARCHAR2)
RETURN VARHCAR2;
IS
BEGIN
 --DO SOMETHING
END FOO;

PROCEDURE MAIN()
IS
BEGIN
  INSERT INTO W_TABLE
   SELECT 'ITS INVALID CODE'
         ,FOO('HOGE')
   FROM DUAL;
END MAIN;

END PACK_TEST;

こんな感じでエラーになる

PLS-00231: 関数FOOはSQLでは使用できません。

パッケージのヘッダにFOOの宣言をすれば幸福が実現する。
エラーメッセージから解決方法から1ミリも思いつかないよね...。

CREATE OR REPLACE PACKAGE PACK_TEST
IS

FUNCTION FOO( IN_STR IN VARCHAR2)
RETURN VARCHAR2;

PROCEDURE MAIN();

ちなみにここには

処置: SQL文から関数コールを削除してください。または、関数コールをローカル変数に置き換えてください。

とあるばかりでこれまた何の解決にもならない切ない状態である。