plpgsql text[] varchar[] 数组不工作

Posted

技术标签:

【中文标题】plpgsql text[] varchar[] 数组不工作【英文标题】:plpgsql text[] varchar[] array not working 【发布时间】:2013-05-23 08:43:03 【问题描述】:

我的目的是将表的名称分配到一个数组中,并通过该数组将它们放入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[] 的相同代码,但也无法正常工作。任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

有几个错误:

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

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

做$$ 宣布 表 varchar[] := ARRAY['t1','t2']; t varchar; 开始 FOREACH t IN ARRAY 表 环形 EXECUTE format('DROP TABLE %I', t); 结束循环; 结尾; $$;

【讨论】:

如果我必须使用 2 或 3 个变量怎么办? t 代表 %I,z 代表 %Z,h 代表 %H,例如,我是否必须根据它们使用的顺序添加它们?如果我先使用 %I 然后 %H 然后 %Z 我应该添加: EXECUTE format ('DROP TABLE %I WHERE %H = %Z',t,h,z) ? format('DROP TABLE %I WHERE %I = %L', t, h, z) - postgresql.org/docs/9.2/static/functions-string.html @mctuna: DROP TABLE WHERE .. ?你可能在想DELETE FROM tbl WHERE ... @ErwinBrandstetter 你说得对,不过我只是举个例子【参考方案2】:

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

删除表的语法是

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

t 的值看起来不像表名。

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

【讨论】:

版本为 9.2。我已经在没有 foreach 循环的情况下将它作为 DROP TABLE "name_of_table" 进行了测试,并且它按预期工作。现在我正在尝试创建一个数组,将表名放在那里,并在 foreach 循环中使用这个数组,以防止编写相同的代码。因此“t”不是表名,而是代表foreach循环中的表名 我明白 t 不是表名,而是占位符。我想说的是:您真的有等于例如 ID:889197824 CH:0006 Messdaten2 的表名吗?我猜不会。 :-) 是的,它们是正确的名称,但在日志中我看到了这样的错误:表 »t« 不存在。 Foreach 循环可能以某种方式构建错误,占位符无法正常运行 如果我尝试使用该名称创建表,则返回错误,因为 afaik 仅允许在 postgresql 名称中使用字母、数字和下划线。因此没有分号和空格。它可以以字母或下划线开头,而不是数字。 Postgresql 会认为表名以空格结尾。

以上是关于plpgsql text[] varchar[] 数组不工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 plpgsql 函数插入数据?

plpgsql 函数 concat 可选参数 返回错误

PLPGSQL 数组赋值不起作用,“赋值中的数组下标不能为空”

plpgsql 在我的 greenplum 4.3.5.x 中不起作用

plpgsql光标在unnest函数上

将数组数组取消嵌套到 plpgsql 中的简单数组