最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

游標(biāo)

游標(biāo)(Cursor)是用于查看或者處理結(jié)果集中的數(shù)據(jù)的一種方法。游標(biāo)提供了在結(jié)果集中一次一行或者多行前進或向后瀏覽數(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語句注意點:

  • Declare語句通常用來聲明本地變量、游標(biāo)、條件或者h(yuǎn)andler
  • Declare語句只允許出現(xiàn)在BEGIN...END語句中而且必須出現(xiàn)在第一行
  • Declare的順序也有要求,通常是先聲明本地變量,再是游標(biāo),然后是條件和handler

自定義變量命名注意點:

自定義變量的名稱不要和游標(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
);

臨時表使用限制

  1. 在同一個query語句中,只能查找一次臨時表。同樣在一個存儲過程中也不能多次查詢臨時表。但是不同的臨時表可以在一個query中使用。
  2. 不能用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ù)',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;

最開始的時候,先創(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 ...根本原因就是上面提到的注意點(Declare語句只允許出現(xiàn)在BEGIN...END語句中而且必須出現(xiàn)在第一行)。所以最后只能多個加一對BEGIN...END進行隔開。

總結(jié)

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

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

相關(guān)文章

  • Mysql中JSON字段的值的實現(xiàn)示例

    Mysql中JSON字段的值的實現(xiàn)示例

    本文中介紹了如何通過SQL語句查詢JSON字段中的特定數(shù)據(jù),如查詢數(shù)組中的元素,提取映射中的值,以及使用不同的JSON函數(shù)來處理數(shù)據(jù),感興趣的可以了解一下
    2024-09-09
  • Linux下安裝MySQL過程(安裝數(shù)據(jù)庫、修改密碼和端口、修改存儲路徑、開啟遠(yuǎn)程訪問)

    Linux下安裝MySQL過程(安裝數(shù)據(jù)庫、修改密碼和端口、修改存儲路徑、開啟遠(yuǎn)程訪問)

    這篇文章詳細(xì)介紹了如何在服務(wù)器上安裝和配置MySQL 8.0.28,包括下載、解壓、安裝、啟動、登錄、修改密碼、端口、數(shù)據(jù)存儲路徑以及開啟遠(yuǎn)程訪問等步驟
    2024-11-11
  • Linux(Ubuntu)下Mysql5.6.28安裝配置方法圖文教程

    Linux(Ubuntu)下Mysql5.6.28安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了Linux(Ubuntu)下Mysql5.6.28安裝配置方法圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • 深入mysql慢查詢設(shè)置的詳解

    深入mysql慢查詢設(shè)置的詳解

    本篇文章是對mysql慢查詢設(shè)置進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • MySQL 性能優(yōu)化的最佳20多條經(jīng)驗分享

    MySQL 性能優(yōu)化的最佳20多條經(jīng)驗分享

    今天,數(shù)據(jù)庫的操作越來越成為整個應(yīng)用的性能瓶頸了,這點對于Web應(yīng)用尤其明顯。關(guān)于數(shù)據(jù)庫的性能,這并不只是DBA才需要擔(dān)心的事,而這更是我們程序員需要去關(guān)注的事情。
    2010-07-07
  • 連接mysql錯誤問題解決方案

    連接mysql錯誤問題解決方案

    文章主要介紹了在Windows環(huán)境下,如何配置MySQL以允許外部機器連接,通過修改MySQL的配置文件,將root用戶的訪問權(quán)限從默認(rèn)的localhost改為%,并執(zhí)行flush操作,解決了連接錯誤的問題,感興趣的朋友一起看看吧
    2025-02-02
  • 詳解MySQL 聚簇索引與非聚簇索引

    詳解MySQL 聚簇索引與非聚簇索引

    這篇文章主要介紹了MySQL 聚簇索引與非聚簇索引的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)MySQL索引,感興趣的朋友可以了解下
    2020-09-09
  • mysql 索引詳細(xì)介紹

    mysql 索引詳細(xì)介紹

    這篇文章主要介紹了mysql 索引詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下
    2016-09-09
  • MySQL: mysql is not running but lock exists 的解決方法

    MySQL: mysql is not running but lock exists 的解決方法

    下面可以參考下面的方法步驟解決。最后查到一個網(wǎng)友說可能和log文件有關(guān),于是將log文件給移除了,再重啟MySQL終于OK了
    2009-06-06
  • B-樹的刪除過程介紹

    B-樹的刪除過程介紹

    今天小編就為大家分享一篇關(guān)于B-樹的刪除過程介紹,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01

最新評論

封丘县| 大埔县| 乌海市| 专栏| 安康市| 沂水县| 普安县| 绥德县| 彭山县| 子长县| 古蔺县| 舒城县| 清水县| 勐海县| 沂水县| 托克逊县| 扶余县| 江孜县| 奉化市| 博湖县| 澄迈县| 张家口市| 同德县| 电白县| 娄烦县| 鹤山市| 成都市| 印江| 万年县| 鲁山县| 永仁县| 加查县| 蓝田县| 岗巴县| 壤塘县| 连平县| 闽清县| 荣昌县| 淮南市| 葫芦岛市| 大宁县|