MySql 儲存過程 游標只迴圈一次

2022-06-02 10:57:11 字數 2216 閱讀 3447

mqsql 儲存過程 游標只迴圈一次

針對mysql儲存過程,游標只迴圈一次就退出的場景,可能原因分析:

(1)儲存過程有問題(仔細檢查語法、控制變數、條件等等)

(2)保證儲存過程正確。呼叫過程異常(即游標失效):

可能因為迴圈體內的sql語句使用了select語句,如果有乙個select語句查詢結果為空時,迴圈就會結束!

那麼,想要迴圈繼續,需要在每個select語句後重置迴圈標誌位為0,讓它繼續迴圈下去......

如下儲存過程 語句(更正後):

1

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 ;

mysql儲存過程經典坑之一。

追加 解釋圖如下:

儲存過程。

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...