如何在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_name
和tc
的数据类型应该是什么?
2条答案
按热度按时间8yoxcaq71#
字符串
备注
_
),以避免与表列的命名冲突。只是一个有用的约定。_tc
应该是**bigint
**,因为这是集合函数count()
返回的值。_tb_name
的资料类型是从其父数据行动态衍生而来:information_schema.tables.table_name
**%TYPE
* 请参阅手册中的“复印类型”一章。information_schema.tables
中列出数据表吗?有道理,但要注意其中的含义。请参阅:EXECUTE
动态查询传回的单一数据列或值指派给(row)变数的方式。一个 single 列(如本例中的count
)自动从行类型中分解出来,因此我们可以直接赋值给标量变量tc
--就像我们将一整行赋值给一个记录或行变量一样。相关信息:*结构描述限定动态查询中的数据表名称。在当前的
search_path
中可能存在同名的其他表,这将导致完全错误(并且非常混乱!)结果。鬼鬼祟祟的虫子!或者 this 模式根本不在search_path
中,这会使函数立即引发异常。table_name ~ _tbl_pattern
中使用了正则表达式运算符~
,而不是table_name LIKE ('%' || _tbl_pattern || '%')
,这样更简单。无论哪种方式,都要小心pattern参数中的特殊字符!请参阅:_schema text = 'public'
的数据。只是为了方便起见,你可能想要也可能不想要。请参阅:处理您的意见:要传递 * 值 *,请使用
USING
子句,如下所示:型
相关信息:
q43xntqr2#
看起来您需要
FORMAT
的%I
占位符,以便它将您的变量视为 identifier。另外,INTO
子句应该**在预准备语句之外。字符串