Oracle DBを使用していて、少しの間、ハマりましたので、メモメモ。
原因、対策とエラー内容を見ると、関係ないのかもしれない。
(Oracle DBだからじゃないと思うけど。。。)
ちなみに、上記エラーが出た場合の通常の対処法は、
「該当文字列 (‘xxxxx’)をリネーム(xxxxx AS XXX など)する」
ことである。
小文字、大文字を区別しないOracleでは、
小文字のテーブル名、カラム名ではうまく認識しないことがあるため
(ということらしい)。
では、本題。
テスト環境が2つ、本番環境と計3つのDB環境がある。
いつもはテスト環境①を使用して、OKなら本番環境に適用している。
1機能の動作確認としてテスト環境②を使用することになった。
環境のコピーはシェルを使っている。
もちろん動作確認は済んでいる。
(というか、先輩が使用していたもの)
テスト環境①上では、特に問題が発生しなかった。
テスト環境②に適用して、ある Function を確認したら、
コンパイルエラーが発生した。
その時に出たエラー内容が「PLS-00302」である。
Google先生に聞いてみて、通常対処方法がわかったが、
カラム名は大文字であるため、別の原因があることがわかった。
(振り出しに戻る感)
今回のシェルを確認したり、
今回の変更であるテーブル、VIEW、INDEXを比較したり、
一つずつ手動で適応したり、
とやっていたら、半日近く何も進展がなかった。
続けて、Function内で使用しているが、
今回変更を加えていない VIEWを比較したところ、
一つだけ異なるカラムを発見!
このカラムを現在使用しているカラムに直して、
Functionをコンパイルしたところ、
見事にコンパイルエラーは発生しなくなった。
・直す前に戻すと、コンパイルエラーになることから、
このカラムが原因である。
これ変更した理由については、
前々回のテストで、現新比較で
手動で変更したカラム(前Ver)に戻したそうだ。
それが残っていたようだ。
・何で他は大丈夫なのか、
何でこれだけ残っているのか、
(もちろん他に残っていないか確認した)
わからないけれども。。。
・カラム名違いは「PLS-00302」になるんですかね?
まあ、これも経験ということで。(諦め)
・忘れるだろうから、今回の備忘録に残すのですよ。
説明 | |
エラー番号 | PLS-00302: コンポーネント’xxxxx’を宣言してください。 |
原因 | 使用Viewのカラムの設定が異なる。 |
対策 | 使用Viewのカラムの設定を合わせる。 |
教訓1 | 表示されるPL/SQLエラー番号が正しいとは限らない。。。 |
教訓2 | 変更した環境は終わったら、元に戻しておきましょう。 |