バインド変数について

解決


もも  2005-02-19 00:21:26  No: 119766

こんちは。
SQL文からDynasetを作成する機能を作成している途中なのですが・・・、
難解な問題が出てきたので皆さんのお力をお借りしたいと投稿しました。
データベース:Oracle8i
アプリケーション:VB6 - OO4O接続

<メイン関数>
Public Sub DynasetCreate(ByVal sql As String, ByVal dbconnection As OraDatabase)
    '◆ダイナセットの作成
    Set Dynaset = dbconnection.CreateDynaset(sql, ORADYN_DEFAULT)
End Sub

<正常に稼動が確認しているSQL文>
   SELECT distinct
      A.NO , B.ITEM 
    FROM
      A_TABLE A, B_TABLE B
    WHERE
      A.CONECT_ID = B.CONECT_ID 
    AND
      A.NO = :ナンバー
    AND
      B.ITEM = :アイテム

<問題のSQL文>
   SELECT distinct
      A.NO , B.ITEM 
    FROM
      A_TABLE A, B_TABLE B
    WHERE
      A.CONECT_ID = B.CONECT_ID 
    AND
      A.NO = :ナンバー
    AND
      B.ITEM IN (:アイテム)

<仕様上の前提条件>
・CreateDynasetしか使用できません。SQL文を関数に渡しDynasetに戻す関数です。
・パフォーマンスの関係上SQL文の形式を書き換えたり固定値を持たすことはせずバインド変数を使用するきまりです。

※今回の問題点
バインド変数として受け渡す値:アイテム が複数あるためIN句を使用したいのですが、
複数の値の受け渡し方がわからず困ってます。(アイテムの数は毎回変わります)
バインド変数の引渡しで addtable を利用したバインド配列なども考えたのですが
CreateDynaset を利用した場合の結果の受け渡しがわからず断念しました・・・。
・addtable を利用した方法はストアドプロシージャを作って実現できないかを検討しました。

今では正常に稼動しているSQL文を複数回実行して結果取得するしか方法はないのでは・・・。
っと気持ち的には傾きかけているのですが・・・、その前に皆様のお力をお借りしようかと思いまして。。。

なにか良い方法等ありましたお力をお貸しください。
よろしくお願いします。


特攻隊長まるるう  2005-02-21 18:45:10  No: 119767

SQL文のみの質問ならデータベース関連の掲示板で質問しましょう。

>      B.ITEM IN (:アイテム)
SQL文はただの文字列ですので、このままの形で『アイテム』に
複数のパラメータを設定する事はできないと思います。アイテム数
に応じてSQL文を
      B.ITEM IN (:アイテム1, :アイテム2, ・・・)
と編集して Parameters.Add の数を変えるように対応すれば
できるんじゃないでしょうか?。


もも  2005-02-22 00:55:47  No: 119768

特攻隊長まるるう様、ご回答ありがとうございます。

>SQL文のみの質問ならデータベース関連の掲示板で質問しましょう。
すみません、OO4Oを利用したSQL文の発行結果の取得に関しての問題でしたので
こちらの掲示板で質問をあげさせて頂きました。

>>      B.ITEM IN (:アイテム)
>SQL文はただの文字列ですので、このままの形で『アイテム』に
>複数のパラメータを設定する事はできないと思います。アイテム数
>に応じてSQL文を
>      B.ITEM IN (:アイテム1, :アイテム2, ・・・)
>と編集して Parameters.Add の数を変えるように対応すれば
>できるんじゃないでしょうか?。

特攻隊長まるるう様が言われている通り、SQL文を書き直すことが出来ると
簡単に解決が可能なのですが、前提条件にも書いた通り

>・パフォーマンスの関係上SQL文の形式を書き換えたり固定値を持たすことはせずバインド変数を使用するきまりです。

こちらの「SQL文の形式を書き換えたり」の部分には、バインド変数の個数を増やすことも含まれております。
言葉足らずの説明をお書きして申し訳ありません。

上記のような考えから、一つのバインド変数に対して複数の条件を持たす方法がないか考えておりました。

しかし、特攻隊長まるるう様が仰る通り一つのバインド変数には一つの条件しか持たすことしかやはり出来ないのだろうと考え
正常系のSQL文を複数回実行する方法で対応したいと思います。

本質問にご回答いただきありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加