• 締切済み

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

MySQL5.6のストアドプロシージャが返すSELECT結果のフェッチ方法について教えてください。 delimiter $ create procedure sample_proc() begin select * from TEST_TBL; end$ の様なストアドプロシージャがあり、これを他のストアドプロシージャから呼び出して、 ループしながらフェッチしたいのですが、どうすればよいでしょうか。

  • MySQL
  • 回答数2
  • ありがとう数9

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

失礼しました CALLしたプロシージャの結果をOUTを利用せずに使いたいのですね? プロシージャから他のプロシージャを呼び出すことはできますが 呼び出すプロシージャ内で行っているSELECTは結果ではなく経過でしかないため SELECT文のようにカーソルでは受けられないですね。 書式的にもカーソルはSELECT文しかうけつけません http://dev.mysql.com/doc/refman/5.1/ja/declare-cursors.html

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

いまいち論点がわかりません。 普通に他のプロシージャ内から該当のプロシージャをコールすればよいのでは?

draqoon2014
質問者

補足

プログラム全体として以下の構成だと思ってください。  (1)内部でselect文を実行しているストアドプロシージャ(元質問内の例参照)  (2)(1)を呼び出し、その結果を利用して処理するストアドプロシージャ  (3)(2)を呼び出すクライアントプログラム 質問としては(2)の作り方((1)の結果の利用方法)を知りたかったのです。 普通にできる話なのかもしれませんが、具体的な方法が知りたいのです。

関連するQ&A

  • ストアドプロシージャが作成されない

    ●質問の主旨 phpMyAdminのMySQLで ストアドプロシージャの動作確認をしています。 試しに、 delimiter // create procedure pr30() begin select * from tb; select * from tb1l; select * from tb1; end // delimiter ; というプロシージャを作成して、 実行を押しても、画面が全く変化しません。 エラーの表示さえされません。 (もちろんデータベーステーブルのtb、tb1l、tb1が 存在することは確認済みです) また、作成している最中に、 命令文が勝手に消えることもあります。 普通に select * from tb; と、書いていても消えることはないのですが…。 この現象や対策についてご存知の方がいらっしゃいましたら、 アドバイスをお願いします。 ●環境 windows8 xammp1.8.1 phpMyAdmin3.5.2.2 MySQL5.5.27

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

    お世話になっております。 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
  • ストアドプロシージャについて

    アドバイスを頂けたらと思います。 php   5.1.6 mysql   5.0.22 接続方法 PDO PHPよりストアドプロシージャを実行するとEXCUTEの部分で応答がなくなりMYSQLの SHOW PROCESSLIST を確認するとそのプロセスがSleep になってしまっています。 記述方法が間違っているか、またはどこか設定するのか、参考意見を 頂ければと思います。 PHP側 <?php try { $user = 'sys'; $pass = 'sys'; $dbh = new PDO('mysql:host=localhost;dbname=testDB', $user, $pass); if ($st = $dbh->prepare("CALL Listget()") ){ $st->execute(); while ($row = $st->fetch()) { print_r ($row); } } } catch (PDOException $e) { print 'Error: ' . $e->getMessage(). "\n"; } $dbh = null; ?> ストアド delimiter // CREATE PROCEDURE Listget ( ) BEGIN SELECT id FROM testTbl; END // よろしくお願いします。

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

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

    phpMyAdminからストアドプロシージャを作成したいのですが、エラーが表示され作成できません。 DELIMITER // CREATE PROCEDURE proc1(INT pa char(10)) BEGIN update sum_table set blank = pa; END; // DELIMITER ; これを実行したところ以下のエラーが出ました。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT pa char(10)) BEGIN update sum_table set blank = pa; END' at line 1 -------------------------------------------------------------------------------- そこでソースから「DELIMITER」を消してもう一度実行してみました。 CREATE PROCEDURE proc1(INT pa char(10)) BEGIN update sum_table set blank = pa; END; すると今度は以下のエラーが表示されました。 #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INT pa char(10)) BEGIN update sum_table set blank = pa' at line 1 どこが間違っているかわからず困っております。 初歩的な質問で凝縮ですが、どなたかご教示いただけますでしょうか?

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

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

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

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

    • ベストアンサー
    • MySQL
  • php×postgresでのストアド利用について

    postgresで作成済みの手続き(ストアド)をphpから呼び出し結果を取得したいです。 ■スキーマ CREATE SCHEMA test AUTHORIZATION postgres; ■テーブル CREATE TABLE test.tbl1 ( item1 char(1), item2 int4 ) WITHOUT OIDS; ■ストアド CREATE OR REPLACE FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) AS $BODY$declare begin select current_date + in_para1 into ot_para1; select tablename from pg_tables into ot_para2; select * from test.tbl1 into ot_para3; end;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION test.proc1(IN in_para1 int2, OUT ot_para1 date, OUT ot_para2 date, OUT ot_para3 date) OWNER TO postgres; サンプル的に下準備をしました。 この後、php側でこのストアドを呼び出すコードを教えて下さい。

    • ベストアンサー
    • PHP
  • 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 //

  • ストアドについて質問

    質問をご覧いただきまして有難うございます。 初めてストアドプロシージャを作成しており、サンプルでいろいろと作ってみようと思い、作成コードを実行しようとしたんですが、以下のようなメッセージが表示され、正常に実行できません。 ORA-00001: 一意制約(OES4.PK_SITT_IKO_LOG)に反しています ORA-06512: "OES2.PRA002",行16 ORA-06512: 行4 以下はストアドです。 CREATE OR REPLACE PROCEDURE PRACTICE001 IS BEGIN DECLARE --ループ CNT NUMBER; BEGIN CNT := 0; LOOP EXIT WHEN CNT >= 10; CNT := CNT + 1; insert into LOG_TBL values(systimestamp,'test','comments are...'); END LOOP; END; END; テーブル(LOG_TBL)定義は次のようになっています。 LOG_TIME timestamp NOT NULL COMMENT1 varchar2(20) COMMENT2 varchar2(200) タイムスタンプであれば重複もないと思うんですが。。。 原因がよくわからないです。。。 宜しくお願い致します!