質問: 既存のファンクションを利用して、PL/SQLでスクリプトを作成しているのですが 下記のエラーが発生します。 *PLS-00201: 識別子xxxx.aaaaを宣言してください。* *PLS-00201: 識別子xxxx.bbbbを宣言してください。* ※ xxxx:パッケージ名, aaaa, bbbb:ファンクション名 です ファンクションはパッケージ化されており、同パッケージ内のプロシージャは実行可能です。 CREATE PACKAGE と CREATE PACKAGE BODYの定義は下記の通りです。(xxx:スキーマ名です) ``` --ファイル1.sql(CREATE PACKAGE) create or replace package xxx.xxxx as TYPE TABChar is Table of VARCHAR2(1000) INDEX BY BINARY_INTEGER; (略) FUNCTION aaaa(aaa IN VARCHAR2) RETURN TABChar; (略) end xxxx; / ``` ``` --ファイル2.sql(CREATE PACKAGE BODY) create or replace package body xxx.xxxx as FUNCTION bbbb(bbb OUT VARCHAR2) RETURN BOOLEAN IS (略) BEGIN (略) EXCEPTION (略) RETURN FALSE; END; FUNCTION aaaaa(aaa IN VARCHAR2) RETURN TABChar IS (略) BEGIN (略) RETURN XXXX; EXCEPTION (略) END; end xxxx; / SHOW ERROR ``` 原因を権限不足と仮定して対処してみましたが、下記の通りの結果です。 * 実行ユーザにファンクション実行権限を付与(grant execute on xxxx.aaaa to USER;) →*ORA-04042: プロシージャ、ファンクション、パッケージ、パッケージ本体が存在しません。* 下記のとおり他にも確認してみましたが、いずれも実行不可でした。 * スペルを確認して実行 * ファンクション名の記載は、大文字/小文字ともに実行 * スキーマを指定して実行 * パッケージ所有ユーザで実行 同一パッケージでも、プロシージャは実行可、ファンクションは実行不可ということはあるのでしょうか? また、他に原因として考えられることがありましたらご教示いただけますでしょうか。 Oracleのバージョンは11gです。 よろしくお願い致します。
回答: あるデータリカバリのため、通常運用で使用している既存パッケージ内のファンクションを呼び出す 新たなスクリプトを作成しようかと思っていましたが CREATE PACKAGE部分に宣言がなく、BODYにしか定義がないファンクションは、同パッケージ内での呼び出しにしか対応していないようでした。 また、TYPEの定義はパッケージ内でしか使用できないようでした。 そのため、今回は既存のファンクションを使用するのはやめて 新たにパッケージを作成しました。