2011-01-18 47 views
5

私は有効なプロシージャを持っていて、その中にinsert..selectステートメントがあります。このプロシージャを実行すると、この文から「ORA-00904::invalid identifier」エラーが発生する場合があります。それは理論的にはどうして可能ですか?トリガーも動的SQLもありません。有効なパッケージから "ORA-00904::無効な識別子"を取得するにはどうすればよいですか?

また、sqlerrmのORA-00904テキストには、無効と見なされる特定の識別子へのポインタはありません。

Oracleバージョン9.2.0.8

EDIT2:

は(定数に置き換え、すべてが働いていた)その選択の中から呼び出された機能に問題があったが判明。おそらくORA-00904が識別子を与えなかったのはこのためです。それでも、問題は残っています - どのように動的SQLを持たないプリコンパイル済みコードでこのエラーが発生するのでしょうか?

+5

いくつかのサンプルコードを投稿できますか。 – Tim

+2

ビューはありますか?あなたが言ったことから、 'SQLERRM'を出力するすべてのエラー('その他の時 ')の例外ハンドラがあると思います。もしあなたがそれを持っていなければ、とにかく例外が発生し、それがどこから来ているのかについてより多くの情報を与えるでしょう。 –

+5

あなたが識別した関数と、呼び出された関数には動的SQLもありませんでしたか?チェーンの中に 'authid current_user'節があります。これはコンパイルと実行時の動作(特権と解決)に影響しますか?パッケージには適用されない、役割を付与されたprivsに頼っていますか? –

答えて

2

この種のエラーは、パッケージが有効なパッケージにアクセスしてボディにコンパイルが必要であり、例外がスローされたときに発生する可能性があると思います。

もう1つの理由は、現在のユーザーの権限で実行されるauthid current_userのコードである可能性があります(所有ユーザーの権限では通常どおりではありません)。このようなプロシージャーは、別のユーザーと一緒に呼び出されたときに失敗し、別のユーザーと実行されたときに成功します

0

解決策を既に見つけたので、これは問題ではありませんでした。しかし、私は、パッケージ関数がボディを持っていても、スペックシートに関数の署名がない場合、このエラーが出るというメモを追加したかったのです。

関連する問題