mqsql 儲存過程 游標只迴圈一次
針對mysql儲存過程,游標只迴圈一次就退出的場景,可能原因分析:
(1)儲存過程有問題(仔細檢查語法、控制變數、條件等等)
(2)保證儲存過程正確。呼叫過程異常(即游標失效):
可能因為迴圈體內的sql語句使用了select語句,如果有乙個select語句查詢結果為空時,迴圈就會結束!
那麼,想要迴圈繼續,需要在每個select語句後重置迴圈標誌位為0,讓它繼續迴圈下去......
如下儲存過程 語句(更正後):
1mysql儲存過程經典坑之一。delimiter $$
2drop
procedure
ifexists
`demo`$$
3create definer=`root`@`%` procedure `demo`(in para_product_id varchar(32), in para_cycle_id varchar(32))4
begin
5# 宣告變數
6declare var_call_type int
default0;
7declare var_fee_rate int;8
declare var_fee_unit int;9
declare var_np_id varchar(36
);10
# 游標迴圈控制變數
11declare done int
default0;
12# 宣告游標
13declare idcur cursor
forselect
call_type, np_id, fee_unit, fee_rate
14from
cfg_fee_rate
15where product_id = ifnull(para_product_id, '
0000')
16order
bylevel
desc;17
declare
continue handler for
not found set done =1;
1819
# 開啟游標
20open
idcur;
21# 迴圈開始
22repeat
23fetch idcur into
var_call_type, var_np_id, var_fee_unit, var_fee_rate;
24if
not done then
25# 第乙個select語句
26select fee_rate, fee_unit into var_fee_rate, var_fee_unit from
cfg_np_rate
27where np_id = ifnull(var_np_id, '
none
') order
by call_type desc limit 1;28
set done =
0; # 這裡很關鍵::因為如果select查詢不到資料項直接退出迴圈
29# 第二個select語句
30select fee_rate, fee_unit into var_fee_rate, var_fee_unit from
cfg_np_rate
31where np_id = ifnull(var_np_id, '
none
') and (1
= call_type or'1
'=call_type);
32set done =
0; # 這裡很關鍵::因為如果select查詢不到資料項直接退出迴圈
33# .... 其他語句
34endif;
35 until done end
repeat; # 迴圈結束
36close
idcur; # 關閉游標
37end
$$38
39 delimiter ;
追加 解釋圖如下:
儲存過程。
good good study, day day up.
順序 選擇 迴圈 總結
MySql 儲存過程 游標只迴圈一次
mqsql 儲存過程 游標只迴圈一次 針對mysql儲存過程,游標只迴圈一次就退出的場景,可能原因分析 1 儲存過程有問題 仔細檢查語法 控制變數 條件等等 2 保證儲存過程正確。呼叫過程異常 即游標失效 可能因為迴圈體內的sql語句使用了select語句,如果有乙個select語句查詢結果為空時,...
儲存過程 游標巢狀迴圈
alterprocedure dbo asdeclare startnum nvarchar 255 declare endnum nvarchar 255 declare insurancetype nvarchar 255 declare company id nvarchar 255 decl...
mysql 游標 儲存過程
1.首先需要注意的是mysql中游標必須要建立在儲存過程中 2.直接上sql 查詢當天資料 select in flow out flow from water meter data where 1 1 and date sys read time curdate 1 order by in flo...