游標使用
更新時間 2025-02-05 09:37:09
最近更新時間: 2025-02-05 09:37:09
分享文章
本頁介紹天翼云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)