1. 程式人生 > 實用技巧 >Java NIO(三)非阻塞的連線操作

Java NIO(三)非阻塞的連線操作

遊標

遊標(Cursor)是用於檢視或者處理結果集中的資料的一種方法。遊標提供了在結果集中一次一行或者多行前進或向後瀏覽資料的能力。

遊標的使用方式
  1. 定義遊標:Declare 遊標名稱 CURSOR for table;(table也可以是select出來的結果集)
  2. 開啟遊標:Open 遊標名稱;
  3. 從結果集獲取資料到變數:fetch 遊標名稱 into field1,field2;
  4. 執行語句:執行需要處理資料的語句
  5. 關閉遊標:Close 遊標名稱;
BEGIN
    # 宣告自定義變數
    declare c_stgId int;
    declare c_stgName varchar(50);
    # 宣告遊標結束變數
    declare done INT DEFAULT 0;

    # 宣告遊標 cr 以及遊標讀取到結果集最後的處理方式
    declare cr cursor for select Name,StgId from StgSummary limit 3;
    declare continue handler for not found set done = 1;

    # 開啟遊標
    open cr;

    # 迴圈
    readLoop:LOOP
        # 獲取遊標中值並賦值給變數
        fetch cr into c_stgName,c_stgId;
        # 判斷遊標是否到底,若到底則退出遊標
        # 需要注意這個判斷
        IF  done = 1 THEN
            LEAVE readLoop; 
        END IF; 
        
            SELECT  c_stgName,c_stgId;
        
    END LOOP readLoop;
    -- 關閉遊標
    close cr;
END

宣告變數Declare語句注意點:

  • Declare語句通常用來宣告本地變數、遊標、條件或者handler
  • Declare語句只允許出現在BEGIN...END語句中而且必須出現在第一行
  • Declare的順序也有要求,通常是先宣告本地變數,再是遊標,然後是條件和handler

自定義變數命名注意點:

自定義變數的名稱不要和遊標的結果集欄位名一樣。若相同會出現遊標給變數賦值無效的情況。

臨時表

臨時表只在當前連線可見,當關閉連線時,Mysql會自動刪除表並釋放所有空間。因此在不同的連線中可以建立同名的臨時表,並且操作屬於本連線的臨時表。
與普通建立語句的區別就是使用 TEMPORARY 關鍵字

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;
  1. 臨時表使用完以後需要主動Drop掉
DROP TEMPORARY TABLE IF EXISTS StgTempTable;

儲存過程中使用遊標迴圈讀取臨時表資料


BEGIN
## 建立臨時表
CREATE TEMPORARY TABLE if not exists StgSummary(
 Name VARCHAR(50) NOT NULL,
 StgId INT NOT NULL DEFAULT 0
);
TRUNCATE TABLE StgSummary;

## 新增臨時表資料
INSERT INTO StgSummary(Name,StgId)
select '臨時資料',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;

-- 開啟遊標
open cr;
testLoop:LOOP
	-- 獲取結果
	fetch cr into c_stgName,c_stgId;
	IF  done = 1 THEN
		LEAVE testLoop; 
	END IF; 
	
    
    SELECT  c_stgName,c_stgId;
	
END LOOP testLoop;
-- 關閉遊標
close cr;

End;
DROP TEMPORARY TABLE IF EXISTS StgSummary;
End;

最開始的時候,先建立臨時表,再定義遊標。但是儲存過程無論如何都儲存不了。直接報錯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語句只允許出現在BEGIN...END語句中而且必須出現在第一行)。所以最後只能多個加一對BEGIN...END進行隔開。

總結

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