2011-12-24 3 views
12

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

DECLARE cur_employees CURSOR FOR 
    SELECT * 
    FROM employee 

CLOSE cur_employees 

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

+1

Начните с добавления предложения WHERE для выбора активных. – aib

+2

Прочитайте [главу о курсорах в руководстве] (http://www.postgresql.org/docs/9.1/interactive/plpgsql-cursors.html). –

+0

я сделал, как вы сказали мне: DECLARE cur_employees CURSOR FOR SELECT * ОТ сотрудника где Active = «ACTIVE» ЗАКРЫТЬ cur_employees , но я получаю следующее сообщение об ошибке: – Karl

ответ

24

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

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

«DECLARE CURSOR ххх» синтаксис на уровне SQL может использоваться как это:

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

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

+4

+1 Высокое качество ответа еще раз. –

+1

И помните, что 90%% того, что люди пытаются использовать cusors for, было бы лучше обработано с помощью операций на основе набора. Вы почти никогда не должны думать о том, чтобы зацикливаться на наборе данных, и никто, кроме опытного dba, не должен думать о написании курсора. Это один из тех методов, которые вам не следует изучать, пока вы не станете старшим и не знаете, когда это уместно. Если вы просто изучаете SQl, пропустите этот тест около десяти лет. – HLGEM

0

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

У вас появляется DECLARE, за которым следует ЗАКРЫТЬ. Таким образом, ваша синтаксическая ошибка, поскольку вы никогда не делали ОТКРЫТЬ.

+0

Hm. Карл не упомянул, хочет ли он использовать курсоры с SQL или с pl/pgsql.Для SQL нет 'OPEN', потому что это неявно выполняется' DECLARE'. –