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

标签 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[] 来编写相同的代码,但都不起作用。任何帮助将不胜感激

最佳答案

有几个错误:

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

  • 您应该对参数化 DDL 语句(语句 EXECUTE)使用动态 SQL。 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;
    $$;
    

关于arrays - plpgsql text[] varchar[] 数组不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16709335/

相关文章:

sql - 如何在 PostgreSQL 事务中使用变量

postgresql - 使用动态字段名称触发

c - 为了安全起见,我应该始终动态分配数组吗?

arrays - 无法从按特定 header 过滤的 CSV 文件中提取第一行

c# - 当数据库只有 1 个小数位 C# MVC Postgres 时,DropDownList 显示 4 个小数位

sql - 使用模式变量创建索引的函数

postgresql - Postgres 函数 : return multiple tables

javascript - 选择框的 JavaScript 中的年份范围

android - 将数组列表转换为稀疏数组

python - 无法安装psycopg2(pip install psycopg2)