PL/pgSQL函数中的动态SELECT INTO

9

我如何在Postgres中的PL/pgSQL函数中编写动态的SELECT INTO查询?

假设我有一个名为tb_name的变量,它是从information_schema.tables中的FOR循环中填充的。现在我有一个名为tc的变量,它将获取每个表的行数。我想要类似下面的东西:

FOR tb_name in select table_name from information_schema.tables where table_schema='some_schema' and table_name like '%1%'
LOOP
EXECUTE FORMAT('select count(*) into' || tc 'from' || tb_name);
END LOOP

在这种情况下,tb_nametc的数据类型应该是什么?

1
请参考手册中的示例:https://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN - user330315
2个回答

12
CREATE OR REPLACE FUNCTION myfunc(_tbl_pattern text, _schema text = 'public')
  RETURNS void  -- or whatever you want to return
  LANGUAGE plpgsql AS
$func$
DECLARE
   _tb_name information_schema.tables.table_name%TYPE;  -- currently varchar
   _tc      bigint;  -- count() returns bigint
BEGIN
   FOR _tb_name IN
      SELECT table_name
      FROM   information_schema.tables
      WHERE  table_schema = _schema
      AND    table_name   ~ _tbl_pattern  -- see below!
   LOOP
      EXECUTE format('SELECT count(*) FROM %I.%I', _schema, _tb_name)
      INTO _tc;      

      -- do something with _tc
   END LOOP;
END
$func$;

注意事项


回应你的评论:要传递,请使用USING子句,例如:
EXECUTE format('SELECT count(*) FROM %I.%I
                WHERE some_column = $1', _schema, _tb_name,column_name)
USING user_def_variable;

相关内容:

EXECUTE format('SELECT count() FROM %I.%I', _schema, _tb_name) 我该如何在这个select语句中使用where条件呢? 例如: EXECUTE format('SELECT count() FROM %I.%I WHERE some_column=user_def_variable ', _schema, _tb_name,column_name) - Karthik
@Karthik:我添加了一个答案。请记得提出问题作为问题。评论不是合适的地方。 - Erwin Brandstetter

1
似乎你想要在FORMAT中使用%I占位符,这样它才能将你的变量视为标识符。此外,INTO子句应该放在准备好的语句外面
FOR tb_name in select table_name from information_schema.tables where table_schema='some_schema' and table_name like '%1%'
LOOP
  EXECUTE FORMAT('select count(*) from %I', tb_name) INTO tc;
END LOOP

1
使用表名而不加模式限定符会导致一个隐蔽的错误,我添加了一些说明。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接