我的目的是将表的名称分配到一个数组中,然后通过这个数组将它们放在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 []但不能正常工作。任何帮助将不胜感激
答案 0 :(得分:13)
有一些错误:
您不能对字符串文字使用双引号(它用于区分大小写的SQL标识符)
您应该将动态SQL用于参数化DDL语句(语句EXECUTE)。 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; $$;
答案 1 :(得分:0)
您正在使用的plpgsql的版本是什么?如果您在提出要求时添加该信息,这将非常方便。
删除表的语法是
drop table [if exists] **name** [CASCADE] [RESTRICT]
t的值看起来不像表的名称。
其他可能的解释: 你的函数应该返回void,因此它没有显示任何东西是正确的。你的意思是不删除表吗?您是否首先使用t测试它并尝试在其中一个表上插入以查明您尝试删除的表是否存在? 执行该功能的人是表的所有者吗?