• ベストアンサー

プロシージャーに動的にパラメータを与えたい

VB.netからプロシージャーを呼び出してます。 SQLで、inの中などで、動的にパラメータを与えたいです。 Select * from TableX where koumoku1 in (1,2,3,5,10) 例えば上の1,2,3,5,10 をパラメータとして外部から与えたいのですが、 プロシージャー側の実装としては、どのような方法があるのでしょうか? パラメータの与え方は、 x = "1,2,3,5,10" のように1つの文字列でも良いし x[0]=1,x[1]=2,x[2]=3,x[3]=5,x[4]=10 のように配列みたいな形でも良いです。 よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2
evaan
質問者

お礼

返事が遅くなりました。 無事解決しました。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.3

プロシージャの実装方法ですよね? こちらの例のように、配列で受け取って表関数を使用するようにしてはいかがでしょうか。 http://www.shift-the-oracle.com/plsql/table-function/collection-unnesting.html

evaan
質問者

お礼

ご回答、どうもありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

文字列で生成しているなら、SQL文をそのように出来上がるように加工すればいいのではないでしょうか。 プレースホルダ―を利用している方法では、SQL文を生成する際に、パラメータ数を考慮してSQL文を生成し、 その数分、Parameters.Add()すればいいと思います。

evaan
質問者

補足

