ストアドから日付型(DATE)に対して INSERT を行っていたら、SQLCODE が 187 のエラーに遭遇。
この SQLCODE が 187 のエラーってどんな意味なんだろ・・・。コードに対応する情報が見つけきれませんでしたorz
いろいろ探っていくと、どうやら日付型(DATE)のカラムに対するデータの投入で怒られているようですが、ObjectBrowser からは問題なく INSERT が完了します。
また、別の Oracle が乗っかっているサーバではストアドから INSERT ができていて、環境依存(設定)なのかと疑ってしまう。
ちなみに、日付箇所には YYYY/MM/DD 形式の単なる文字列を渡しているのでそこが正式に認められないのかな。下記の例だと、問題の環境では SQLCODE-187 が返ってきます。
1 2 3 | (例) start_date は DATE 型のカラム INSERT INTO test_table (start_date) VALUES('2008/07/01'); INSERT INTO test_table (start_date) VALUES('20080701'); |
日付の文字列の代わりにタイムスタンプ用の SYSTIMESTAMP を使ってあげると INSERT は完了します。
1 2 | (例) start_date は DATE 型のカラム INSERT INTO test_table (start_date) VALUES(SYSTIMESTAMP); |
そこで、TO_DATE() の関数を使って明示的に日付だと宣言してみる。これでも INSERT は問題なく実行できます。
1 2 | (例) start_date は DATE 型のカラム INSERT INTO test_table (start_date) VALUES(TO_DATE('2008/07/01', 'YYYY/MM/DD')); |
正式には日付だと明確にすべきなので上記でいいと思うのですが、環境によって挙動が違うのは困ったものです。ObjectBrowser とストアドの違いならまだいいのですが、サーバ上で実行した場合に別の Oracle 同士で違うのはちょっと怖いものがあります・・・。
Oracle の設定ファイルの内容違いのなのかなぁ。そもそも SQLCODE の 187 って何だよ。こいつは気持ち悪い問題なので解決してまた報告します。
1 2 3 4 5 6 | [環境1] ストアドから文字列を使って DATE 型に INSERT (OK) ObjectBrowser から文字列を使って DATE 型に INSERT (OK) [環境2] ストアドから文字列を使って DATE 型に INSERT (NG) ObjectBrowser から文字列を使って DATE 型に INSERT (OK) |