Подтвердить что ты не робот

Курсоры PostgreSQL

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

DECLARE cur_employees CURSOR FOR
  SELECT *
  FROM   employee

CLOSE cur_employees 

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

4b9b3361

Ответ 1

Вы очень редко хотите явно использовать курсоры вообще в 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 имеет дело с открытием, привязкой, извлечением и закрытием (подробнее на declarations и структуры управления).

С 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, хотя опять-таки это сравнительно редкий случай использования.

Ответ 2

Как правило, для курсора есть DECLARE, затем OPEN курсора (который материализует результирующий набор), несколько операций FETCH для извлечения строк из набора результатов отдельно, а затем делает CLOSE курсора.

У вас появляется DECLARE, за которым следует CLOSE. Таким образом, ваша синтаксическая ошибка, так как вы никогда не открывали OPEN.