动态 DDL
来自 PostgreSQL 维基
跳转到导航跳转到搜索
在本节中的许多示例中,SQL 查询会输出一个 DDL 语句列表,这些语句随后将被执行。这是一个相当常见的管理需求。
以下简单的函数允许直接执行此类查询,无需任何中间步骤。这样做也利用了 PostgreSQL 进行事务性 DDL 的能力;要么所有更改都生效,要么所有更改都被回滚。当然,为了安全起见,通常会在执行 COMMIT;
之前先显式执行 BEGIN;
,并检查命令列表,以及如果需要的话,检查对数据库的更改。
create function exec(text) returns text language plpgsql volatile
as $f$
begin
execute $1;
return $1;
end;
$f$;
format()
函数(在 PostgreSQL 9.1+ 中可用)非常适合构造动态语句。以下函数将 exec(format())
合并为单个函数。
create function exec(text, variadic anyarray) returns text language plpgsql volatile
as $f$
DECLARE
cmd text;
BEGIN
cmd := format($1, variadic $2);
EXECUTE cmd;
RETURN cmd;
END;
$f$;
请注意,“variadic” 至少需要一个参数,因此您需要以上两个函数才能实现完全的灵活性。