PostgreSQL курсоры - PullRequest
       6

PostgreSQL курсоры

12 голосов
/ 24 декабря 2011

Я пытаюсь изучить основные курсоры, используя PostgreSQL.Это мой сценарий:

DECLARE cur_employees CURSOR FOR
  SELECT *
  FROM   employee

CLOSE cur_employees 

Я хочу просмотреть список и вывести те, которые активны.С чего мне начать?

Ответы [ 2 ]

25 голосов
/ 27 декабря 2011

Вы очень редко хотите явно использовать курсоры в PostgreSQL, даже когда обработка запроса приводит к plpgsql.Это заметно отличается от многих других баз данных SQL, где они используются почти все время.

В plpgsql вы можете просто написать что-то вроде:

DECLARE
  emp employee%rowtype;
BEGIN
  FOR emp IN SELECT * FROM employee LOOP
    IF emp.active THEN
      RAISE INFO 'Active: %', emp.employee_id
    END IF;
  END LOOP;
END

В приведенном выше языке plpgsqlОбработчик имеет дело с открытием, связыванием, извлечением и закрытием (подробнее о объявлениях и управляющих структурах ).

С PostgreSQL из 9.0 вы можете просто перейти к выполнениюplpgsql используя блок "DO".Для предыдущих версий вам нужно создать функцию и выбрать ее.Если вы ищете эквивалент PostgreSQL, например, для перебора результата с курсором на SQL Server, это то, что есть.Обратите внимание, что итерации и т. Д. Являются не частью диалекта SQL, а только частью plpgsql (или любого другого из emebedded языков).

Синтаксис "DECLARE CURSOR xxx" на уровне SQL можно использовать следующим образом:

DECLARE cur_employees CURSOR FOR SELECT * FROM employee;
FETCH NEXT FROM cur_employees;
// etc..
CLOSE cur_employees;

Это можно использовать для тщательного получения только части набора результатов запроса.Однако использовать их необычно, так как обычно ваш клиентский драйвер предоставляет какую-то функциональность для этого (например, прокручиваемые наборы результатов в JDBC).Вы также можете возвращать курсоры из функций, похожих на Oracle, хотя, опять же, это сравнительно редкий вариант использования.

0 голосов
/ 24 декабря 2011

Как правило, один имеет DECLARE для курсора, затем OPEN курсора (который материализует набор результатов), несколько операций FETCH для извлечения строк из набора результатов по отдельности, а затем один выполняет ЗАКРЫТИЕ курсора.

У вас, кажется, есть ЗАЯВЛЕНИЕ, а затем ЗАКРЫТИЕ. Таким образом, ваша синтаксическая ошибка, как вы никогда не делали ОТКРЫТО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...