动态 DDL

来自 PostgreSQL 维基
跳转到导航跳转到搜索

性能片段

动态 DDL 执行

适用于 PostgreSQL

>=7.4

编写语言

PL/pgSQL

依赖于


在本节中的许多示例中,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” 至少需要一个参数,因此您需要以上两个函数才能实现完全的灵活性。