11

簡潔なバージョン:

次の 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)

:1OCI配列はどこにありますか? (おそらく構文は異なるでしょう。) 誰もこれについて経験がありますか? 生の OCI を書くのに苦労する傾向があるので、サンプル コードは天の恵みです。ありがとう :)

編集:可能であれば、PL/SQLプロシージャによって解析される文字列にバインドするよりもうまくやりたいです。多くの場合、4000 文字の制限を超えてしまうと確信しています。また、それは、私が慣れている種類の文字列操作を、私が慣れていない別の種類の操作と交換しているだけのようにも感じます (そして、私にはできません)。簡単にデバッグできます)。可能であれば、値の配列 (または何らかの形式のデータセット) を 1 つの標準 SQL ステートメントにバインドしたいと考えています。

EDIT 2:いくつかの調査により、次のリンクが判明しましたが、これは私が望むことをしているように見えますが、Java で: http://rafudb.blogspot.com/2011/10/variable-inlist.html 誰もこれを適応させる方法を知っていますか? C++ OCI へのアプローチ?

4

3 に答える 3

0

これは確かに可能であり、PL/SQL を使用する必要はありません。提案したように数値を渡していると仮定すると、最初に使用できるデータベース内にオブジェクトを作成する必要があります。

create or replace type t_num_array as table of number;

その後、次のようにテーブルを使用してテーブルにクエリを実行できます。

select *
  from my_table
 where id in (select * from table(t_num_array(1,2,3)) )

あなたはまだ同じ問題を抱えています。不明な数の変数をどのようにステートメントにバインドしますか? しかし、これで、それらを配置するためのバインド可能な構造ができました。

Ivan の言うとおり、ドキュメントは少しわかりにくく、私の C++ の知識は信じられないほどなので、申し訳ありませんが、サンプル コードが不足しています。ただし、読む価値がある以上のことがいくつかあります。オブジェクト・リレーショナル・データ型に関するOCIプログラマーズ・ガイドの第12章。Object Type Translator Utilityについて知っておくと役立つでしょう。

データベース オブジェクト型、LOB 型、および名前付きコレクション型を C++ クラス宣言にマップするために使用されます。

クラスでの例 8-12 ( の宣言my_table) は、many_typesそれを として宣言できることを意味しますvector<int>

于 2013-09-07T12:13:45.150 に答える