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の環境周りの管理をとても楽にしています。