• ベストアンサー

ストアドプロシージャーの引数をSELECT文のINに使うには

店舗コードを引数で受け取り、店舗名称を複数返すストアドプロシージャーを作成中です。 CURSOR c_StoreName (MchrCd IN VARCHAR2) IS Select 店舗略称 AS 店名 From 店舗マスタ  Where 店舗コード IN NVL(MchrCd,店舗コード) 引数の店舗コードは、複数可能としています。 よって、MchrCd は、下記のパターンで試してみましたが、うまくSelectできない場合があります。 どのように、SQLをかいたらよいか教えてください。 結果は以下のとおりです。 1).1店舗のとき   001   → OK 2).1店舗のとき   '001'    → NG 3).2店舗以上のとき 001,002    → NG 4).店舗コードなし  ''   → OK

  • Oracle
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
回答No.3

テーブル上の店舗コードがVARCHAR2(3)なのでしょうか? 最も簡素な解決は、 where MchrCd like '%'||店舗コード||'%' or MchrCd is null; とすれば、それなりです。 効率が悪いのと、パラメータ次第で、誤動作しますけどね。 パラメータの指定様式を厳格化し、動的SQLを使のが、 最も正しい解決だとは思いますが。

sayabuu
質問者

お礼

早速、いただいた where MchrCd like '%'||店舗コード||'%' or MchrCd is null; を、試してみました。思うとおりの結果が出ました!(^^)! 動的SQLも検討してみます。動的SQLってなんだろうというところからの勉強ですが、がんばってみます。 ありがとうございました

その他の回答 (2)

  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.2

パラメータの個数が変わる場合にSQLは埋め込めません。動的SQLにする必要があります。

sayabuu
質問者

お礼

ありがとうございました。 動的SQLを検討してみます。 勉強不足で、動的SQLがどんなものかわかっていません。もしご存知でしたら、参考などないでしょうか?

回答No.1

