游標使用
 
                  更新時間 2025-02-14 10:24:06
                    
 
                    最近更新時間: 2025-02-14 10:24:06
                  
   分享文章 
本頁介紹天翼云TeleDB數據庫的游標使用方法。
 環境準備
drop table if  exists bills ;
create table bills 
(
id serial not null,
goodsdesc text not null,
beginunit text not null,
begincity text not null,
pubtime timestamp not null,
amount float8 not null default 0,
primary key (id)
) distribute by shard(id) to group default_group;
COMMENT ON TABLE bills is '運單記錄';
COMMENT ON COLUMN bills.id IS 'id號';
COMMENT ON COLUMN bills.goodsdesc IS '貨物名稱';
COMMENT ON COLUMN bills.beginunit IS '啟運省份';
COMMENT ON COLUMN bills.begincity IS '啟運城市';
COMMENT ON COLUMN bills.pubtime IS '發布時間';
COMMENT ON COLUMN bills.amount IS '運費';
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'衣服','海南省','三亞市','2015-10-05 09:32:01',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'建筑設備','福建省','三明市','2015-10-05 07:21:22',ROUND((random()*10000)::NUMERIC,2)); 
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'設備','福建省','三明市','2015-10-05 11:21:54',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'普貨','福建省','三明市','2015-10-05 15:19:17',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'5 0鏟車,后八輪翻斗車','河南省','三門峽市','2015-10-05 07:53:13',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'鮮香菇2000斤','河南省','三門峽市','2015-10-05 10:38:29',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'旋挖附件38噸','河南省','三門峽市','2015-10-05 10:48:38',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'旋挖附件35噸','河南省','三門峽市','2015-10-05 10:48:38',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'旋挖附件39噸','河南省','三門峽市','2015-10-05 11:38:38',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'設備','上海市','上海市','2015-10-05 07:59:35',ROUND((random()*10000)::NUMERIC,2));
INSERT INTO bills(id,goodsdesc,beginunit,begincity,pubtime,amount) 
VALUES(default,'普貨40噸需13米半掛一輛','上海市','上海市','2015-10-05 08:13:59',ROUND((random()*10000)::NUMERIC,2));定義游標
teledb=# begin;
BEGIN
teledb=# DECLARE teledb_cur SCROLL CURSOR FOR SELECT * from bills ORDER BY id;
DECLARE CURSOR注意
游標需要放在一個事務中使用。
提取下一行數據
teledb=# DECLARE teledb_cur SCROLL CURSOR FOR SELECT * from bills ORDER BY id;
DECLARE CURSOR
teledb=# FETCH NEXT from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
1 | 衣服      | 海南省    | 三亞市    | 2015-10-05 09:32:01 | 3714.15
(1 row)
teledb=# FETCH NEXT from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
2 | 建筑設備  | 福建省    | 三明市    | 2015-10-05 07:21:22 | 8195.98
(1 row)提取前一行數據
teledb=# FETCH PRIOR from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
1 | 衣服      | 海南省    | 三亞市    | 2015-10-05 09:32:01 | 3714.15
(1 row)
teledb=# FETCH PRIOR from teledb_cur;
id | goodsdesc | beginunit | begincity | pubtime | amount 
----+-----------+-----------+-----------+---------+--------
(0 rows)提取最后一行
teledb=# fetch last from teledb_cur;
id |       goodsdesc        | beginunit | begincity |       pubtime       | amount  
----+------------------------+-----------+-----------+---------------------+---------
11 | 普貨40噸需13米半掛一輛 | 上海市    | 上海市    | 2015-10-05 08:13:59 | 1425.64
(1 row)提取第一行
teledb=# fetch first from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
1 | 衣服      | 海南省    | 三亞市    | 2015-10-05 09:32:01 | 3714.15
(1 row)提取該查詢的第x行
teledb=# fetch absolute 2 from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
2 | 建筑設備  | 福建省    | 三明市    | 2015-10-05 07:21:22 | 8195.98
(1 row)
teledb=# fetch absolute -2 from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
10 | 設備      | 上海市    | 上海市    | 2015-10-05 07:59:35 | 1784.63
(1 row)x為負數時從尾部向上提取。
提取當前位置后的第x行
teledb=# fetch first from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
1 | 衣服      | 海南省    | 三亞市    | 2015-10-05 09:32:01 | 3714.15
(1 row)
teledb=# fetch relative 2 from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
3 | 設備      | 福建省    | 三明市    | 2015-10-05 11:21:54 | 6351.44
(1 row)
teledb=# fetch relative 2 from teledb_cur;
id |       goodsdesc       | beginunit | begincity |       pubtime       | amount  
----+-----------------------+-----------+-----------+---------------------+---------
5 | 5 0鏟車,后八輪翻斗車 | 河南省    | 三門峽市  | 2015-10-05 07:53:13 | 6252.91
(1 row)
teledb=# fetch relative -2 from teledb_cur;
id | goodsdesc | beginunit | begincity |       pubtime       | amount  
----+-----------+-----------+-----------+---------------------+---------
3 | 設備      | 福建省    | 三明市    | 2015-10-05 11:21:54 | 6351.44
(1 row)每次提取游標都會移動到指定位置,下一個命令從當前位置出發,relative 2代表后面的第2條記錄。
提取后x行數據
teledb=# fetch forward 2 from teledb_cur;
id |       goodsdesc       | beginunit | begincity |       pubtime       | amount  
----+-----------------------+-----------+-----------+---------------------+---------
4 | 普貨                  | 福建省    | 三明市    | 2015-10-05 15:19:17 | 7626.41
5 | 5 0鏟車,后八輪翻斗車 | 河南省    | 三門峽市  | 2015-10-05 07:53:13 | 6252.91
(2 rows)
teledb=# fetch forward 2 from teledb_cur;
id |  goodsdesc   | beginunit | begincity |       pubtime       | amount  
----+--------------+-----------+-----------+---------------------+---------
6 | 鮮香菇2000斤 | 河南省    | 三門峽市  | 2015-10-05 10:38:29 | 1828.83
7 | 旋挖附件38噸 | 河南省    | 三門峽市  | 2015-10-05 10:48:38 |  9376.8
(2 rows)提取剩下的所有數據
游標順序往下遍歷,提取所有數據。
teledb=# fetch forward all from teledb_cur;
id |       goodsdesc        | beginunit | begincity |       pubtime       | amount  
----+------------------------+-----------+-----------+---------------------+---------
8 | 旋挖附件35噸           | 河南省    | 三門峽市  | 2015-10-05 10:48:38 | 9885.95
9 | 旋挖附件39噸           | 河南省    | 三門峽市  | 2015-10-05 11:38:38 | 4971.79
10 | 設備                   | 上海市    | 上海市    | 2015-10-05 07:59:35 | 1784.63
11 | 普貨40噸需13米半掛一輛 | 上海市    | 上海市    | 2015-10-05 08:13:59 | 1425.64
(4 rows)反向提取x行數據
teledb=# fetch backward 2 from teledb_cur;
id |       goodsdesc        | beginunit | begincity |       pubtime       | amount  
----+------------------------+-----------+-----------+---------------------+---------
11 | 普貨40噸需13米半掛一輛 | 上海市    | 上海市    | 2015-10-05 08:13:59 | 1425.64
10 | 設備                   | 上海市    | 上海市    | 2015-10-05 07:59:35 | 1784.63
(2 rows)
teledb=# fetch backward 3 from teledb_cur;
id |  goodsdesc   | beginunit | begincity |       pubtime       | amount  
----+--------------+-----------+-----------+---------------------+---------
9 | 旋挖附件39噸 | 河南省    | 三門峽市  | 2015-10-05 11:38:38 | 4971.79
8 | 旋挖附件35噸 | 河南省    | 三門峽市  | 2015-10-05 10:48:38 | 9885.95
7 | 旋挖附件38噸 | 河南省    | 三門峽市  | 2015-10-05 10:48:38 |  9376.8
(3 rows)游標反向移動,提取x行數據。
反向提取所有數據
游標反向移動,提取直到第1條數據。
teledb=# fetch backward all from teledb_cur;
id |       goodsdesc       | beginunit | begincity |       pubtime       | amount  
----+-----------------------+-----------+-----------+---------------------+---------
6 | 鮮香菇2000斤          | 河南省    | 三門峽市  | 2015-10-05 10:38:29 | 1828.83
5 | 5 0鏟車,后八輪翻斗車 | 河南省    | 三門峽市  | 2015-10-05 07:53:13 | 6252.91
4 | 普貨                  | 福建省    | 三明市    | 2015-10-05 15:19:17 | 7626.41
3 | 設備                  | 福建省    | 三明市    | 2015-10-05 11:21:54 | 6351.44
2 | 建筑設備              | 福建省    | 三明市    | 2015-10-05 07:21:22 | 8195.98
1 | 衣服                  | 海南省    | 三亞市    | 2015-10-05 09:32:01 | 3714.15
(6 rows)