簡潔なバージョン:
次の Java 手法の C++ OCI 適応を探しています。このコードでは、数値の配列 (配列のサイズは異なる場合があります) を非 PL/SQLSELECT
ステートメントにバインドし、結果の配列をWHERE ID IN (...)
スタイル チェックで使用できます。 .
http://rafudb.blogspot.com/2011/10/variable-inlist.html
元の質問:
OCI を介して Oracle と通信する C++ アプリがあります。テキストを連結して SQL クエリを生成する古いコードを修正しようとしています。代わりに、可能な限りバインド変数を使用したいと考えています。適切な解決策がない特定のケースが 1 つ発生しました。
SELECT * FROM MyTable WHERE ID IN (1, 4, 10, 30, 93)
(1, 4, 10, 30, 93)
パーツが 1vector<int>
つまたはその他の柔軟なサイズのデータ コンテナーから取得される場所。常に 5 つの値になることがわかっている場合は、次のようにすることができます。
SELECT * FROM MyTable WHERE ID IN (:1, :2, :3, :4, :5)
しかし、それは 1 つかもしれませんし、10 個かもしれませんし、ゼロかもしれません。明らかに、クエリを文字列として構築している場合は、必要な数だけ追加できますが、可能であればそれを避け、変数をバインドするだけに固執することが目標です。
これを達成する良い方法はありますか?たとえば、OCI では、配列をバインドしてからサブ選択できますか?
SELECT * FROM MyTable WHERE ID IN (SELECT * FROM :1)
:1
OCI配列はどこにありますか? (おそらく構文は異なるでしょう。) 誰もこれについて経験がありますか? 生の OCI を書くのに苦労する傾向があるので、サンプル コードは天の恵みです。ありがとう :)
編集:可能であれば、PL/SQLプロシージャによって解析される文字列にバインドするよりもうまくやりたいです。多くの場合、4000 文字の制限を超えてしまうと確信しています。また、それは、私が慣れている種類の文字列操作を、私が慣れていない別の種類の操作と交換しているだけのようにも感じます (そして、私にはできません)。簡単にデバッグできます)。可能であれば、値の配列 (または何らかの形式のデータセット) を 1 つの標準 SQL ステートメントにバインドしたいと考えています。
EDIT 2:いくつかの調査により、次のリンクが判明しましたが、これは私が望むことをしているように見えますが、Java で: http://rafudb.blogspot.com/2011/10/variable-inlist.html 誰もこれを適応させる方法を知っていますか? C++ OCI へのアプローチ?