【发布时间】:2016-06-04 04:49:42
【问题描述】:
我是 plpgsql 的新手。我正在尝试使用变量作为 plpgsql 中的表名在 plpgsql 中运行一个简单的查询。但是变量被解释为表名,而不是变量的值被解释为变量名。
DECLARE
v_table text;
z_table text;
max_id bigint;
BEGIN
FOR v_table IN
SELECT table_name
FROM information_schema.tables
WHERE table_catalog = 'my_database'
AND table_schema = 'public'
AND table_name not like 'z_%'
LOOP
z_table := 'z_' || v_table;
SELECT max(id) from z_table INTO max_id;
DELETE FROM v_table where id > max_id;
END LOOP;
一些背景信息。对于我数据库中的每个表,我都有另一个以“z_”开头的表。例如。对于名为“employee”的表,我有一个名为“z_employee”的相同表。 z_employee 包含与员工相同的数据集。我用它在每次测试开始时恢复员工表。
当我运行这个函数时,我得到以下错误:
ERROR: relation "z_table" does not exist
LINE 1: SELECT max(id) from z_table
我的猜测是我不允许在 SQL 查询中使用变量 z_table。至少不是我在这里使用它的方式。但是我不知道应该怎么做。
【问题讨论】:
-
太棒了!我将行更改为 EXECUTE 'SELECT max(id) from ' || z_table INTO max_id;它奏效了。太糟糕了,现在我的下一行有问题。已更改为 EXECUTE 'DELETE FROM ' || v_table || ' 哪里 id > ' ||最大ID;。当没有要删除的内容时,此查询似乎会阻塞。
-
我的英语太差了,无法理解在这种情况下“扼流圈”是什么意思:) 顺便说一句,尝试使用
max_id作为参数,如execute 'DELETE FROM ' || v_table || ' WHERE id > $1' using max_id;。 -
这是我的错误。我以为没有什么要删除的时候有问题,但我意识到问题发生在 table 为空时,然后 max_id 变为 null。所以我放了 IF max_id IS NOT NULL THEN ... 来防止这种情况。也感谢您的参数建议。
-
请始终包含函数头。它是功能的一个组成部分。还有你的 Postgres 版本。
标签: postgresql plpgsql dynamic-sql