こんにちは。 プロシージャの引数の前に・・・、 NVL関数の引数で、MchrCdが複数になったらおかしいですよね? 全体がつかめないのであれなんですが・・・。 (^^ゞ

sayabuu
質問者

お礼

ありがとうございます(^^) そういわれればそうですよね。気がつかなくって(^^ゞ

関連するQ&A

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

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

    • ベストアンサー
    • MySQL
  • ストアドプロシージャについて

    Access2003とSQL Server2005Expressです。 初歩的な質問で恐縮です。 以下のストアドプロシージャのデータ取得先を、テーブルではなく 別のストアドプロシージャにしたいのですが、 その方法がわかりません。 CREATE PROCEDURE テスト AS SELECT コード, 社名, 住所, 電話 FROM 名簿     ↑     これをテーブルではなく、別のストアドプロシージャを     指定したのですが・・・。     ここをストアドプロシージャ名にするとエラーになります。     どうすればよろしいでしょうか?

  • .NETからストアドプロシージャを実行

    VB.Netからストアドプロシージャを実行するプログラムの書き方がよく分かりません。 データベースはOracleです。 PROCEDURE test(aaa IN number, bbb IN varvhar2, ccc IN OUT varchar2); といったPL/SQLをVB.NET上で実行するとします。 (略:データベースへの接続処理) strSql = "begin test(10, 'テスト', '');end;" 結果「式が割り当てられていません」とエラーが出ます。 すべての引数がINのプロシージャでは、上記の方法で実行できたので、IN OUTへの引数の渡し方に問題があると思うのですが、どうしても分かりません。 まだ使い始めたばかりで、どうしていいかまったく分からない状態です。 どうかご指導お願い致します。

  • MySQL5.0のストアドプロシージャで引数の使い方がわからなくて困っています。

    MySQL5.0のストアドプロシージャで引数の使い方がわからなくて困っています。 ストアドプロシージャで IF文で引数の空の判定と、 LIKE '%name%'にその引数を使いたいのです。 どなたかわかるかたいらっしゃいませんか? □プログラムからコールする strSQL = "CALL buttonaction_proc2(syohinCd, syohinCdLast, name, count) "; □ストアドプロージャ delimiter // CREATE PROCEDURE buttonaction_proc2(IN syohinCd INT(8), IN syohinCdLast INT(8), IN name VARCHAR(40), IN count INT(8)) IF ((syihinCd IS NOT NULL) OR (syohinCdLast IS NOT NULL) OR (name IS NOT NULL)) THEN AND (SYOHIN_CD BETWEEN syohinCd AND syohinCdLast) ELSE (IF syohinCd IS NOT NULL) THEN AND (SYOHIN_CD BETWEEN syohinCd AND count) ELSE IF (syohinCdLast IS NOT NULL) THEN ( AND (SYOHIN_CD BETWEEN 1 AND syohinCdLast) ) IF (name IS NOT NULL) THEN AND NAME LIKE '%name%' END IF END IF ORDER BY SYOHIN_CD; END //

  • ストアドプロシージャ作成時のエラーについて

    お世話になっております。 CREATE PROCEDURE AAA (IN param INT) BEGIN SELECT CD, NAME FROM TBL WHERE TBL_KEY = param; END INTEGER型の引数を渡してVARCHAR型のCD、NAMEを取り出す程度のストアドプロシージャを作成しようとすると 1303 - Can't create a PROCEDURE from within another stored routine. なるエラーが表示されて作成ができません。 このエラーの理由についてコメント頂ければ幸いです。

    • ベストアンサー
    • MySQL
  • ストアドプロシージャの作成

    MySQLでストアドプロシージャを作成しようと試みているのですが、 分からない事があります。 引数に、テーブルのカラムを指定したいんです。 具体的には、 func(column1, 100) などとして、 select * from table where finc func(column1, 100) > 1000 tableのcolumn1には数字が入っていて、引数の100と計算をして、 1000より大きい結果を返す・・・ みたいな感じです。

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

    はじめまして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'" のような可変の文字列を設定しストアドプロシージャを実行できますでしょうか? よろしくお願いします。

  • MYSQL ストアドプロシージャの記述方法

    MYSQLのストアドプロシージャについて分からないことがあり質問させて頂きます。 SQLのwhere句の部分を引数によって条件分で変更させたいと考えています。そこでORACLEの場合は変数にいれて最後に明示的にSQLを発行して いたので可能だったのですが、MYSQLの場合はどういった記述になる のかわかりません。やりたいことは下記のような感じです。 ORACLEの場合は procedure prctest(pc out refcur,a in varchar2,b in varchar2) is sqldata varchar2(1000); whereinfo varchar2(1000); begin sqldata := 'select ID , NAME from testTbl '; if (a IS NOT NULL) then   whereinfo := whereinfo || ' acol = a ' ; end if; if (b IS NOT NULL) then   if (whereinfo IS NOT NULL) then  whereinfo := whereinfo || ' and ';   end if;   whereinfo := whereinfo || ' acol = b ' ; end if; if (whereinfo IS NOT NULL) then  sqldata := sqldata || ' where ' || whereinfo ; end if; open pc for sqldata; (ここでSQLが入ったSQLを発行) end prctest; (抜粋) ストアドをあまり使用したことがなく良い説明ではないかも しれませんが、アドバイスの方頂けたらと思います。 よろしくお願いします。

  • ストアドプロシージャについて

    お世話になります。 SQLServseのストアドプロシージャで、あるテーブルのテストデータを100件ほど作成したいと思っています。 しかし、プロシージャを実行すると「プライマリキーが重複しています」とエラーが出ます。 テーブル内にはすでにCODE='0001'と'0101'の2件が存在します。そのため挿入開始コードは'0002'としたのですが・・・。まだ同じエラーが発生します。 テーブル名:MST_USER  CODE char(4) ←キー  KBN  char(2)  NAME varchar(40)  PASS varchar(10) 作成したプロシージャ CREATE PROCEDURE dbo.test_update_USER AS declare @count int declare @kbn int set @count = 2 set @kbn = 0 while 1 = 1 begin update MST_USER set CODE = right('0000' + ltrim(str@count)), 4), KBN = right('00' + ltrim(str(@kbn)), 2), NAME = 'test' + ltrim(str(@count)), PASS = 'test' + ltrim(str(@count)) set @count = @count + 1 if (@count > 100) break if (@kbn > 3) set @kbn = 0 else set @kbn = @kbn + 1 end GO 何か間違えているのか自分ではわからなくなっている状態です。 どなたかご指摘いただけると幸いです。

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

    参考の通りに、ストアドプロシージャ作成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