Postgresql 在Pl/pgSQL中使用FOR循环时,它在Postgres 11.8中不起作用

Postgresql 在Pl/pgSQL中使用FOR循环时,它在Postgres 11.8中不起作用,postgresql,function,for-loop,plpgsql,Postgresql,Function,For Loop,Plpgsql,我正在尝试PostgreSQLTutorial网站上的for循环示例,这是正在使用的示例数据库。问题是我无法工作,例如: 当我运行select for_loop_to_query(5)时我一点结果都没有! 我试过在DataGrip和pgAdmin4中运行它,PostgreSQL版本是11.8在Fedora 30操作系统上运行。此外,我还尝试将n参数类型替换为int,而不是INTEGER我是否缺少某些内容(命令/附加设置)?非常感谢您的帮助/建议 p.S.关于他们的示例,据说已经安装了Postgr

我正在尝试PostgreSQLTutorial网站上的for循环示例,这是正在使用的示例数据库。问题是我无法工作,例如:

当我运行
select for_loop_to_query(5)时我一点结果都没有!
我试过在DataGrip和pgAdmin4中运行它,PostgreSQL版本是11.8Fedora 30操作系统上运行。此外,我还尝试将n参数类型替换为
int
,而不是
INTEGER

我是否缺少某些内容(命令/附加设置)?非常感谢您的帮助/建议

p.S.关于他们的示例,据说已经安装了PostgreSQL 11.3,所以我猜他们的示例必须在比我的版本更旧的PostgreSQL上运行

更新1:
例外输出应为:

注意:恐龙学院
注意:Ace金手指
注意:自适应孔
注意:事件偏见
注意:非洲鸡蛋

我得到的输出:

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)
。。。当我执行以下两个命令时
sudo su-postgres
psql DVD出租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中调用此函数时,会出现什么问题?有什么想法吗?

对于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)
由于您的函数不返回任何数据,因此您只能在pgAdmin4中的
消息
选项卡中获取提升通知消息

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.

在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)
由于您的函数不返回任何数据,因此您只能在pgAdmin4中的
消息
选项卡中获取提升通知消息

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.

但我的表中确实有数据,请将您的输出发布到
psql
,并详细说明您的预期输出:注意消息?函数结果?更新了我的问题,正如您在上次评论中所问的,请查看客户端应用程序中的
发出通知
消息您需要一个能够从数据库端检索此数据的应用程序:pgAdmin知道如何做,但我无法告诉您有关数据网格的信息(
raisenotice
消息与通常DML返回的数据不同,如
SELECT
语句)。是的,我已经检查了类似的“Message”选项卡/选项(如pgAdmin4)在DataGrip中,它确实以“输出”控制台的形式存在……显然,在它向我显示ResultSet的其他选项卡时,我一直在监督它。再次感谢你。:)但是我的表中确实有数据,请发布您与
psql
的输出,并详细说明您的预期输出:注意消息?函数结果?更新了我的问题,正如您在上次评论中所问的,请查看客户端应用程序中的
发出通知
消息您需要一个能够检索此数据的应用程序来自数据库端的a:pgAdmin知道如何执行此操作,但我无法说明数据网格(
raisenotice
消息与通常DML返回的数据不同,如
SELECT
语句)。确实,我已检查类似的“Message”选项卡/选项(如pgAdmin4)在DataGrip中,它确实以“输出”控制台的形式存在……显然,在它向我显示ResultSet的其他选项卡时,我一直在监督它。再次感谢你。:)