如何在PL / pgSQL中遍历SELECT查询结果?

时间:2018-12-10 15:59:59

标签: postgresql plpgsql information-schema

我正在尝试运行一个SELECT查询,然后对于每个结果,我想在控制台中打印一些内容。但是,我没有结果,也不知道为什么。如果我自己运行SELECT,我会执行获取表名。

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

1 个答案:

答案 0 :(得分:1)

您排除了可见性问题(缺少感兴趣的表的特权)。参见:

RAISE NOTICE在与查询结果不同的通道上返回消息-(“数据输出”)。我怀疑以下情况之一:

  1. 找错地方了?这取决于您未公开的客户。在标准GUI pgAdmin III或pgAdmin4中,“数据输出”和 “消息” ...

  2. 有单独的选项卡
  3. 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();