

ストアドプロシージャ(A)から他のストアドプロシージャ(B)を呼び出し、 (B)内で呼び出したselect文の結果を、(A)内で受取りたいと考えています。
そもそもこれは可能なのでしょうか。

(B)を修正せずに、対応する方法((A)の書き方)を教えてください。

(B)は他社提供のプロシージャで変更できないような場合を想定してください。

具体的には、次のようなプロシージャ(B)があり、

[code]

    delimiter $
    create procedure proc_B()
    begin
        declare value int;
         /*(省略)*/
        select value;
    end$
    delimiter ;
    
[/code]

このプロシージャを別のプロシージャ(A)から呼び出し、上記の変数valueの値を受取りたい。

[code]

    delimiter $
    create procedure proc_A()
    begin
        declare value int;
    
        /* 呼び出すだけなら、これで良い。*/
        /* ただし(A)の呼び出し元へ直接select結果が戻される。 */
        call proc_B;
    
        /* 通常のカーソルの様にに宣言するとsyntaxエラーになる */
        declare cur cursor for proc_B;
    
        /* これもsyntaxエラー。 */
        /* またこれでは複数行返るパターンに対応できない。 */
        call proc_B into value; 
    
    end$
    delimiter ;
    
[/code]


CC BY-SA 3.0
2014-12-19T04:38:22.880
2096
2014-12-24T01:06:28.720
2014-12-24T01:06:28.720
5158
5158
question
mysql
MySQLのストアドプロシージャ内で呼ばれたselect文の結果を、ストアド内で受取る方法


[本家SO](https://stackoverflow.com/a/11000907/4037) にこんな答えがありました。

呼ばれる側のプロシージャに OUT パラメータを付けて、

[code]

    CREATE PROCEDURE innerproc(OUT param1 INT)
    BEGIN
       insert into sometable;
       SELECT LAST_INSERT_ID() into param1 ;
    END
    
[/code]

と定義すれば、

[code]

    CREATE PROCEDURE outerproc()
    BEGIN
        CALL innerproc(@a);
        SELECT @a INTO variableinouterproc FROM dual;
    END
    
[/code]

と書くことによって、`@a` に `innerproc` の結果が入るようです。


CC BY-SA 3.0
2014-12-19T06:21:10.883
2108
2014-12-19T06:21:10.883
2017-05-23T12:38:55.250
-1
41
2096
answer


> 通常のカーソルの様にに宣言するとsyntaxエラーになる

もし、カーソルのように複数行を扱いたいのであればですが、MySQL のサーバサイドカーソルは実質テンポラリテーブルのようなものだと聞いたことがあります。

  * <http://dev.mysql.com/doc/refman/5.6/en/cursor-restrictions.html>

だったら、いっそのことテンポラリテーブルを使ってしまってもいいんじゃないかと思います。

[code]

    delimiter $
    
    create procedure proc_B()
    begin
        /* 結果を返すためのテンポラリテーブル */
        drop table if exists proc_B__result;
        create temporary table proc_B__result as
            select 1 union all select 2;
    end$
    
    create procedure proc_A()
    begin
        declare value int;
    
        /* テンポラリテーブルを走査するカーソル */
        declare cur cursor for select * from proc_B__result;
    
        /* プロシージャを実行して結果をテンポラリテーブルに挿入 */
        call proc_B();
    
        /* カーソルを開いて複数行の結果を fetch してみる */
        open cur;
        fetch cur into value;
        fetch cur into value;
        close cur;
    end$
    
    delimiter ;
    
    call proc_A();
    
[/code]


CC BY-SA 3.0
2014-12-19T08:28:37.337
2122
2014-12-19T08:28:37.337
2494
2096
answer