2.游標
公司主營業務:成都網站設計、網站制作、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。成都創新互聯公司是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創新互聯公司推出鎮賚免費做網站回饋大家。
游標是從數據表中提取出來的數據,以臨時表的形式存放在內存中,在游標中有一個數據指針,在初始狀態下指向的是首記錄,利用fetch語句可以移動該指針,從而對游標中的數據進行各種操作,然后將操作結果寫回數據表中。
游標是系統為用戶開設的一個數據緩沖區,存放SQL語句的執行結果。每個游標區都有一個名字。用戶可以用SQL語句逐一從游標中獲取記錄,并賦給主變量,交由主語言進一步處理。主語言是面向記錄的,一組主變量一次只能存放一條記錄。僅使用主變量并不能完全滿足SQL語句向應用程序輸出數據的要求。嵌入式SQL引入了游標的概念,用來協調這兩種不同的處理方式。在數據庫開發過程中,當你檢索的數據只是一條記錄時,你所編寫的事務語句代碼往往使用SELECT INSERT 語句。但是我們常常會遇到這樣情況,即從某一結果集中逐一地讀取一條記錄。那么如何解決這種問題呢?游標為我們提供了一種極為優秀的解決方案。
定義游標
DECLARE cursor_name CURSOR FOR SELECT_statement;
打開游標
OPEN cursor_name;
獲取游標。獲得多行數據,使用循環語句去執行FETCH
FETCH cursor_name INTO variable list;
關閉游標
CLOSE cursor_name ;
注意:mysql的游標是向前只讀的,也就是說,你只能順序地從開始往后讀取結果集,不能從后往前,也不能直接跳到中間的記錄.
一個例子:把從數據庫查詢出來的所有name鏈接起來。
/*初始化*/ drop procedure if exists useCursor // /*建立 存儲過程 create */ CREATE PROCEDURE useCursor() BEGIN /*局部變量的定義 declare*/ declare tmpName varchar(20) default '' ; declare allName varchar(255) default '' ; declare cur1 CURSOR FOR SELECT name FROM test.level ; /* mysql 不知道為什么用異常加入判斷 ? * 此請參考官方文檔 20.2.11. 光標 光標 * 這把 游標 異常后 捕捉 * 并設置 循環使用 變量 tmpname 為 null 跳出循環。 */ declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null; /*開游標*/ OPEN cur1; /*游標向下走一步*/ FETCH cur1 INTO tmpName; /* 循環體 這很明顯 把游標查詢出的 name 都加起并用 ; 號隔開 */ WHILE ( tmpname is not null) DO set tmpName = CONCAT(tmpName ,";") ; set allName = CONCAT(allName ,tmpName) ; /*游標向下走一步*/ FETCH cur1 INTO tmpName; END WHILE; CLOSE cur1; select allName ;END;//call useCursor()//
3.觸發器
觸發器是特定事件出現的時候,自動執行的代碼塊。類似于存儲過程,觸發器與存儲過程的區別在于:存儲過程是由用戶或應用程序顯式調用的,而觸發器是不能被直接調用的。
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW BEGIN trigger_stmt END;
trigger_name:觸發器的名字,我常用的命名規則t_name_tableName_(b|a)(i|u|d),t:觸發器標識,name:英文名,tableName:表名,b(BEFORE):標識是觸發事件之前,a(AFTER):標識觸發事件之后,i(insert):標識insert事件,u(update):標識update事件,d(delete):標識delete事件;
trigger_time:觸發時間(BEFORE或AFTER)
trigger_event:事件名(insert或update或delete)
tbl_name:表名(必須是永久性表)
trigger_stmt:執行語句(可以是復合語名),使用別名OLD和NEW,能夠引用與觸發程序相關的表中的列。
CREATE TRIGGER t22_biBEFORE INSERT ON t22FOR EACH ROWBEGINSET @x = 'Trigger was activated!';SET NEW.s1 = 55;END;//
在表t22中,在插入一條數據之前,顯示'Trigger was activated!',并且將插入的這條數據的s1值設為55.
給你一個Oracle的示例,請根據自己的應用場景,參考調測自己mysql的代碼
在Oracle數據庫中:
declare
sname varchar2( 20); --聲明變量
cursor student_cursor is select sname from student ; --聲明指向表student的【游標】
begin
open student_cursor;--打開游標
fetch student_cursor into sname ;--獲取游標的當前指向值,使游標指針往下移動
while student_cursor%found --【你提問的應該是這個條件】判斷游標指針是否指向某行記錄,即是否已遍歷完全表
loop--循環遍歷
dbms_output.put_line ('學生姓名' ||sname );--輸出當前遍歷訪問的行記錄信息
fetch student_cursor into sname;--獲取游標的當前指向值,使游標指針往下移動
end loop;--循環體結束
close student_cursor;--關閉游標,對應前面open操作
end;
另一個在任何數據庫都通用的辦法是:
首先統計表的行數并記錄下來,假定是變量cnt_stu,再定義一個計數變量i=1
在循環體中,當i=cnt_stu,就執行遍歷,并且i=i+1;,這樣當遍歷完了也會跳出循環體。
先聲明一個游標,語法:
DECLARE v_1 VARCHAR(16);
DECLARE v_2 VARCHAR(16);
DECLARE c_XXX CURSOR FOR
SELECT c_1, c_2
FROM t_1;
同時聲明一個布爾型的變量FOUND,當循環的條件不成立時,結束循環用的。
DECLARE FOUND BOOLEAN DEFAULT TRUE;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET FOUND = FALSE;
在使用游標的時候,要先打開游標,語法:OPEN c_XXX;
使用的時候,要先打開游標,取出第一條數據,語法: FETCH c_XXX INTO v_1, v_2;
然后才開始執行循環,語法:WHILE FOUND DO
執行需要執行的語句;
取下一條數據放到當前游標中,FETCH c_XXX INTO v_1, v_2;
結束循環,語法:END WHILE;
結束游標,語法:CLOSE c_cargo。有什么問題我們再溝通啊。不知道你具體要問題的是什么。
比較基礎的
可以用在存儲過程的SQL語句主要有以下類型:
1、
無返回結果語句,如:INSERT,UPDATE,DROP,
DELETE等
2、
select語句返回單行變量并可傳給本地變量(select
..into)
3、
返回多行結果集的select語句,并可使用游標循環處理
注意,存儲過程返回的多行結果集,可以被客戶端程序(如php)所接收,但要在一個存儲過程中接收另一個存儲過程的結果集是不可能的,一般解決辦法是存入臨時表供其它過程共用
4、
prepare語句
以下主要講述游標及prepare部分
游標
定義
DECLARE
cursor_name
CURSOR
FOR
SELECT_statement;
游標操作
OPEN
打開游標
OPEN
cursor_name;
FETCH
獲取游標當前指針的記錄,并傳給指定變量列表,注意變量數必須與游標返回的字段數一致,要獲得多行數據,使用循環語句去執行FETCH
FETCH
cursor_name
INTO
variable
list;
CLOSE關閉游標
CLOSE
cursor_name
;
注意:mysql的游標是向前只讀的,也就是說,你只能順序地從開始往后讀取結果集,不能從后往前,也不能直接跳到中間的記錄.
一個完整的例子:
--
定義本地變量
DECLARE
o
varchar(128);
--
定義游標
DECLARE
ordernumbers
CURSOR
FOR
SELECT
callee_name
FROM
account_tbl
where
acct_timeduration=10800;
DECLARE
CONTINUE
HANDLER
FOR
NOT
FOUND
SET
no_more_departments=1;
SET
no_more_departments=0;
--
打開游標
OPEN
ordernumbers;
--
循環所有的行
REPEAT
--
Get
order
number
FETCH
ordernumbers
INTO
o;
update
account
set
allMoney=allMoney+72,lastMonthConsume=lastMonthConsume-72
where
NumTg=@o;
--
循環結束
UNTIL
no_more_departments
END
REPEAT;
--
關閉游標
CLOSE
ordernumbers;
Python操作MySQL
connector如何把游標放在最后
MySQLdb.connect是python
連接MySQL數據庫的方法,在Python中
import
MySQLdb即可使用,至于connect中的參數很簡單:
host:MySQL服務器名
user:數據庫使用者
password:用戶登錄密碼
db:操作的數據庫名
charset:使用的字符集(一般是gb2312)
cursor
=
db.cursor()
其實就是用來獲得python執行Mysql命令的方法,也就是
我們所說的操作游標
下面cursor.execute則是真正執行MySQL語句,即查詢TABLE_PARAMS表的數據。
網頁名稱:mysql游標怎么向后 mysql游標的使用
URL地址:http://m.kartarina.com/article46/dodsieg.html
成都網站建設公司_創新互聯,為您提供軟件開發、移動網站建設、面包屑導航、網站內鏈、ChatGPT、域名注冊
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