5

我的目的是将表的名称分配到一个数组中,并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[] 尝试了相同的代码,但也没有工作。任何帮助,将不胜感激

4

2 回答 2

16

有几个错误:

  • 您不能对字符串文字使用双引号(它用于区分大小写的 SQL 标识符)

  • 您应该对参数化的 DDL 语句(语句 EXECUTE)使用动态 SQL。DDL 语句没有执行计划并且这些语句不支持参数化(你不应该在那里使用变量)

    做$$
    宣布
      表 varchar[] := ARRAY['t1','t2'];
      t varchar;
    开始
      FOREACH t IN ARRAY 表
      环形
        EXECUTE format('DROP TABLE %I', t);
      结束循环;
    结尾;
    $$;
    
于 2013-05-23T10:17:15.107 回答
0

您使用的 plpgsql 是什么版本?如果您在询问某事时添加该信息,会很方便。

删除表的语法是

drop table [if exists] **name** [CASCADE] [RESTRICT]

t 的值看起来不像表的名称。

其他可能的解释:您的函数应该返回 void,因此它不显示任何内容是正确的。你的意思是表没有被删除?您是否首先使用 t 对其进行了测试并尝试在其中一个表上进行插入以查明您尝试删除的表是否存在?执行函数的人是表的所有者吗?

于 2013-05-23T09:08:46.453 回答