Postgresql 在Pl/pgSQL中使用FOR循环时,它在Postgres 11.8中不起作用
我正在尝试PostgreSQLTutorial网站上的for循环示例,这是正在使用的示例数据库。问题是我无法工作,例如: 当我运行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
select for_loop_to_query(5)时代码>我一点结果都没有!
我试过在DataGrip和pgAdmin4中运行它,PostgreSQL版本是11.8在Fedora 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的其他选项卡时,我一直在监督它。再次感谢你。:)