前提・実現したいこと
ここに質問の内容を詳しく書いてください。
Laravelからstored procedure(mysql)をcallした場合,以下のケースでは、結果がとれない。
laravel: 5.7.28, php 7.4.1, mysql 8.0 or 5.7.24
2つのプロシジャを用意する。
- call_curdemo (@o_stored_proc_name,@o_ret_inf,@o_ret) ---> curdemoをcallするだけのwrapperプロシジャ(うまくいかないケース)
- curdemo(@o_stored_proc_name,@o_ret_inf,@o_ret) ---> cusor openを使用したプロシジャ (うまくいくケース)
1)間接call: $logs = DB::statement('call call_curdemo(@o_stored_proc_name,@o_ret_inf,@o_ret)');
outがとりだせないケース。
--> @logs = true - 正しい null - 不正 null - 不正 null ー 不正
発生している問題・エラーメッセージ
調査したところ、cursor openが exception エラーとならずエラー復帰しているようだった。
⇒原因不明。エラー情報がどこにもなく調査できず。調査方法と、原因、対応策を教えてください。
- うまくケース
2)単独call : call curdemo(@o_stored_proc_name,@o_ret_inf,@o_ret)
$logs = DB::statement('call curdemo(@o_stored_proc_name,@o_ret_inf,@o_ret)');
$result = DB::select('SELECT @o_stored_proc_name AS o_stored_proc_name,@o_ret_inf AS o_ret_inf, @o_ret AS o_ret');
dump($logs);
dump($resul);
result[0]->o_stored_proc_name);
dump($result[0]->o_ret_inf);
dump($result[0]->o_ret);
--> @logs = true "curdemo" -- 正しい値 5 -- 正しい値 5 -- 正しい値
単独callでは結果はとれる。
エラーメッセージ
該当のソースコード
mysql
1 2ソースコード 31) 本体 4DROP PROCEDURE IF EXISTS curdemo; 5DELIMITER // 6CREATE PROCEDURE curdemo(OUT proc_nm varchar(64),OUT a int,OUT b int) 7BEGIN 8 DECLARE done INT DEFAULT FALSE; 9 DECLARE cur1 CURSOR FOR SELECT id,return_code FROM test_tbl; 10 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 11 set proc_nm = 'curdemo'; 12 13 OPEN cur1; 14 15 read_loop: LOOP 16 FETCH cur1 INTO a, b; 17 IF done THEN 18 LEAVE read_loop; 19 END IF; 20 END LOOP; 21 22 CLOSE cur1; 23END// 24DELIMITER ; 25 26-- ------------------------------- 27call curdemo(@proc,@a,@b); 28select @proc,@a,@b; 29 302)wrapper 31DROP PROCEDURE IF EXISTS call_curdemo; 32DELIMITER // 33CREATE PROCEDURE call_curdemo(OUT proc_nm varchar(64),OUT a int,OUT b int) 34BEGIN 35set proc_nm = 'call_curdemo'; 36call curdemo(@proc,@a,@b); 37select @proc,@a,@b; 38set a = @a; 39set b = @b; 40END// 41DELIMITER ; 42 43-- ------------------------------- 44call call_curdemo(@proc,@a,@b); 45select @proc,@a,@b; 46 47### 試したこと 48 49ここに問題に対して試したことを記載してください。 50 - JDBC 経由でアクセスしたが、いずれもOK 51 - PHPでPDO経由でアクセスしたが、いずれもOK 52 53 54 55### 補足情報(FW/ツールのバージョンなど) 56 57 laravel: 5.7.28, php 7.4.1, mysql 8.0 or 5.7.24
あなたの回答
tips
プレビュー