PostgreSQL – 游标
PostgreSQL 中的 Cursor 用于处理大表。假设一个表有 1000 万或 10 亿行。在对表执行 SELECT 操作时,处理结果需要一些时间,很可能会出现“内存不足”错误,程序将终止。
Cursor 只能在事务中声明。游标不会计算数据,而只会准备查询,以便在调用 FETCH 时可以创建您的数据。最后,只需提交事务即可。
句法:
DECLARE
[cursor_name] CURSOR FOR [query]
我们来分析一下上面的语法:
- 使用 DECLARE 声明游标
- [cursor_name] – 为游标指定任何名称
- [query] – 对游标进行查询
声明游标后,我们可以使用 FETCH 获取数据。 FETCH 从游标中获取下一行。如果未找到行,则返回 NULL。
句法:
FETCH [direction (rows)] FROM [cursor_name];
where direction can be empty,
number of rows you want or one of the following:
NEXT
PRIOR
FIRST
LAST
ABSOLUTE count
RELATIVE count
count
ALL
FORWARD
FORWARD count
FORWARD ALL
BACKWARD
BACKWARD count
BACKWARD ALL
让我们使用以下命令创建一个示例表作为示例:
CREATE TABLE students (
student_id serial PRIMARY KEY,
full_name VARCHAR NOT NULL,
branch_id INT
);
将数据插入到学生表中,如下所示:
INSERT INTO students (
student_id,
full_name,
branch_id
)
VALUES
(1, 'M.S Dhoni', NULL),
(2, 'Sachin Tendulkar', 1),
(3, 'R. Sharma', 1),
(4, 'S. Raina', 1),
(5, 'B. Kumar', 1),
(6, 'Y. Singh', 2),
(7, 'Virender Sehwag ', 2),
(8, 'Ajinkya Rahane', 2),
(9, 'Shikhar Dhawan', 2),
(10, 'Mohammed Shami', 3),
(11, 'Shreyas Iyer', 3),
(12, 'Mayank Agarwal', 3),
(13, 'K. L. Rahul', 3),
(14, 'Hardik Pandya', 4),
(15, 'Dinesh Karthik', 4),
(16, 'Jasprit Bumrah', 7),
(17, 'Kuldeep Yadav', 7),
(18, 'Yuzvendra Chahal', 8),
(19, 'Rishabh Pant', 8),
(20, 'Sanju Samson', 8);
现在表已经准备好了,我们可以声明我们的游标。
BEGIN;
DECLARE
my_cursor CURSOR FOR SELECT * FROM students;
取数据。
FETCH 10 FROM my_cursor;
输出:
FETCH PRIOR FROM my_cursor;
FETCH PRIOR FROM my_cursor;
上面的查询会给你第 9 行和第 8 行,因为现在我们的光标在 10 处;
FETCH 6 FROM my_cursor;
输出:
COMMIT;
最后提交事务。