sql >> データベース >  >> RDS >> Oracle

Oracle ODBCのNUMBER(15)列で使用するクエリパラメータとしてどのデータ型をバインドする必要がありますか?

    私の個人的な好みは、バインド変数を文字列(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)がこのトピックについて何と言っているのだろうか?




    1. 動的ファイル名でコピー

    2. 年月日で年齢を計算する

    3. Oracle-リテラルがフォーマット文字列エラーと一致しません

    4. トランザクションMySQL