如何使用查询结果作为表名?

问题描述 投票:0回答:1

我需要从我的数据库中删除一些序列,有很多这样的序列,所以我想编写一条 SQL 语句来一次删除它们,所以我这样做了:

do
$$
declare rec RECORD;
begin
FOR rec in
    select relname from pg_class where relkind = 'S' and relname like 'XXX_%_seq'
loop 
    drop sequence rec.relname; # HERE is the problem, I cannot directly use rec.relname here
end loop;
end;
$$

如何将

rec.relname
drop sequence
一起使用?

postgresql
1个回答
0
投票

要在 PL/pgSQL 块中使用 rec.relname 动态删除序列,您不能直接将 DROP SEQUENCE 与记录属性一起使用。相反,您需要将动态 SQL 与 EXECUTE 语句结合使用。您可以通过以下方式修改代码来实现此目的:

    DO
$$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN
        SELECT relname FROM pg_class WHERE relkind = 'S' AND relname LIKE 'XXX_%_seq'
    LOOP
        EXECUTE 'DROP SEQUENCE ' || quote_ident(rec.relname);
    END LOOP;
END;
$$

quote_ident 函数用于在需要时安全地引用标识符,例如,如果您的序列名称包含特殊字符或保留字。

© www.soinside.com 2019 - 2024. All rights reserved.