Postgres DROP TABLE 使用 DO DECLARE 和 EXECUTE

Postgres DROP TABLE using DO DECLARE and EXECUTE

我正在尝试使用 EXECUTE 删除从查询返回的表。这是一个例子:

CREATE TABLE test_a (id BIGINT);
CREATE TABLE test_b (id BIGINT);

DO
$f$
DECLARE command TEXT;
BEGIN
SELECT INTO command 'SELECT ARRAY_TO_STRING(ARRAY_AGG($$DROP TABLE $$ || table_name), $$;$$) FROM information_schema.tables WHERE table_name ILIKE $$test%$$';
EXECUTE command;
END;
$f$;

SELECT 语句 returns "DROP TABLE test_a; DROP TABLE test_b”,我将其传递给声明的变量并尝试使用 EXECUTE 运行,但没有效果。我做错了什么?

PostgreSQL 9.5.18,由 Visual C++ build 1800 编译,64 位

您将字符串 SELECT ARRAY_TO_STRING ... 存储在该变量中,而不是 SELECT 语句的结果。

也可以将ARRAY_TO_STRING(ARRAY_AGG(..))简化为string_agg(),强烈推荐使用format()生成动态SQL,以妥善处理需要引号的标识符。

使用以下内容:

DO
$f$
DECLARE 
  command TEXT;
BEGIN

 SELECT string_agg(format('drop table %I', table_name), ';')
   INTO command
 FROM information_schema.tables 
 WHERE table_name ILIKE 'test%';

 execute command;
END;
$f$;