質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

Q&A

解決済

3回答

16349閲覧

【Oracle, Database 11g, PL/SQL】ファンクションが実行できません

bkb

総合スコア13

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Oracle Database 11g

Oracle DatabaseはRDBMSの商品です。具体的な発売商品として知られているのが、 Oracle9i、Oracle10g、Oracle 11gとOracle 12cです。

PL/SQL

PL/SQL (Procedural Language/Structured Query Language) はOracle CorporationによるSQL(非手続き型言語)を手続き型言語に拡張させるために開発されたプログラミング言語です。

0グッド

0クリップ

投稿2019/01/09 05:10

編集2019/01/09 09:45

既存のファンクションを利用して、PL/SQLでスクリプトを作成しているのですが
下記のエラーが発生します。

     PLS-00201: 識別子xxxx.aaaaを宣言してください。
PLS-00201: 識別子xxxx.bbbbを宣言してください。

※ xxxx:パッケージ名, aaaa, bbbb:ファンクション名 です

ファンクションはパッケージ化されており、同パッケージ内のプロシージャは実行可能です。
CREATE PACKAGE と CREATE PACKAGE BODYの定義は下記の通りです。(xxx:スキーマ名です)

PL/SQL

1--ファイル1.sql(CREATE PACKAGE) 2create or replace package xxx.xxxx as 3 4TYPE TABChar is Table of VARCHAR2(1000) INDEX BY BINARY_INTEGER; 5 6(略) 7FUNCTION aaaa(aaa IN VARCHAR2) RETURN TABChar; 8(略) 9 10end xxxx; 11/

PL/SQL

1--ファイル2.sql(CREATE PACKAGE BODY) 2create or replace package body xxx.xxxx 3as 4 5FUNCTION bbbb(bbb OUT VARCHAR2) RETURN BOOLEAN 6IS 7 (略) 8BEGIN 9 (略) 10EXCEPTION 11 (略) 12 RETURN FALSE; 13END; 14 15FUNCTION aaaaa(aaa IN VARCHAR2) RETURN TABChar 16IS 17 (略) 18BEGIN 19 (略) 20 RETURN XXXX; 21EXCEPTION 22 (略) 23END; 24 25end xxxx; 26/ 27SHOW ERROR

原因を権限不足と仮定して対処してみましたが、下記の通りの結果です。

  • 実行ユーザにファンクション実行権限を付与(grant execute on xxxx.aaaa to USER;)
    →__ORA-04042: プロシージャ、ファンクション、パッケージ、パッケージ本体が存在しません。__

下記のとおり他にも確認してみましたが、いずれも実行不可でした。

  • スペルを確認して実行
  • ファンクション名の記載は、大文字/小文字ともに実行
  • スキーマを指定して実行
  • パッケージ所有ユーザで実行

同一パッケージでも、プロシージャは実行可、ファンクションは実行不可ということはあるのでしょうか?
また、他に原因として考えられることがありましたらご教示いただけますでしょうか。

Oracleのバージョンは11gです。

よろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

自己解決

あるデータリカバリのため、通常運用で使用している既存パッケージ内のファンクションを呼び出す
新たなスクリプトを作成しようかと思っていましたが
CREATE PACKAGE部分に宣言がなく、BODYにしか定義がないファンクションは、同パッケージ内での呼び出しにしか対応していないようでした。

また、TYPEの定義はパッケージ内でしか使用できないようでした。

そのため、今回は既存のファンクションを使用するのはやめて
新たにパッケージを作成しました。

投稿2019/02/19 09:25

bkb

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

差し支えない範囲で CREATE PACKAGE と CREATE PACKAGE BODY(対象のFUNCTION部分だけで良い)を提示できた方が適切なコメントが付き易いです。

とりあえず、sqlplus から CREATE PACKAGE したユーザーで

SQL

1SELECT PACKAGE_NAME1.FUNCTION_NAME1 FROM DUAL ;

を試しては?

追記

PACKAGEの書き方がわかっていない、に1票。
PACKAGEサンプル

投稿2019/01/09 07:09

編集2019/01/09 10:58
Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bkb

2019/01/09 09:59

早速アドバイスいただきありがとうございます。 package および package body の定義を追記いたしました。 ご提示いただいたSQLを実行してみましたが、無効な識別子と認識され、エラーが発生します。 また、下記SQLを実行したところ、当該ファンクションは抽出されませんでした。 SELECT * FROM DBA_OBJECTS WHERE OWNER = 'xxx' AND OBJECT_TYPE = 'aaa';
Orlofsky

2019/01/09 11:18

回答を追記しました。 >PLS-00201: 識別子xxxx.aaaaを宣言してください。 >PLS-00201: 識別子xxxx.bbbbを宣言してください。 はPACKAGE と PACKAGE BODY に宣言が足りない、って怒られています。 sqlplus から CREATE PACKAGE と CREATE PACKAGE BODY を実行して、その時表示されたエラーメッセージといっしょに表示してください。 なお、TYPE での宣言やBOOLEANをRETURNできるのは(つまり、実行できるは)PL/SQLだけで、SQLではサポートされていません。
bkb

2019/01/11 02:31

ご回答ありがとうございます。 PACKAGE自体は既存のもので、今回作成しているのはPACKAGE内ののFUNCTIONを利用した別のスクリプトです。 わかりづらく申し訳ありません。
Orlofsky

2019/01/11 02:47

ここは無償の掲示板です。質問に今回の CREATE PACKAGEやCREATE PACKAGE BODY を実行できる最低限の情報を提示してください。 CREATE PACKAGE に FUNCTION bbbb がなければエラーになります。質問に、実行している方法も載せる必要があることにも気がついてください。 エスパーきぼんぬであれば、別のそれなりのサービス(たぶん、有料)を利用してください。
guest

0

cascadeで無効になっているものを参照しているとかじゃないでしょうか

投稿2019/01/09 05:20

sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bkb

2019/01/09 09:11

早速ご回答いただき、ありがとうございます。 cascade は、USERやTABLEをDROPする際のオプションという認識でおりましたが ファンクションに対するオプションでもあるのでしょうか? 自力で調べたのですが、解決できませんでした。 お手数ですが、よろしくお願いいたします。
sazi

2019/01/09 09:46 編集

オプションという意味ではないです。例えばテーブルをcreateし直すとそのテーブルを参照しているストアドは無効になりますが、それと同様に、エラーになるストアド内で使用しているファンクションなどが無効になっていないかどうかという事です。
bkb

2019/01/11 02:33

2019/01/11 11:30の返信は誤りです。失礼いたしました。 ご回答いただきありがとうございます。 >エラーになるストアド内で使用しているファンクションなどが無効になっていないか こちらについて確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問