成都網(wǎng)站建設(shè)冠辰最近的重要新聞
文章目錄
- openGauss學習筆記-38 openGauss 高級數(shù)據(jù)管理-游標
- 38.1 語法格式
- 38.2 參數(shù)說明
- 38.3 示例
openGauss學習筆記-38 openGauss 高級數(shù)據(jù)管理-游標
為了處理SQL語句,存儲過程進程分配一段內(nèi)存區(qū)域來保存上下文聯(lián)系。游標是指向上下文區(qū)域的句柄或指針。借助游標,存儲過程可以控制上下文區(qū)域的變化。
38.1 語法格式
-
定義游標
CURSOR cursor_name[ BINARY ] [ NO SCROLL ] [ { WITH | WITHOUT } HOLD ]FOR query ;
-
通過已經(jīng)創(chuàng)建的游標檢索數(shù)據(jù)
FETCH [ direction { FROM | IN } ] cursor_name;
其中direction子句為可選參數(shù)。
NEXT| PRIOR| FIRST| LAST| ABSOLUTE count| RELATIVE count| count| ALL| FORWARD| FORWARD count| FORWARD ALL| BACKWARD| BACKWARD count| BACKWARD ALL
-
在不檢索數(shù)據(jù)的情況下重新定位一個游標
MOVE的作用類似于FETCH命令,但只是重定位游標而不返回行。
MOVE [ direction [ FROM | IN ] ] cursor_name;
其中direction子句為可選參數(shù)。
NEXT| PRIOR| FIRST| LAST| ABSOLUTE count| RELATIVE count| count| ALL| FORWARD| FORWARD count| FORWARD ALL| BACKWARD| BACKWARD count| BACKWARD ALL
-
關(guān)閉游標,釋放和一個游標關(guān)聯(lián)的所有資源
CLOSE { cursor_name | ALL } ;
38.2 參數(shù)說明
-
cursor_name
將要創(chuàng)建、關(guān)閉的游標名。
-
BINARY
指明游標以二進制而不是文本格式返回數(shù)據(jù)。
-
NO SCROLL
聲明游標檢索數(shù)據(jù)行的方式。
- NO SCROLL:聲明該游標不能用于以倒序的方式檢索數(shù)據(jù)行。
- 未聲明:根據(jù)執(zhí)行計劃的不同,自動判斷該游標是否可以用于以倒序的方式檢索數(shù)據(jù)行。
-
WITH HOLD | WITHOUT HOLD
聲明當創(chuàng)建游標的事務(wù)結(jié)束后,游標是否能繼續(xù)使用。
- WITH HOLD:聲明該游標在創(chuàng)建它的事務(wù)結(jié)束后仍可繼續(xù)使用。
- WITHOUT HOLD:聲明該游標在創(chuàng)建它的事務(wù)之外不能再繼續(xù)使用,此游標將在事務(wù)結(jié)束時被自動關(guān)閉。
- 如果不指定WITH HOLD或WITHOUT HOLD,默認行為是WITHOUT HOLD。
- 跨節(jié)點事務(wù)不支持WITH HOLD(例如在多DBnode部署openGauss中所創(chuàng)建的含有DDL的事務(wù)屬于跨節(jié)點事務(wù))。
-
query
使用SELECT或VALUES子句指定游標返回的行。
取值范圍:SELECT或VALUES子句。
-
direction_clause
定義抓取數(shù)據(jù)的方向。
取值范圍:
-
NEXT(缺省值)
從當前關(guān)聯(lián)位置開始,抓取下一行。
-
PRIOR
從當前關(guān)聯(lián)位置開始,抓取上一行。
-
FIRST
抓取查詢的第一行(和ABSOLUTE 1相同)。
-
LAST
抓取查詢的最后一行(和ABSOLUTE -1相同)。
-
ABSOLUTE count
抓取查詢中第count行。
ABSOLUTE抓取不會比用相對位移移動到需要的數(shù)據(jù)行更快,因為下層的實現(xiàn)必須遍歷所有中間的行。
count取值范圍:有符號的整數(shù)
- count為正數(shù),就從查詢結(jié)果的第一行開始,抓取第count行。
- count為負數(shù),就從查詢結(jié)果末尾抓取第abs(count)行。
- count為0時,定位在第一行之前。
-
RELATIVE count
從當前關(guān)聯(lián)位置開始,抓取隨后或前面的第count行。
取值范圍:有符號的整數(shù)
- count為正數(shù)就抓取當前關(guān)聯(lián)位置之后的第count行。
- count為負數(shù)就抓取當前關(guān)聯(lián)位置之前的第abs(count)行。
- 如果當前行沒有數(shù)據(jù)的話,RELATIVE 0返回空。
-
count
抓取隨后的count行(和FORWARD count一樣)。
-
ALL
從當前關(guān)聯(lián)位置開始,抓取所有剩余的行(和FORWARD ALL一樣)。
-
FORWARD
抓取下一行(和NEXT一樣)。
-
FORWARD count
從當前關(guān)聯(lián)位置開始,抓取隨后或前面的count行。
-
FORWARD ALL
從當前關(guān)聯(lián)位置開始,抓取所有剩余行。
-
BACKWARD
從當前關(guān)聯(lián)位置開始,抓取前面一行(和PRIOR一樣) 。
-
BACKWARD count
從當前關(guān)聯(lián)位置開始,抓取前面的count行(向后掃描)。
取值范圍:有符號的整數(shù)
- count為正數(shù)就抓取當前關(guān)聯(lián)位置之前的count行。
- count為負數(shù)就抓取當前關(guān)聯(lián)位置之后的abs(count)行。
- 如果有數(shù)據(jù)的話,BACKWARD 0重新抓取當前行。
-
BACKWARD ALL
從當前關(guān)聯(lián)位置開始,抓取所有前面的行(向后掃描) 。
-
-
{ FROM | IN } cursor_name
使用關(guān)鍵字FROM或IN指定游標名稱。
取值范圍:已創(chuàng)建的游標的名稱。
-
ALL
關(guān)閉所有已打開的游標。
38.3 示例
假設(shè)存在表customer_t1 ,數(shù)據(jù)內(nèi)容如下:
openGauss=# SELECT * FROM customer_t1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount
---------------+---------------+--------------+-------------+--------3769 | | Grace | |3769 | hello | | |6885 | maps | Joes | | 22004321 | tpcds | Lily | | 30009527 | world | James | | 5000
(5 rows)
-
用一個游標讀取一個表。
--開始一個事務(wù)。 openGauss=# START TRANSACTION; START TRANSACTION--建立一個名為cursor1的游標。 openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1; DECLARE CURSOR--抓取前3行到游標cursor1里。 openGauss=# FETCH FORWARD 3 FROM cursor1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount ---------------+---------------+--------------+-------------+--------3769 | | Grace | |3769 | hello | | |6885 | maps | Joes | | 2200 (3 rows)--關(guān)閉游標并提交事務(wù)。 openGauss=# CLOSE cursor1; CLOSE CURSOR--結(jié)束一個事務(wù)。 openGauss=# END; COMMIT
-
用一個游標讀取VALUES子句中的內(nèi)容。
--開始一個事務(wù)。 openGauss=# START TRANSACTION; START TRANSACTION--建立一個名為cursor2的游標。 openGauss=# CURSOR cursor2 FOR VALUES(1,2),(0,3) ORDER BY 1; DECLARE CURSOR--抓取前2行到游標cursor2里。 openGauss=# FETCH FORWARD 2 FROM cursor2;column1 | column2 ---------+---------0 | 31 | 2 (2 rows)--關(guān)閉游標并提交事務(wù)。 openGauss=# CLOSE cursor2; CLOSE CURSOR--結(jié)束一個事務(wù)。 openGauss=# END; COMMIT
-
WITH HOLD游標的使用。
--開啟事務(wù)。 openGauss=# START TRANSACTION;--創(chuàng)建一個with hold游標。 openGauss=# DECLARE cursor1 CURSOR WITH HOLD FOR SELECT * FROM customer_t1;--抓取頭2行到游標cursor1里。 openGauss=# FETCH FORWARD 2 FROM cursor1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount ---------------+---------------+--------------+-------------+--------3769 | | Grace | |3769 | hello | | | (2 rows)--結(jié)束事務(wù)。 openGauss=# END; COMMIT--抓取下一行到游標cursor1里。 openGauss=# FETCH FORWARD 1 FROM cursor1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount ---------------+---------------+--------------+-------------+--------6885 | maps | Joes | | 2200 (1 row)--關(guān)閉游標。 openGauss=# CLOSE cursor1; CLOSE CURSOR
-
MOVE語句的使用。
--開始一個事務(wù)。 openGauss=# START TRANSACTION; START TRANSACTION--定義一個名為cursor1的游標。 openGauss=# CURSOR cursor1 FOR SELECT * FROM customer_t1; DECLARE CURSOR--忽略游標cursor1的前3行。 openGauss=# MOVE FORWARD 1 FROM cursor1; MOVE 1--抓取游標cursor1的前2行。 openGauss=# FETCH 2 FROM cursor1;c_customer_sk | c_customer_id | c_first_name | c_last_name | amount ---------------+---------------+--------------+-------------+--------3769 | hello | | |6885 | maps | Joes | | 2200 (2 rows)--關(guān)閉游標。 openGauss=# CLOSE cursor1; CLOSE CURSOR--結(jié)束一個事務(wù)。 openGauss=# END; COMMIT
👍 點贊,你的認可是我創(chuàng)作的動力!
?? 收藏,你的青睞是我努力的方向!
?? 評論,你的意見是我進步的財富!