2015-10-29 3 views
0

Я пытаюсь выполнить петлю через результат курсора (plpgsql), но как-то ничего не печатается на выходной консоли.Перемещение по курсору результатов

Как реализовать правильный цикл?

базы данных Версия: 9,0 Таблица магазины с колоннами ID, имя

+0

Этот вопрос также должен содержать определение таблицы и версию Postgres. –

+0

@ErwinBrandstetter обновил вопрос – Pradeep

+0

Но это не определение таблицы. Определение таблицы - это полный скрипт CREATE TABLE, показывающий типы данных и ограничения, или то, что вы получаете с помощью '\ d tbl' в psql. –

ответ

1

Прежде всего, ваша функция не возврат ничего, вы просто производить уведомления. В pgAdmin они будут выводиться на панели «Сообщения», а не на панели «Выход данных».

Я предполагаю, что вы хотите фактически вернуть значения ...
Но, как правило, вам не нужен явный курсор для цикла. Используйте более удобный неявное курсор в FOR цикла:

CREATE OR REPLACE FUNCTION test_loop() 
    RETURNS SETOF int AS 
$func$ 
DECLARE 
    _id int; -- assuming data type integer 
BEGIN 
    FOR _id IN 
     SELECT id FROM stores ORDER BY id 
    LOOP 
     RETURN NEXT _id; 
    END LOOP; 
END 
$func$ LANGUAGE plpgsql; 

Обратите внимание на синтаксис вызова:

SELECT * FROM test_loop(); 

Как правило, вы даже не нужен цикл. Попросту SQL ...

CREATE OR REPLACE FUNCTION test_loop1() 
    RETURNS SETOF int AS 
$func$ 
BEGIN 
    RETURN QUERY 
    SELECT id FROM stores ORDER BY id; 
END 
$func$ LANGUAGE plpgsql; 

Что может быть упрощена к функции SQL:

CREATE OR REPLACE FUNCTION test_loop2() 
    RETURNS SETOF int AS 
$func$ 
    SELECT id FROM stores ORDER BY id; 
$func$ LANGUAGE sql; 

Похожие ответы с большим количеством деталей и объяснения:

+0

Да. Первый пример работает. Но что, если я не хочу использовать цикл? Как я могу затем прочитать значения отдельно и вернуть их? – Pradeep

Смежные вопросы