Mysql 存儲過程中使用游標(biāo)循環(huán)讀取臨時表
游標(biāo)(Cursor)是用于查看或者處理結(jié)果集中的數(shù)據(jù)的一種方法。游標(biāo)提供了在結(jié)果集中一次一行或者多行前進(jìn)或向后瀏覽數(shù)據(jù)的能力。
游標(biāo)的使用方式定義游標(biāo):Declare 游標(biāo)名稱 CURSOR for table;(table也可以是select出來的結(jié)果集)打開游標(biāo):Open 游標(biāo)名稱;從結(jié)果集獲取數(shù)據(jù)到變量:fetch 游標(biāo)名稱 into field1,field2;執(zhí)行語句:執(zhí)行需要處理數(shù)據(jù)的語句關(guān)閉游標(biāo):Close 游標(biāo)名稱;
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; # 打開游標(biāo) open cr; # 循環(huán) readLoop:LOOP # 獲取游標(biāo)中值并賦值給變量 fetch cr into c_stgName,c_stgId; # 判斷游標(biāo)是否到底,若到底則退出游標(biāo) # 需要注意這個判斷 IF done = 1 THEN LEAVE readLoop; END IF; SELECT c_stgName,c_stgId; END LOOP readLoop; -- 關(guān)閉游標(biāo) close cr;END
聲明變量Declare語句注意點(diǎn):
Declare語句通常用來聲明本地變量、游標(biāo)、條件或者h(yuǎn)andler Declare語句只允許出現(xiàn)在BEGIN...END語句中而且必須出現(xiàn)在第一行 Declare的順序也有要求,通常是先聲明本地變量,再是游標(biāo),然后是條件和handler自定義變量命名注意點(diǎn):
自定義變量的名稱不要和游標(biāo)的結(jié)果集字段名一樣。若相同會出現(xiàn)游標(biāo)給變量賦值無效的情況。
臨時表臨時表只在當(dāng)前連接可見,當(dāng)關(guān)閉連接時,Mysql會自動刪除表并釋放所有空間。因此在不同的連接中可以創(chuàng)建同名的臨時表,并且操作屬于本連接的臨時表。與普通創(chuàng)建語句的區(qū)別就是使用 TEMPORARY 關(guān)鍵字
CREATE TEMPORARY TABLE StgSummary( Name VARCHAR(50) NOT NULL, StgId INT NOT NULL DEFAULT 0);
臨時表使用限制
在同一個query語句中,只能查找一次臨時表。同樣在一個存儲過程中也不能多次查詢臨時表。但是不同的臨時表可以在一個query中使用。 不能用RENAME來重命名一個臨時表,但是可以用ALTER TABLE代替ALTER TABLE orig_name RENAME new_name; 臨時表使用完以后需要主動Drop掉
DROP TEMPORARY TABLE IF EXISTS StgTempTable;存儲過程中使用游標(biāo)循環(huán)讀取臨時表數(shù)據(jù)
BEGIN## 創(chuàng)建臨時表CREATE TEMPORARY TABLE if not exists StgSummary( Name VARCHAR(50) NOT NULL, StgId INT NOT NULL DEFAULT 0);TRUNCATE TABLE StgSummary;## 新增臨時表數(shù)據(jù)INSERT INTO StgSummary(Name,StgId)select ’臨時數(shù)據(jù)’,1BEGIN# 自定義變量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;-- 打開游標(biāo)open cr;testLoop:LOOP-- 獲取結(jié)果fetch cr into c_stgName,c_stgId;IF done = 1 THENLEAVE 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;
最開始的時候,先創(chuàng)建臨時表,再定義游標(biāo)。但是存儲過程無論如何都保存不了。直接報錯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語句只允許出現(xiàn)在BEGIN...END語句中而且必須出現(xiàn)在第一行)。所以最后只能多個加一對BEGIN...END進(jìn)行隔開。
總結(jié)以前寫SQL Server的存儲過程,沒有仔細(xì)注意過這個問題,定義變量一般都在程序中部,MySQL就想當(dāng)然的隨便寫,最后終于踩坑了。這兩個語法上差別不大,但是真遇到差別還是挺突然的。不過也好久沒有寫SQL語句,有點(diǎn)生疏了啊。還是趕緊把坑給記下來,加深下印象吧。
以上就是Mysql 存儲過程中使用游標(biāo)循環(huán)讀取臨時表的詳細(xì)內(nèi)容,更多關(guān)于MySQL 游標(biāo)循環(huán)讀取臨時表的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. Window7安裝MariaDB數(shù)據(jù)庫及系統(tǒng)初始化操作分析2. Centos7 下mysql重新啟動MariaDB篇3. MariaDB性能調(diào)優(yōu)工具mytop的使用詳解4. MariaDB數(shù)據(jù)庫的外鍵約束實(shí)例詳解5. MariaDB的安裝與配置教程6. SQL案例學(xué)習(xí)之字符串的合并與拆分方法總結(jié)7. SQLite教程(十二):鎖和并發(fā)控制詳解8. SQLite教程(二):C/C++接口簡介9. centos 7安裝mysql5.5和安裝 mariadb使用的命令10. SQLite 性能優(yōu)化實(shí)例分享
