在PostgreSQL函数上使用变量删除模式

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

我正在尝试在PostgreSQL上创建一个函数,并且在使用局部变量时遇到一些问题。这是我的代码:

DECLARE query RECORD;
DECLARE schema_name TEXT;
BEGIN
        FOR query IN SELECT * FROM context WHERE created_at + make_interval(days => duration) <= CURRENT_TIMESTAMP LOOP
            SELECT lower(quote_ident(query.title)) INTO schema_name;
            DROP SCHEMA schema_name CASCADE;
            DELETE FROM context WHERE id = query.id;  
        END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;

selectdelete查询工作正常,我进行了一个测试,返回了schema_name变量的值,没关系。

我的问题是这条线:

DROP SCHEMA schema_name CASCADE;

我收到错误消息,因为“模式'schema_name'不存在”。我非常感谢有关如何使用此变量进行放置查询的任何想法。

postgresql function schema plpgsql dynamic-sql
1个回答
0
投票

您需要为此使用动态SQL:

DECLARE 
  query RECORD;
BEGIN
  FOR query IN SELECT id, lower(title) as title 
               FROM context 
               WHERE created_at + make_interval(days => duration) <= CURRENT_TIMESTAMP 
  LOOP
    execute format('DROP SCHEMA %I CASCADE', query.title);
    DELETE FROM context WHERE id = query.id;  
   END LOOP;
RETURN 1;
END;
$$ LANGUAGE plpgsql;
© www.soinside.com 2019 - 2024. All rights reserved.