SQLをvbで作る場合は、加工すればよいですが、 出来上がっているプロシージャーを呼ぶ形です。 引数に"1,2,3" と与えると、 「1,2,3」と言う1つの物に一致するかどうかで判断されています。 そのため、うまく行ってません。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ストアドプロシージャを実行時のパラメータについて

    はじめましてkou2000と申します。SQLServer2000でストアドプロシージャを作成していますがうまくいきません。 下記のようなことが実際にできるかご教授ください。 CREATE PROCEDURE TEST_PROCEDURE @SYUBETU nvarchar AS SELECT AAAAAAA INTO ##TMP FROM TEST WHERE BBBB IN (@SYUBETU) GO 上記のようなストアドプロシージャを作成しプログラムから実行する際に @SYUBETU = "'1','2','3','4','5'" のような可変の文字列を設定しストアドプロシージャを実行できますでしょうか? よろしくお願いします。

  • sedに関する質問

    ★以下のファイルがあるとします。 SQL> select count(*) from koumoku where no = 1052 and mid =2; COUNT(*) ---------- 7 SQL> select count(*) from koumoku where no = 1053 and mid =3; COUNT(*) ---------- 4 SQL> select count(*) from setumei where no = 1054 and mid =2; COUNT(*) ---------- 9 SQL> select count(*) from setumei where no = 1055 and mid =7; COUNT(*) ---------- 5 SQL> select count(*) from imi where no = 1056 and mid =2; COUNT(*) ---------- 9 SQL> select count(*) from imi where no = 1057 and mid =6; COUNT(*) ---------- 3 ★ここでsedコマンドを利用して、 koumoku COUNT(*) ---------- 7 koumoku COUNT(*) ---------- 4 setumei COUNT(*) ---------- 9 setumei COUNT(*) ---------- 5 imi COUNT(*) ---------- 9 imi COUNT(*) ---------- 3 のように取り出したいのですが、方法が分からないので、 誰か教えてもらえますか?宜しくお願いします。

  • MYSQLでストアドプロシージャの引数を二つ

    MYSQL初心者で参考書にかじりついてプログラミングしています。 主にDBの内容をPHPで吐き出させるといった使い方をしています。 SQL文があまりにも長ったらしくなってきたのでストアドプロシージャを使いたいのですが、使っているSQL文が (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.') UNION (SELECT * FROM .変数. WHERE .変数. LIKE '.変数.'); となっており、引数を複数使えないとスッキリさせられない状況です。 ストアドプロシージャで複数の引数を設定することはできないのでしょうか?

    • ベストアンサー
    • MySQL
  • 多くの選択項目を処理(SELECT)するストアド

    多くの選択項目を処理(SELECT)するストアド とあるデータ検索において、選択項目が10項目以上あり各項目の値をパラメータとして受取り、 該当データを返すストアドを検討しています。 項目が省略された場合は Null値がパラメータとして入ってきて、その項目は条件から除外します。 (全ての項目が省略されたら、全てのレコードが返される)下記の様な方法を考えています・・・ ----------------------------------------------------------------- if @para1 is null  if @para2 is null   if @para3 is null    select * from TBL   else    select * from TBL where koumoku3 = @para3  else   if @para3 is null    select * from TBL where koumoku2 = @para2   else    select * from TBL where koumoku2 = @para2 and koumoku3 = @para3 else  if @para2 is null   if @para3 is null    select * from TBL where koumoku1 = @para1   else    select * from TBL where koumoku1 = @para1 and koumoku3 = @para3  else   if @para3 is null    select * from TBL where koumoku1 = @para1 and koumoku2 = @para2   else    select * from TBL where koumoku1 = @para1 and koumoku2 = @para2 and koumoku3 = @para3 ------------------------------------------------------ 三つでも面倒なのに10項目以上では考えられません。 こんな時どのように作り込めばいいのでしょうか 動的ストアドにして where文自体を編集した物を渡す事も考えましたが、 エクセル出力時のパラメーター長の制限(?)で断念しました。 省略されなかった項目だけでデータを選択したいような事は多々あると思うのですが、 そんな時のオーソドックスは方法はどんな方法なんでしょうか? よろしくお願いします。

  • ASP.NETのIN句のパラメータについて

    ASP.netでの質問です。データセットを作成し、テーブルアダプタにて メソッドを作成しました。がsqlでIN句でパラメータを指定すると エラーがでます。DBはoracleです。 select * from table where param IN (:param) パラメータは可変長でいくつでるか分かりません。 中の値は(値1,値2,値3)という感じです。 IN句が使えないと他にどうすればよいでしょうか?

  • パラメータ

    Cmd.commandtext="select * from stb where id =?" コマンドテキスト以外でパラメータを使用することが できますか?

  • SQLファイルでのパラメータ指定の方法

    いつもお世話になっております。 以下のようなスクリプトを含むSQLファイルで「1234」を何回も記述したくないので、スクリプト上部で1回パラメータ指定する書き方をご教授願います。実行はSQLServerのクエリアナライザで行いたいです。 SELECT * FROM 顧客 WHERE 会社CD=1234; SELECT * FROM 商品 WHERE 会社CD=1234; よろしくお願いします。

  • VB6 + OO4O プロシージャの実行&複数行を受け取る方法

    VB6 + OO4O プロシージャの実行&複数行を受け取る方法 現在、VB6でOracleデータベースを操作しようと試みている最中で、 OO4Oで接続しています。 (表現誤っているかもしれません。。。) Oracleは今回初めてで、今まではSQLserverだったのですが、 SQLserverで、  1.ストアドを実行(パラメータあり)  2.レコードセット(複数行)を受け取る  3.ループで全件処理   ・・・ というような処理をしていました。 たとえば、あるテーブルの、ある条件に一致したレコード(複数あり)を全件取得 など。 「引数を渡してストアドプロシージャを実行し、複数行を結果として受け取る」ということがしたく、 Oracleでどのように実現させるかを調べてみたのですが、 「SQL文を記述し、受け取る」  例)strSQL = "select * from tbl"    Set OraDynaset = OraDatabase.CreateDynaset(strSQL, 0) というようなサンプルしか見つけられませんでした。 where句で条件を記述すれば同じなのかもしれませんが、 そういったこまごました記述をストアドプロシージャに記載しておき、 呼び出す際はパラメータだけ指定する、ということを想定しています。 ストアドを実行するサンプルは複数見つけたのですが、戻り値が1つのみか、戻り値なしのもので、 複数行を結果として受け取るようなサンプルが見あたりませんでした。 ストアド(PL/SQL)も作成してみたのですが、 単純に  select * from TBL; とするとエラーで、  select * BULK COLLECT INTO vTBl from TBL;  for i in 1 .. vTBl.count loop   -- 全レコードの項目「name」を表示する。   dbms_output.put_line(vTBl(i).name);  end loop; というように1件1件処理させていく方法しか見つけれませんでした。 Oracleのストアドは、今までのSQLServerの考え方はいけないのでしょうか? 調べるとしたら、どのような単語で調べたらよろしいでしょうか? 「VB6」「oo4o」「複数行」「プロシージャ」など、いろいろ努力はしたつもりなのですが。。。 ご指導よろしくお願いいたします。

  • ストアドファンクション⇒プロシージャ呼出し失敗する

    参考の通りに、ストアドプロシージャ作成SQL文を発行し、 コマンドライン上からは、以下の通りの結果1となり、 レコードがinsertされます。 <結果1> mysql> call logger('ほげ', 'ホゲ'); Query OK, 1 row affected (0.01 sec) mysql> select * from PROCEDURE_LOG; +--------+--------+---------------------+ | NAME | QUERY | EXECUTE_DATE | +--------+--------+---------------------+ | ほげ | ホゲ | 2014-03-26 10:41:26 | +--------+--------+---------------------+ 1 row in set (0.00 sec) ですが、testというストアドファンクションから呼び出してみましたが、 以下の結果2の通り、失敗します。 <結果2> mysql> select test(); ERROR 1336 (0A000): Dynamic SQL is not allowed in stored function or trigger <test> BEGIN CALL logger('test','1'); RETURN CONCAT('END'); END 現在動作している環境では、どこでエラーが発生したかがわからず、 ロガーの処理をなんとしても実装したいのですが、 いろいろ試してみても、解決できませんでした。 ご教示のほど、よろしくお願いします。 <参考> http://treeapps.hatenablog.com/entry/20120106/p1 <ストアドプロシージャ作成SQL文(logger)> SET NAMES UTF8; delimiter // -- ログ出力 DROP PROCEDURE IF EXISTS logger// CREATE PROCEDURE logger( IN PROCEDURE_NAME TEXT, IN SQL_TEXT TEXT ) BEGIN DECLARE CNT INT; CREATE TABLE IF NOT EXISTS PROCEDURE_LOG ( NAME VARCHAR(64), QUERY TEXT, EXECUTE_DATE TIMESTAMP, KEY IDX1 (NAME, QUERY(64), EXECUTE_DATE) ) ENGINE=MYISAM DEFAULT CHARSET=UTF8; -- 古いログを削除 SELECT COUNT(*) INTO CNT FROM PROCEDURE_LOG; IF CNT >= 1000 THEN DELETE FROM PROCEDURE_LOG LIMIT 1; END IF; -- テーブルにログを記録 SET @sql = CONCAT('INSERT INTO PROCEDURE_LOG VALUES (', QUOTE(PROCEDURE_NAME), ',', QUOTE(SQL_TEXT), ', null)'); PREPARE stmt FROM @sql; EXECUTE stmt; END // delimiter ;

    • ベストアンサー
    • MySQL
  • ストアドプロシージャの条件分岐に関して

    お世話になります。 以下の環境で開発を行っています。 言語:C#(.NET 2008) DB: SQL Server 2008 C#で作成した画面にて入力された値をパラメータで ストアドプロシージャに渡し、その値がNULLでない場合だけ WHERE句にレコード絞り込み条件を与えるSQL文を 考えているのですが、記述方法がわかりません。 (プロシージャ) --------------------------------------------- DECLARE @param1 = ''  -- 画面から渡されるパラメータ1 @param2 = ''   -- 画面から渡されるパラメータ2 SELECT * FROM TABLE1 A, TABLE2 B    -- (1) IF @param1 IS NOT NULL AND @param2 IS NOT NULL    -- ここから WHERE A.COLUMN1 = @param1 AND A.COLUMN2 = @param2 ELSE IF @param1 IS NOT NULL AND @param2 IS NULL WHERE A.COLUMN1 = @param1 ELSE IF @param1 IS NULL AND @param2 IS NOT NULL WHERE A.COLUMN2 = @param2              -- ここまで (2) AND A.COLUMN1 = B.COLUMN1       -- (3) AND A.COLUMN2 = B.COLUMN2      -- (4)   ------------------------------------------------ 上記の(1)から(4)までをうまく1つにまとめたかたちで記述することができません。 特に上記(2)の効率のよい正しい記述方法がわかりません。 どなたかご教授願えますか? よろしくお願いいたします。