【问题标题】:Using a variable on a PostgreSQL function to drop a schema在 PostgreSQL 函数上使用变量来删除模式
【发布时间】:2020-08-08 04:06:09
【问题描述】:

我正在尝试在 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' 不存在”。 对于如何使用此变量进行放置查询的任何想法,我将不胜感激。

【问题讨论】:

  • 不相关,但是:您只需要一个 DECLARE 块用于所有变量。每个变量不是一个块。

标签: postgresql function schema plpgsql dynamic-sql


【解决方案1】:

为此,您需要动态 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;

我还删除了不必要的 SELECT 语句以使标题小写,最好直接在查询中完成。

另外::= 的变量赋值比select 更快,所以:

schema_name := lower(quote_ident(query.title));

如果需要变量会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2013-04-09
    • 2018-10-31
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多