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