如何在 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") 不同的频道上。我怀疑有以下情况之一:

  1. 找错地方了?这取决于您未公开的客户。在标准 GUI pgAdmin III 或 pgAdmin4 中,"Data Output" 和 "Messages" ...[=20 有单独的选项卡=]

  2. 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();