PostgreSQL — Курсор

Опубликовано: 4 Октября, 2022

Курсор в PostgreSQL используется для обработки больших таблиц. Предположим, что в таблице 10 миллионов или миллиард строк. При выполнении операции SELECT над таблицей обработка результата займет некоторое время и, скорее всего, выдаст ошибку «недостаточно памяти» и программа будет завершена.

Курсор может быть объявлен только внутри транзакции. Курсор не вычисляет данные, а только подготавливает запрос, чтобы ваши данные могли быть созданы при вызове FETCH. В конце просто зафиксируйте транзакцию.

Синтаксис:

DECLARE 
    [cursor_name] CURSOR FOR [query]

Давайте проанализируем приведенный выше синтаксис:

  • Используйте DECLARE для объявления курсора
  • [cursor_name] — дать любое имя курсору
  • [запрос] — отправить запрос к курсору

После объявления курсора мы можем получить данные с помощью 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;

Подтвердите транзакцию в конце.