在 PostgreSQL 函数上使用变量来删除模式
Using a variable on a PostgreSQL function to drop a schema
我正在尝试在 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;
select 和 delete 查询工作正常,我做了一个返回值 schema_name变量,就OK了。
我的问题是这一行:
DROP SCHEMA schema_name CASCADE;
我得到一个错误 "the schema 'schema_name' doesn't exist"。
对于如何使用此变量执行删除查询的任何想法,我将不胜感激。
为此您需要动态 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));
如果需要变量就更好了。
我正在尝试在 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;
select 和 delete 查询工作正常,我做了一个返回值 schema_name变量,就OK了。
我的问题是这一行:
DROP SCHEMA schema_name CASCADE;
我得到一个错误 "the schema 'schema_name' doesn't exist"。 对于如何使用此变量执行删除查询的任何想法,我将不胜感激。
为此您需要动态 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));
如果需要变量就更好了。