plpgsql text [] varchar []数组不起作用

时间:2013-05-23 08:43:04

标签: arrays postgresql plpgsql postgresql-9.2

我的目的是将表的名称分配到一个数组中,然后通过这个数组将它们放在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 []但不能正常工作。任何帮助将不胜感激

2 个答案:

答案 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测试它并尝试在其中一个表上插入以查明您尝试删除的表是否存在? 执行该功能的人是表的所有者吗?