欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2020年12月14日 09:31:08   作者:傅小灰  
這篇文章主要介紹了Mysql 存儲(chǔ)過程中使用游標(biāo)循環(huán)讀取臨時(shí)表的方法,幫助大家更好的理解和使用MySQL數(shù)據(jù)庫,感興趣的朋友可以了解下

游標(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è)加一對(duì)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í)表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Mysql?DATETIME?毫秒坑的解決

    Mysql?DATETIME?毫秒坑的解決

    本文主要介紹了Mysql?DATETIME?毫秒坑的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • MySQL中insert語句的使用與優(yōu)化教程

    MySQL中insert語句的使用與優(yōu)化教程

    這篇文章主要介紹了MySQL中insert語句的使用與優(yōu)化教程,使用insert語句插入數(shù)據(jù)是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-03-03
  • MySQL 快速刪除大量數(shù)據(jù)(千萬級(jí)別)的幾種實(shí)踐方案詳解

    MySQL 快速刪除大量數(shù)據(jù)(千萬級(jí)別)的幾種實(shí)踐方案詳解

    這篇文章主要介紹了MySQL 快速刪除大量數(shù)據(jù)(千萬級(jí)別)的幾種實(shí)踐方案詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • MySQL 8.0新特性 — 管理端口的使用簡介

    MySQL 8.0新特性 — 管理端口的使用簡介

    這篇文章主要介紹了MySQL 8.0新特性 — 管理端口的使用簡介,幫助大家更好的理解和學(xué)習(xí)使用MySQL,感興趣的朋友可以了解下
    2021-03-03
  • mysql安裝數(shù)據(jù)庫初始化失敗問題解決方法保姆級(jí)教程

    mysql安裝數(shù)據(jù)庫初始化失敗問題解決方法保姆級(jí)教程

    這篇文章主要給大家介紹了關(guān)于mysql安裝數(shù)據(jù)庫初始化失敗問題解決方法保姆級(jí)教程,包括更改電腦名稱、確保防火墻設(shè)置、清理殘留文件、檢查權(quán)限和配置文件等,需要的朋友可以參考下
    2025-01-01
  • SQL?FOREIGN?KEY約束保障表之間關(guān)系完整性關(guān)鍵規(guī)則詳解

    SQL?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)-樹(三):多路搜索樹B樹、B+樹

    數(shù)據(jù)結(jié)構(gòu)-樹(三):多路搜索樹B樹、B+樹

    這篇文章主要介紹了多路搜索樹B樹、B+樹,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • MySQL去重的方法整理

    MySQL去重的方法整理

    這篇文章主要介紹了MySQL去重的方法整理的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • MySQL中的約束Constraint解讀

    MySQL中的約束Constraint解讀

    這篇文章詳細(xì)介紹了MySQL中的各種約束類型,包括非空約束、默認(rèn)約束、檢查約束、唯一約束和主鍵約束,以及外鍵約束,每種約束類型都有其特定的用途和語法,并且可以是列級(jí)約束或表級(jí)約束,文章還探討了如何給約束命名、刪除約束
    2025-01-01
  • mysql存儲(chǔ)過程之錯(cuò)誤處理實(shí)例詳解

    mysql存儲(chǔ)過程之錯(cuò)誤處理實(shí)例詳解

    這篇文章主要介紹了mysql存儲(chǔ)過程之錯(cuò)誤處理,結(jié)合實(shí)例形式詳細(xì)分析了mysql存儲(chǔ)過程錯(cuò)誤處理相關(guān)原理、操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-12-12

最新評(píng)論