postgresql - 使用 DO DECLARE 和 EXECUTE 的 Postgres DROP TABLE

标签 postgresql function execute drop-table

我正在尝试使用 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 语句返回“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$;

关于postgresql - 使用 DO DECLARE 和 EXECUTE 的 Postgres DROP TABLE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58607736/

相关文章:

c - 由于 C 中 'function' 的类型冲突,无法返回函数参数

javascript - 如何在点击div时执行代码?

mysql - 执行具有完整性约束的 'subset' 关系的最佳方法是什么

sql - 获得 10 个不同的项目以及相关任务的最新更新

postgresql - PL/Perl 触发器不能使用 .bashrc 中定义的 ENV 变量

javascript - 如何在 JavaScript 中创建可链接函数?

javascript - 当我只知道标题时如何将文本插入文本区域

PostgreSQL:VACUUM FULL 还是 CLUSTER?

javascript - jQuery - 如果移动设备重定向,则如果单击链接,则忽略第一个 if

在内存中复制一个函数并执行它