C++ データベース アクセス用の OTL (Oracle、Odbc、および DB2-CLI テンプレート ライブラリ) を見てきました。渡すクエリが基になるデータベースのパラメーター化されたクエリに変換されるのか、それとも基本的にすべての引数を 1 つの大きな文字列に連結してクエリをデータベースに渡すだけなのかはわかりません。渡すクエリには引数の型情報を含めることができますが、それからクエリがデータベースにヒットするまでの間に何が起こるかわかりません。
2 に答える
私の電子メールに対する OTL 作成者の応答:
OTL は、プレースホルダーを含むクエリを DB API レイヤーに渡します。実際のバインド変数の命名規則は、DB タイプごとに異なります。オラクルの場合、
SELECT * FROM staff WHERE fname=:f_name<char[20]>
に翻訳されます:
SELECT * FROM staff WHERE fname=:f_name
さらに、一連のホスト変数バインド呼び出し。
MS SQL Server または DB2 の場合、同じ SELECT は次のようになります。
SELECT * FROM staff WHERE fname=?
マニュアルには、MS SQL、DB2 では同じ名前のプレースホルダーを複数持つことはできないと記載されています。プレースホルダー/バインド変数を含む SQL ステートメントの作成には比較的コストがかかるため、otl_stream を介してパラメーター化された SQL をインスタンス化する場合は、ストリームをできるだけ再利用するのが理にかなっています。
OTL マニュアルを改善する方法についてさらに質問や提案がある場合は、お気軽にメールでお問い合わせください。
乾杯、セルゲイ
pheadbaq さんが書きました:
こんにちは、私は最近、作成したい ORM ライブラリのベースとして使用する C++ DB ライブラリを評価しており、ますます OTL に引き寄せられています。ところで、それはとても素敵に見え、私が持っているほとんどのニーズを満たすようです. ドキュメントを読んでも明確にできないように見える、長引く質問が1つだけあります。OTL はパラメーター化されたクエリを基礎となる DBMS に渡しますか?それとも、OTL ストリームに渡す引数とクエリを単一の文字列に連結し、それを DBMS に渡しますか?
つまり、バインド変数として文字列「Bob」とともに、この MSSQL クエリを OTL に渡すと、次のようになります。
SELECT * FROM staff WHERE fname = :f_name<char[20]>
OTLパーサーはこれを生成しますか?
SELECT * FROM staff WHERE fname = 'Bob'
またはこれ:
SELECT * FROM staff WHERE fname = @f_name
パラメータとしての文字列とともに
そこで回答したい場合は、この同じ質問を StackOverflow.com に投稿しました: Is C++ OTL SQL database library using parameterized queries under the hood, or string concat?
お時間をいただきありがとうございます
ドキュメントでは、バインド変数についてすべて説明しています。ライブラリがクエリを書き換えていると思いますが、おそらくバインド変数の形式をDBMSが期待する形式に変更し、値をバインド変数にバインドしているだけです。