PostgreSQL — Курсор
Курсор в 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;
Подтвердите транзакцию в конце.