如何在 PL/pgSQL 中迭代 SELECT 查询结果?
How to iterate over SELECT query results in PL/pgSQL?
我正在尝试 运行 SELECT
查询,然后对于每个结果我想在控制台中打印一些内容。但是,我没有得到任何结果,我也不知道为什么。如果我 运行 自己 SELECT
我 做 得到 table 个名字。
create or replace function test()
RETURNS void AS
$body$
DECLARE
elem text;
begin
FOR elem IN
SELECT table_name FROM information_schema.tables WHERE table_name ~ 'api_configuration_'
LOOP
raise notice 'Table name is: %', elem;
END LOOP;
end;
$body$
LANGUAGE plpgsql
我想打印查询
找到的每个table_name
您排除了可见性问题(缺少相关表的权限)。参见:
- How to check if a table exists in a given schema
RAISE NOTICE
returns 消息 - 在与查询结果 ("data output") 不同的频道上。我怀疑有以下情况之一:
找错地方了?这取决于您未公开的客户。在标准 GUI pgAdmin III 或 pgAdmin4 中,"Data Output" 和 "Messages" ...[=20 有单独的选项卡=]
client_min_messages
设置是否高于 NOTICE
?在函数中尝试 RAISE WARNING
;虽然不是 EXCEPTION
,但会立即取消执行。或者重置 GUC - 您可以在当前会话中进行本地测试,而无需触及服务器配置:
SET client_min_messages = 'NOTICE';
然后重试。
要快速验证 PL/pgSQL 循环和查询是否按预期工作,请使用实际 数据输出尝试此等效函数:
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF text AS
$func$
DECLARE
elem text;
BEGIN
FOR elem IN
SELECT table_name FROM information_schema.tables
WHERE table_name ~ 'api_configuration_'
LOOP
RETURN NEXT elem;
-- RAISE NOTICE 'Table name is: %', elem;
END LOOP;
END
$func$ LANGUAGE plpgsql;
通话:
SELECT * FROM test();
我正在尝试 运行 SELECT
查询,然后对于每个结果我想在控制台中打印一些内容。但是,我没有得到任何结果,我也不知道为什么。如果我 运行 自己 SELECT
我 做 得到 table 个名字。
create or replace function test()
RETURNS void AS
$body$
DECLARE
elem text;
begin
FOR elem IN
SELECT table_name FROM information_schema.tables WHERE table_name ~ 'api_configuration_'
LOOP
raise notice 'Table name is: %', elem;
END LOOP;
end;
$body$
LANGUAGE plpgsql
我想打印查询
找到的每个table_name
您排除了可见性问题(缺少相关表的权限)。参见:
- How to check if a table exists in a given schema
RAISE NOTICE
returns 消息 - 在与查询结果 ("data output") 不同的频道上。我怀疑有以下情况之一:
找错地方了?这取决于您未公开的客户。在标准 GUI pgAdmin III 或 pgAdmin4 中,"Data Output" 和 "Messages" ...[=20 有单独的选项卡=]
client_min_messages
设置是否高于NOTICE
?在函数中尝试RAISE WARNING
;虽然不是EXCEPTION
,但会立即取消执行。或者重置 GUC - 您可以在当前会话中进行本地测试,而无需触及服务器配置:SET client_min_messages = 'NOTICE';
然后重试。
要快速验证 PL/pgSQL 循环和查询是否按预期工作,请使用实际 数据输出尝试此等效函数:
CREATE OR REPLACE FUNCTION test()
RETURNS SETOF text AS
$func$
DECLARE
elem text;
BEGIN
FOR elem IN
SELECT table_name FROM information_schema.tables
WHERE table_name ~ 'api_configuration_'
LOOP
RETURN NEXT elem;
-- RAISE NOTICE 'Table name is: %', elem;
END LOOP;
END
$func$ LANGUAGE plpgsql;
通话:
SELECT * FROM test();