我正在尝试使用 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/