我的目的是将表的名称分配到一个数组中,并通过该数组将它们放入 foreach
循环中。
我实际上正在尝试做一些更复杂的事情,但在我尝试让以下代码工作之前:
CREATE OR REPLACE FUNCTION delete_auto()
RETURNS void AS
$BODY$DECLARE
t text;
tbl_array text[] = array["ID: 889197824 CH: 0006 Messdaten2","ID: 889197824 CH: 0006 Messdaten3","ID: 889197824 CH: 0006 Messdaten4"];
BEGIN
FOREACH t IN ARRAY tbl_array LOOP
DROP TABLE t;
END LOOP;
END; $BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION delete_auto()
OWNER TO postgres;
函数在我看来非常正确,但它不会删除表,在我执行它之后实际上什么也不做。我只是在日志中收到这样的错误:
Table »t« does not exist.
我也尝试过使用 varchar[] 而不是 text[] 来编写相同的代码,但都不起作用。任何帮助将不胜感激
最佳答案
有几个错误:
您不能对字符串文字使用双引号(它用于区分大小写的 SQL 标识符)
您应该对参数化 DDL 语句(语句 EXECUTE)使用动态 SQL。 DDL语句没有执行计划并且这些语句不支持参数化(你不应该在那里使用变量)
DO $$ DECLARE tables varchar[] := ARRAY['t1','t2']; t varchar; BEGIN FOREACH t IN ARRAY tables LOOP EXECUTE format('DROP TABLE %I', t); END LOOP; END; $$;
关于arrays - plpgsql text[] varchar[] 数组不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16709335/