FOR-l oop НЕ работает в Postgres 11.8 при использовании в Pl / pgSQL - PullRequest
0 голосов
/ 19 июня 2020

Я пробую примеры для циклов FOR с веб-сайта PostgreSQLTutorial по этой ссылке и , это - это образец базы данных, который используется. Проблема в том, что я не могу приступить к работе, это следующий пример for-l oop:

CREATE OR REPLACE FUNCTION for_loop_through_query(
   n INTEGER DEFAULT 10
) 
RETURNS VOID AS $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT title 
           FROM film 
           ORDER BY title
           LIMIT n 
    LOOP 
    RAISE NOTICE '%', rec.title;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

Когда я запускаю select for_loop_through_query(5);, я не получаю никакого результата! Я пробовал запускать его в DataGrip, а также в pgAdmin4, и PostgreSQL версия - 11.8 на Fedora 30 OS. Также я попытался заменить тип аргумента n на int вместо INTEGER. Я что-то упустил ( команда / дополнительная настройка )? Любая помощь / совет приветствуются.

PS На их веб-сайте указано, что PostgreSQL 11.3 был установлен, поэтому я предполагаю, что их примеры должны быть запущены на не намного более старой версии PostgreSQL, чем моя.

UPDATE1: Исключенный вывод должен быть:

ПРИМЕЧАНИЕ: Academy Dinosaur ВНИМАНИЕ: Ace Goldfinger ВНИМАНИЕ: Отверстия для адаптации ВНИМАНИЕ: предубеждение в отношении романа ВНИМАНИЕ: African Egg

Результат, который я получаю:

postgres=# select * FROM version();
                                                version                                                 
--------------------------------------------------------------------------------------------------------
 PostgreSQL 11.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 9.3.1 20200408 (Red Hat 9.3.1-2), 64-bit
(1 row)

... и когда я выполняю 2 следующие команды sudo su - postgres и psql dvdrental postgres, я получаю следующий результат:

dvdrental=# select for_loop_through_query(5);
NOTICE:  Academy Dinosaur
NOTICE:  Ace Goldfinger
NOTICE:  Adaptation Holes
NOTICE:  Affair Prejudice
NOTICE:  African Egg
 for_loop_through_query 
------------------------

(1 row)

В чем проблема при вызове этой функции в DataGrip и pgAdmin4 ... есть идеи?

1 Ответ

2 голосов
/ 19 июня 2020

С PostgreSQL 11.8 это работает, если у вас есть данные в таблице.

Обратите внимание, что ваша функция возвращает void, поэтому у вас нет реального набора результатов: функция должна возвращать некоторые данные, иначе вы могли бы использовать процедура.

select * from version();
                                                 version                        

--------------------------------------------------------------------------------
-------------------------
 PostgreSQL 11.8 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (R
ed Hat 4.8.5-39), 64-bit
(1 row)

select * from film;
 title 
-------
 ABC0
 ABC1
 ABC2
 ABC3
 ABC4
 ABC5
 ABC6
 ABC7
 ABC8
(9 rows)

CREATE OR REPLACE FUNCTION for_loop_through_query(
   n INTEGER DEFAULT 10
) 
RETURNS VOID AS $$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT title 
           FROM film 
           ORDER BY title
           LIMIT n 
    LOOP 
    RAISE NOTICE '%', rec.title;
    END LOOP;
END;
$$ LANGUAGE plpgsql;
CREATE FUNCTION

select * from for_loop_through_query(5);
NOTICE:  ABC0
NOTICE:  ABC1
NOTICE:  ABC2
NOTICE:  ABC3
NOTICE:  ABC4
 for_loop_through_query 
------------------------

(1 row)

select for_loop_through_query(5);
NOTICE:  ABC0
NOTICE:  ABC1
NOTICE:  ABC2
NOTICE:  ABC3
NOTICE:  ABC4
 for_loop_through_query 
------------------------

(1 row)

Поскольку ваша функция не возвращает никаких данных, вы можете получать сообщения RAISE NOTICE в pgAdmin4 только на вкладке Messages :

NOTICE:  ABC0
NOTICE:  ABC1
NOTICE:  ABC2
NOTICE:  ABC3
NOTICE:  ABC4
NOTICE:  ABC5
NOTICE:  ABC6
NOTICE:  ABC7
NOTICE:  ABC8

Successfully run. Total query runtime: 54 msec.
1 rows affected.
...