Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays plpgsql text[]varchar[]数组不工作_Arrays_Postgresql_Plpgsql_Postgresql 9.2 - Fatal编程技术网

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

Arrays plpgsql text[]varchar[]数组不工作,arrays,postgresql,plpgsql,postgresql-9.2,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 Messda

我的目的是将表的名称分配到一个数组中,并通过该数组将它们放入
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[]尝试了相同的代码,但也不起作用。如果您有任何帮助,我们将不胜感激。

您使用的plpgsql版本是什么?当你询问某件事时,如果你添加这条信息是很方便的

删除表的语法是

drop table [if exists] **name** [CASCADE] [RESTRICT]
t的值看起来不像表的名称

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

有几个错误:

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

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

    做$$ 声明 表varchar[]:=ARRAY['t1','t2']; t-varchar; 开始 数组表中的FOREACH t 环 执行格式('删除表%I',t); 端环; 结束; $$;

版本是9.2。我已经在没有foreach循环的情况下测试了它,将其作为DROP TABLE“name\u of_TABLE”进行测试,并按照预期工作。现在我试图创建一个数组,将表名放在那里,并在foreach循环中使用这个数组,以防止编写相同的代码。因此“t”不是表名,而是表示foreach循环中的表名。我知道t不是表名,而是占位符。我想说的是:您的表名是否真的等于例如ID:889197824 CH:0006 Messdaten2?我想不是是的,它们是正确的名称,但在日志中我看到了这样一个错误:Table»t«不存在。Foreach循环的构建可能有点错误,可能占位符没有正常工作如果我尝试创建一个具有该名称的表,然后返回一个错误,因为afaik只是postgresql名称中允许的字母、数字和下划线。因此没有分号和空格。它可以以字母或下划线开头,而不是数字。Postgresql会认为表名以空格结尾。如果我必须使用2或3个变量怎么办?例如,t代表%I,z代表%z,h代表%h,我是否必须根据它们使用的顺序添加它们?如果我先使用%I,然后使用%H,然后使用%Z,我应该添加:执行格式('DROP TABLE%I,其中%H=%Z',t,H,Z)?格式('DROP TABLE%I,其中%I=%L',t,H,Z)-@mctuna:
DROP TABLE WHERE?您可能正在考虑从tbl中删除…
@ErwinBrandstetter您是对的,我只是举了一个例子 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; $$;