Mysql 存儲(chǔ)過(guò)程中使用游標(biāo)循環(huán)讀取臨時(shí)表
游標(biāo)
游標(biāo)(Cursor)是用于查看或者處理結(jié)果集中的數(shù)據(jù)的一種方法。游標(biāo)提供了在結(jié)果集中一次一行或者多行前進(jìn)或向后瀏覽數(shù)據(jù)的能力。
游標(biāo)的使用方式
定義游標(biāo):Declare 游標(biāo)名稱(chēng) CURSOR for table;(table也可以是select出來(lái)的結(jié)果集)
打開(kāi)游標(biāo):Open 游標(biāo)名稱(chēng);
從結(jié)果集獲取數(shù)據(jù)到變量:fetch 游標(biāo)名稱(chēng) into field1,field2;
執(zhí)行語(yǔ)句:執(zhí)行需要處理數(shù)據(jù)的語(yǔ)句
關(guān)閉游標(biāo):Close 游標(biāo)名稱(chēng);
BEGIN # 聲明自定義變量 declare c_stgId int; declare c_stgName varchar(50); # 聲明游標(biāo)結(jié)束變量 declare done INT DEFAULT 0; # 聲明游標(biāo) cr 以及游標(biāo)讀取到結(jié)果集最后的處理方式 declare cr cursor for select Name,StgId from StgSummary limit 3; declare continue handler for not found set done = 1; # 打開(kāi)游標(biāo) open cr; # 循環(huán) readLoop:LOOP # 獲取游標(biāo)中值并賦值給變量 fetch cr into c_stgName,c_stgId; # 判斷游標(biāo)是否到底,若到底則退出游標(biāo) # 需要注意這個(gè)判斷 IF done = 1 THEN LEAVE readLoop; END IF; SELECT c_stgName,c_stgId; END LOOP readLoop; -- 關(guān)閉游標(biāo) close cr; END
聲明變量Declare語(yǔ)句注意點(diǎn):
- Declare語(yǔ)句通常用來(lái)聲明本地變量、游標(biāo)、條件或者h(yuǎn)andler
- Declare語(yǔ)句只允許出現(xiàn)在BEGIN...END語(yǔ)句中而且必須出現(xiàn)在第一行
- Declare的順序也有要求,通常是先聲明本地變量,再是游標(biāo),然后是條件和handler
自定義變量命名注意點(diǎn):
自定義變量的名稱(chēng)不要和游標(biāo)的結(jié)果集字段名一樣。若相同會(huì)出現(xiàn)游標(biāo)給變量賦值無(wú)效的情況。
臨時(shí)表
臨時(shí)表只在當(dāng)前連接可見(jiàn),當(dāng)關(guān)閉連接時(shí),Mysql會(huì)自動(dòng)刪除表并釋放所有空間。因此在不同的連接中可以創(chuàng)建同名的臨時(shí)表,并且操作屬于本連接的臨時(shí)表。
與普通創(chuàng)建語(yǔ)句的區(qū)別就是使用 TEMPORARY 關(guān)鍵字
CREATE TEMPORARY TABLE StgSummary( Name VARCHAR(50) NOT NULL, StgId INT NOT NULL DEFAULT 0 );
臨時(shí)表使用限制
- 在同一個(gè)query語(yǔ)句中,只能查找一次臨時(shí)表。同樣在一個(gè)存儲(chǔ)過(guò)程中也不能多次查詢(xún)臨時(shí)表。但是不同的臨時(shí)表可以在一個(gè)query中使用。
- 不能用RENAME來(lái)重命名一個(gè)臨時(shí)表,但是可以用ALTER TABLE代替
ALTER TABLE orig_name RENAME new_name;
- 臨時(shí)表使用完以后需要主動(dòng)Drop掉
DROP TEMPORARY TABLE IF EXISTS StgTempTable;
存儲(chǔ)過(guò)程中使用游標(biāo)循環(huán)讀取臨時(shí)表數(shù)據(jù)
BEGIN ## 創(chuàng)建臨時(shí)表 CREATE TEMPORARY TABLE if not exists StgSummary( Name VARCHAR(50) NOT NULL, StgId INT NOT NULL DEFAULT 0 ); TRUNCATE TABLE StgSummary; ## 新增臨時(shí)表數(shù)據(jù) INSERT INTO StgSummary(Name,StgId) select '臨時(shí)數(shù)據(jù)',1 BEGIN # 自定義變量 declare c_stgId int; declare c_stgName varchar(50); declare done INT DEFAULT 0; declare cr cursor for select Name,StgId from StgSummary ORDER BY StgId desc LIMIT 3; declare continue handler for not found set done = 1; -- 打開(kāi)游標(biāo) open cr; testLoop:LOOP -- 獲取結(jié)果 fetch cr into c_stgName,c_stgId; IF done = 1 THEN LEAVE testLoop; END IF; SELECT c_stgName,c_stgId; END LOOP testLoop; -- 關(guān)閉游標(biāo) close cr; End; DROP TEMPORARY TABLE IF EXISTS StgSummary; End;
最開(kāi)始的時(shí)候,先創(chuàng)建臨時(shí)表,再定義游標(biāo)。但是存儲(chǔ)過(guò)程無(wú)論如何都保存不了。直接報(bào)錯(cuò)You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DECLARE ...
根本原因就是上面提到的注意點(diǎn)(Declare語(yǔ)句只允許出現(xiàn)在BEGIN...END
語(yǔ)句中而且必須出現(xiàn)在第一行)。所以最后只能多個(gè)加一對(duì)BEGIN...END
進(jìn)行隔開(kāi)。
總結(jié)
以前寫(xiě)SQL Server的存儲(chǔ)過(guò)程,沒(méi)有仔細(xì)注意過(guò)這個(gè)問(wèn)題,定義變量一般都在程序中部,MySQL就想當(dāng)然的隨便寫(xiě),最后終于踩坑了。這兩個(gè)語(yǔ)法上差別不大,但是真遇到差別還是挺突然的。不過(guò)也好久沒(méi)有寫(xiě)SQL語(yǔ)句,有點(diǎn)生疏了啊。還是趕緊把坑給記下來(lái),加深下印象吧。
以上就是Mysql 存儲(chǔ)過(guò)程中使用游標(biāo)循環(huán)讀取臨時(shí)表的詳細(xì)內(nèi)容,更多關(guān)于MySQL 游標(biāo)循環(huán)讀取臨時(shí)表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- MySql存儲(chǔ)過(guò)程循環(huán)的使用分析詳解
- 詳解MySql存儲(chǔ)過(guò)程參數(shù)的入門(mén)使用
- MySQL存儲(chǔ)過(guò)程中使用WHILE循環(huán)語(yǔ)句的方法
- Mysql存儲(chǔ)過(guò)程循環(huán)內(nèi)嵌套使用游標(biāo)示例代碼
- 詳解MySQL存儲(chǔ)過(guò)程的創(chuàng)建和調(diào)用
- mysql創(chuàng)建存儲(chǔ)過(guò)程及函數(shù)詳解
- MySQL之存儲(chǔ)過(guò)程按月創(chuàng)建表的方法步驟
- mysql存儲(chǔ)過(guò)程之創(chuàng)建(CREATE PROCEDURE)和調(diào)用(CALL)及變量創(chuàng)建(DECLARE)和賦值(SET)操作方法
- MySQL動(dòng)態(tài)創(chuàng)建表,數(shù)據(jù)分表的存儲(chǔ)過(guò)程
- MySQL存儲(chǔ)過(guò)程的創(chuàng)建和使用示例詳解
相關(guān)文章
MySQL中insert語(yǔ)句的使用與優(yōu)化教程
這篇文章主要介紹了MySQL中insert語(yǔ)句的使用與優(yōu)化教程,使用insert語(yǔ)句插入數(shù)據(jù)是MySQL入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-03-03MySQL 快速刪除大量數(shù)據(jù)(千萬(wàn)級(jí)別)的幾種實(shí)踐方案詳解
這篇文章主要介紹了MySQL 快速刪除大量數(shù)據(jù)(千萬(wàn)級(jí)別)的幾種實(shí)踐方案詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07MySQL 8.0新特性 — 管理端口的使用簡(jiǎn)介
這篇文章主要介紹了MySQL 8.0新特性 — 管理端口的使用簡(jiǎn)介,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下2021-03-03mysql安裝數(shù)據(jù)庫(kù)初始化失敗問(wèn)題解決方法保姆級(jí)教程
這篇文章主要給大家介紹了關(guān)于mysql安裝數(shù)據(jù)庫(kù)初始化失敗問(wèn)題解決方法保姆級(jí)教程,包括更改電腦名稱(chēng)、確保防火墻設(shè)置、清理殘留文件、檢查權(quán)限和配置文件等,需要的朋友可以參考下2025-01-01SQL?FOREIGN?KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解
這篇文章主要介紹了SQL?FOREIGN?KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12數(shù)據(jù)結(jié)構(gòu)-樹(shù)(三):多路搜索樹(shù)B樹(shù)、B+樹(shù)
這篇文章主要介紹了多路搜索樹(shù)B樹(shù)、B+樹(shù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04mysql存儲(chǔ)過(guò)程之錯(cuò)誤處理實(shí)例詳解
這篇文章主要介紹了mysql存儲(chǔ)過(guò)程之錯(cuò)誤處理,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過(guò)程錯(cuò)誤處理相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下2019-12-12