請問MySQL中怎樣檢查系統中是否已有同名的游標?用SQL代碼怎樣寫,謝謝!
uj5u.com熱心網友回復:
光 標 指 什 么uj5u.com熱心網友回復:
就是Cursor
我是想怎樣檢查我是否已經在系統中定義(或正在使用)某一cursor,或叫游標吧。
謝謝
uj5u.com熱心網友回復:
您說的是游標吧,存盤程序里定義的。
uj5u.com熱心網友回復:
您可以試試看這個陳述句SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%CURSOR%' ;
uj5u.com熱心網友回復:
您可以試試看這個陳述句
SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%CURSOR%' ;
你這個是查詢存盤程序中是否有定義Cursor的,我的意思是在同一個存盤程序中,先檢查某一個cursor是否有被定義或使用,若使用某一cursor在使用,先關閉它。
我在一個回圈中定義cursor的,所以先要實作下面代碼中中文那一行描述的功能,請問怎樣寫?多謝!
SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%cur1%' ;
DECLARE cur1 CURSOR FOR SELECT * FROM test;
open cur1 ;
if 檢查cur1 是否 存在,若存在就先關閉
uj5u.com熱心網友回復:
總結一下,您的需求分3個部分。1、判斷哪個存盤程序用到了CURSOR。
2、判斷哪個包含CURSOR 的存盤程序,正在執行。
3、關閉正在運行的這個包含CURSOR的存盤程序。
是這個意思嗎。
uj5u.com熱心網友回復:
總結一下,您的需求分3個部分。
1、判斷哪個存盤程序用到了CURSOR。
2、判斷哪個包含CURSOR 的存盤程序,正在執行。
3、關閉正在運行的這個包含CURSOR的存盤程序。
是這個意思嗎。
總結一下,您的需求分3個部分。
1、判斷哪個存盤程序用到了CURSOR。
2、判斷哪個包含CURSOR 的存盤程序,正在執行。
3、關閉正在運行的這個包含CURSOR的存盤程序。
是這個意思嗎。
謝謝你!沒上面復雜,因為我是在一個回圈中呼叫類似下面的代碼,我只需要在當前的存盤程序中檢查cur1是否存在,若存在就關閉。
需要需要實作下面中文描述對應的代碼就可以,多謝你!
SELECT * FROM mysql.proc t WHERE t.db = SCHEMA() AND UPPER(t.body) LIKE '%cur1%' ;
DECLARE cur1 CURSOR FOR SELECT * FROM test;
open cur1 ;
if cur1 存在 then
關閉
end if
uj5u.com熱心網友回復:
以我目前的知識儲備,可以通過“SHOW PROCESSLIST;”陳述句查詢正在執行的行程。這個陳述句查詢出的id,可以通過“kill id;”來結束行程。但是“SHOW PROCESSLIST;”的查詢結果,不能確定是cursor的行程。你可以通過cursor里執行的陳述句,來判斷是否是你需要的行程,但是要能確定唯一性,否則會誤殺其它行程。
另外,還要問一下,為什么要結束正在執行的cursor,這樣的操作,可能會導致誤殺錯誤的行程,導致資料的不完整行,不建議這樣的操作。
最好能詳細的說一下您的需求,可能還有其它的方案來處理您的問題。
uj5u.com熱心網友回復:
是這樣的,有兩個Cursor,一個是外層的Cursor,一個是內層的Cursor, 因為內層cursor是定義在外層cursor內,為了程式的安全,所以在外層Cursor每取一行后再執行內層Cursor的時候, 我先檢查下內層Cursor的是否有存在或打開,若有,就先釋放在關閉,然后執行內層cursor的定義等一些相關的操作。就是想實作這個功能,謝謝您!uj5u.com熱心網友回復:
我的理解,就是嵌套回圈,對吧。如果這樣,就不用考慮內層的回圈是否結束了,因為內層的回圈沒有結束,后續的就不會再執行。
uj5u.com熱心網友回復:
因為我有時因某一條件需要跳出內層回圈,有嵌套回圈,所以我要在代碼中檢查是否存在該cursor,否則再次打開已經存在的cursor會出錯的uj5u.com熱心網友回復:
這個也有辦法,你在CURSOR的時候,其實就是一個回圈每一次回圈都要有條件的,例如OPEN cursor_name;
FETCH cursor_name INTO i_1,i_2……;
WHILE s <> 1 AND aaa = 1 DO
……
FETCH cursor_name INTO i_1,i_2……;
-- 如果想跳出回圈,在這里給aaa設定一個不等于的值,例如 aaa=2。
END WHILE;
CLOSE cursor_name ;
只要給回圈里的條件,設定一個可以跳出回圈的值即可。
uj5u.com熱心網友回復:
跳出回圈我知道,現在問題是怎樣在回圈中判斷某一cursor是否已經被定義與使用。uj5u.com熱心網友回復:
請問哪位大蝦能否幫看看,謝謝!uj5u.com熱心網友回復:
請問哪位大蝦能否幫看看,謝謝!uj5u.com熱心網友回復:
跳出內回圈游標時關閉了就行了啊,關閉了還判斷它干嘛。。。uj5u.com熱心網友回復:
如果你內回圈跳出時,二次進入時還需要繼續回圈剛才的內回圈,也很簡單啊,設定個變數作為標志。如果是需要繼續接著上次的內回圈,標志變數為true。標志變數為true時不再open內回圈游標就行了。
uj5u.com熱心網友回復:
不知道你明白沒,當你某個原因要跳出時可能有兩種情況。1、跳出時,你同時關閉內回圈游標就行了。下次再open的時候不會報錯。2、如果你還想保留內回圈的當前位置,下次進入內回圈是繼續那個位置進行回圈。這種情況你就需要定義個狀態變數。比如設定狀態變數為true是想保留內回圈位置(你某個原因跳出時)。這時下次進入內回圈時判斷如果狀態變數為true,則不再open游標,因為游標已經open。正常內回圈完后設定狀態變數為false。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/48428.html
標籤:MySQL
上一篇:請求大神,多謝!
下一篇:大資料
