2

Oracle でバインド変数を日付とともに正しく使用することに戸惑っています。これは、データベース内または PL/SQL を使用する場合ではなく、to_date関数を使用して日付を文字列として渡す必要がある OCI インターフェースを介して Oracle と対話する場合です。

バインド変数を適切に使用するための正しいアプローチは、次のようにすることだと思いました。

to_date(:my_date, :my_date_format)

ただし、日付形式がバインドを使用して行われていないアプローチを見てきたため、少し混乱しています。

誰でもこれを確認したり、最善のアプローチを提案したりできますか?

4

2 に答える 2

1

日付形式は定数ですか? それとも、実行時に変更されますか?

通常、文字列が(少なくとも予想される)どの形式になるかはわかっているため、日付形式は定数になります。何かが定数である場合、それをバインド変数にする必要はなく、ステートメントの一部としてハードコードするだけでかまいません。この場合、どちらの方法でも問題はありませんが、オプティマイザにより多くの情報を提供する必要があるため、SQL ステートメントで値をハードコーディングしたい場合があります (非常に偏ったデータを持つ列を考えてください。常に特定のハードコードされた値を探しています)。

一方、誰かが日付の文字列表現と文字列の形式の両方をプロシージャに渡すために日付形式が実行時に変更される場合は、日付形式をバインド変数にするのが理にかなっています。

于 2012-01-26T15:27:52.483 に答える
1

あなたの質問への答えは、それによって異なります...

date_format を動的に作成している場合は、バインド変数を使用して SQL インジェクションを安全にする必要があります。日付形式を動的に作成していない場合は、すでにハードコードされており、ほとんど意味がありません。

select to_date(:my_date,'yyyymmdd') from dual

とにかく安全ですが:

select to_date(:my_date,:my_date_format) from dual

本当にバインドする必要があります。

これはすべて、:my_date が列ではないことを前提としています。この場合、バインド変数にすることはできません。

静的な日付をOracleに渡し、列を使用していないにもかかわらずバインド:my_dateしている場合、OCIはOracleに行かないとこれを解決できません(確かにわかりません。使用したことはありません)。

于 2012-01-26T15:29:35.627 に答える