五月综合激情婷婷六月,日韩欧美国产一区不卡,他扒开我内裤强吻我下面视频 ,无套内射无矿码免费看黄,天天躁,日日躁,狠狠躁

新聞動(dòng)態(tài)

Mysql 存儲(chǔ)過程中使用游標(biāo)循環(huán)讀取臨時(shí)表

發(fā)布日期:2022-02-22 13:59 | 文章來源:源碼中國

游標(biāo)

游標(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)
    # 需要注意這個(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語句注意點(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é)果集字段名一樣。若相同會(huì)出現(xiàn)游標(biāo)給變量賦值無效的情況。

臨時(shí)表

臨時(shí)表只在當(dāng)前連接可見,當(dāng)關(guān)閉連接時(shí),Mysql會(huì)自動(dòng)刪除表并釋放所有空間。因此在不同的連接中可以創(chuàng)建同名的臨時(shí)表,并且操作屬于本連接的臨時(shí)表。
與普通創(chuàng)建語句的區(qū)別就是使用 TEMPORARY 關(guān)鍵字

CREATE TEMPORARY TABLE StgSummary(
 Name VARCHAR(50) NOT NULL,
 StgId INT NOT NULL DEFAULT 0
);

臨時(shí)表使用限制

  1. 在同一個(gè)query語句中,只能查找一次臨時(shí)表。同樣在一個(gè)存儲(chǔ)過程中也不能多次查詢臨時(shí)表。但是不同的臨時(shí)表可以在一個(gè)query中使用。
  2. 不能用RENAME來重命名一個(gè)臨時(shí)表,但是可以用ALTER TABLE代替
ALTER TABLE orig_name RENAME new_name;
  • 臨時(shí)表使用完以后需要主動(dòng)Drop掉
DROP TEMPORARY TABLE IF EXISTS StgTempTable;

存儲(chǔ)過程中使用游標(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;
-- 打開游標(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;

最開始的時(shí)候,先創(chuàng)建臨時(shí)表,再定義游標(biāo)。但是存儲(chǔ)過程無論如何都保存不了。直接報(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語句只允許出現(xiàn)在BEGIN...END語句中而且必須出現(xiàn)在第一行)。所以最后只能多個(gè)加一對BEGIN...END進(jìn)行隔開。

總結(jié)

以前寫SQL Server的存儲(chǔ)過程,沒有仔細(xì)注意過這個(gè)問題,定義變量一般都在程序中部,MySQL就想當(dāng)然的隨便寫,最后終于踩坑了。這兩個(gè)語法上差別不大,但是真遇到差別還是挺突然的。不過也好久沒有寫SQL語句,有點(diǎn)生疏了啊。還是趕緊把坑給記下來,加深下印象吧。

以上就是Mysql 存儲(chǔ)過程中使用游標(biāo)循環(huán)讀取臨時(shí)表的詳細(xì)內(nèi)容,更多關(guān)于MySQL 游標(biāo)循環(huán)讀取臨時(shí)表的資料請關(guān)注本站其它相關(guān)文章!

國外服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

實(shí)時(shí)開通

自選配置、實(shí)時(shí)開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部