原文戳我
剛剛,使用儲存過程的時候遇到了乙個問題,我在儲存過程內使用游標去遍歷 擁有角色的使用者,然後去生成根據使用者id生成每日統計記錄。
1
2
declare
cur
cursor
for
(
select
v_user_id
from
v_user_role
where
v_role_id = role_id);
-- 查詢角色下的使用者
declare
continue
handler
for
sqlstate
'02000'
set
stops=1;
我發現在某個角色下有48個使用者,而生成的記錄卻只有20條,其他角色都是正確的,冥思苦想實在找不出好的辦法,遂修改了下游標的語句。
1
declare
cur
cursor
for
(
select
user_id
from
user_role
where
role_id = role_id
order
by
create_time
desc
);
-- 查詢角色下的使用者
發現結果有變化,竟然遍歷出了47個角色,我百思不得其解,這個表裡面是沒有null資料的,為何游標執行時會中斷呢?我找了乙個mysql的大
神,問他,他說出現空值的時候游標會中斷,wk,這裡沒有空值啊! 他叫我在 「fecth之前 加 set flag=0」,他說的flag就是我的stops啦,
我試了下,果然出來的記過是正確的,神奇啊!
部分**
1
2
3
4
5
while stops <> 1 do
-- some work code
set
stops = 0;
fetch
cur
into
user_id;
end
while;
如此就可以讓結果正確,我覺得需要知道原因,遂google了很多資料還是沒有得到真正原因以及原理所在。待查證……
後來發現,這是mysql的乙個bug,屬於間歇性發作的,以後在用游標和迴圈時,接加上這個就行了。如果哪位大神知道其中的原理不煩告訴我[email protected]
不勝感激。
使用游標 游標FOR迴圈
游標for迴圈是在pl sql塊中使用游標最簡單的方式,它簡化了對游標的處理。當使用游標for迴圈時,oracle會隱含的開啟游標,提取游標資料並關閉游標。例子 顯示emp表所有雇員名及其工資 declare cursor emp cursor isselect ename,sal from emp...
使用游標迴圈修改
declare fclt name nvarchar 30 fclt num varchar 20 temp varchar 30 fclt barcode varchar 30 declare my cursor cursor 定義游標 for select fclt num,fclt name,...
MYSQL使用游標
一 使用游標 一 宣告游標。delare cursor name cursor for select statement 解釋 cursor name是游標的名字 select statement表示select語句。因為游標需要遍歷結果集的每一行,增加了伺服器的負擔,導致游標的效率並不高效,如果使...