私の個人的な好みは、バインド変数を文字列(VARCHAR2)にし、Oracleに文字から独自の内部ストレージ形式への変換を行わせることです。許容可能な形式で、ヌル終了文字列として表されるデータ値を取得するのは(Cでは)十分に簡単です。
したがって、次のようにSQLを記述する代わりに:
SET MY_NUMBER_COL = :b1
, MY_DATE_COL = :b2
私は次のようにSQLを記述します:
SET MY_NUMBER_COL = TO_NUMBER( :b1 )
, MY_DATE_COL = TO_DATE( :b2 , 'YYYY-MM-DD HH24:MI:SS')
バインド変数として文字列を指定します。
このアプローチにはいくつかの利点があります。
1つは、他のデータ型のバインドで発生する問題とバグを回避することです。
もう1つの利点は、バインド値がOracleイベント10046トレースで解読しやすいことです。
また、EXPLAIN PLAN(私は信じています)はすべてのバインド変数がVARCHAR2であることを想定しているため、説明されているステートメントは、実行されている実際のステートメントとはわずかに異なります(実際のバインド引数のデータ型が暗黙的なデータ変換を行うため)ステートメントはVARCHAR2ではありません。)
そして(それほど重要ではありませんが)TOADでステートメントをテストしているときは、入力ボックスに文字列を入力するだけで簡単で、ドロップダウンリストボックスのデータ型を変更する必要はありません。
また、buitinのTO_NUMBER関数とTO_DATE関数でデータを検証します。 (少なくとも以前のバージョンのOracleでは、DATE値を直接バインドする際に問題が発生し、有効性チェック(少なくとも一部)をバイパスして、無効な日付値をデータベースに格納できるようにしました。
これは、過去の経験に基づく個人的な好みです。私はこれと同じアプローチをPerlDBDで使用しています。
トム・カイト(asktom.oracle.com)がこのトピックについて何と言っているのだろうか?