Oracle: JDBCからストアドCreateの罠

JDBC経由で、ストアドのCreate or Replaceを流したときのこと。

Oracleのストアドは、状態を持っています。
・Valid -- コンパイルが通って使える状態
・Invalid -- コンパイルが通ってなくて使えない状態

通常、Create or Replaceを実行した瞬間に自動的に
コンパイルされて、良ければValid状態になります。

しかし、不思議なことに、JDBCから実行した時は、
なぜかInvalidになってしまいました。
文法的には間違っていないのに。
そして、そのストアドのソースを引っ張りだして、別途ツールから
「そのまま一文字も修正せずに」実行するとValidになるのです。

なぜだぁ。。。と途方に暮れてつつ勘ぐってみました。
改行コードとかおかしいかなぁ(というかそれぐらいしか思いつかない)
と思って、System.getProperty("line.separator")を使うの止めて、
"\n"で連結して実行してみました。(ちなみに環境はWindows)
し・た・ら・・・うまくいったー!

他、DDLは全て「System.getProperty("line.separator")」でOKなのに、
ストアドも作成自体はうまくいってて、コンパイルだけが通らない。
いまいちしっくりこないが、とにかく直った。
色々推測はあるものの、Oracle内部の話になるのでこれ以上に探索はやめ。
という、よくわからないけど、一喜一憂した出来事でした。


「なんでJDBCからCreateOrReplace?」
DBFluteのReplaceSchemaの話です。
DDL、View、ストアド、マスタデータ全てReplaceSchemaで
管理して、DBの環境周りの管理をとても楽にしています。