DO

将匿名代码块作为临时匿名函数运行。

概要

DO [ LANGUAGE <lang_name> ] <code>

描述

DO 执行一个匿名代码块,或者说在过程化语言中相当于一个短暂存在的匿名函数。

该代码块被视为一个无参数函数体,返回 void 类型。它会被解析并仅执行一次。

可选的 LANGUAGE 子句可出现在代码块之前或之后。

匿名块是过程化语言结构,能够即时创建并运行过程化代码,而无需将代码作为数据库对象持久存储在系统目录中。其概念类似于 UNIX shell 脚本,可将多个手动输入的命令组合为单一步骤执行。顾名思义,匿名块不具备名称,因此无法被其他对象引用。尽管动态生成,匿名块仍可轻松存储为操作系统文件中的脚本以供重复执行。

匿名块是标准的过程化语言块。它们遵循过程化语言的语法规则,包括变量声明与作用域、执行流程、异常处理以及语言用法等规范。

匿名块的编译与执行合并为一步操作,而用户定义函数每次定义变更后都需要重新定义才能使用。

参数

  • code
    • 要执行的过程语言代码。必须以字符串字面量形式指定,与 CREATE FUNCTION 命令相同。建议使用美元符号引用的字面量。
  • lang_name
    • 代码所使用的过程语言名称。默认值为 plpgsql。

注意

要使用的过程语言必须已通过 CREATE EXTENSION 命令安装到当前数据库中。PL/pgSQL 语言随数据库安装,并默认注册到每个用户创建的数据库中。PL/Python和PL/Perl 语言默认安装但未注册。其他语言既未安装也未注册。pg_language 系统目录包含数据库中已注册语言的相关信息。

用户必须拥有该过程语言的USAGE权限,若该语言为不可信语言,则用户必须是超级用户。此权限要求与创建该语言函数的要求相同。

若DO在事务块中运行,则过程代码不得执行事务控制语句。仅当 DO 在其自身事务中运行时,才允许使用事务控制语句。

匿名块不支持函数的 volatility 属性或 EXECUTE ON 属性。

示例

此 PL/pgSQL 示例将公共模式下所有视图的所有权限授予角色 webuser:

DO $$DECLARE r record;
BEGIN
    FOR r IN SELECT table_schema, table_name FROM information_schema.tables
             WHERE table_type = 'VIEW' AND table_schema = 'public'
    LOOP
        EXECUTE 'GRANT ALL ON ' || quote_ident(r.table_schema) || '.' || quote_ident(r.table_name) || ' TO webuser';
    END LOOP;
END$$;

兼容性

SQL标准中不存在DO语句。

另见

CREATE LANGUAGE