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