DO

DO

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

概要

DO [ LANGUAGE lang_name ] code

描述

DO执行过程代码中的一个匿名代码块,或一个临时的匿名函数。

将代码块视为没有参数的函数的主体,并返回void。 它被解析并执行一次。

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

匿名块是过程语言结构,它提供了动态创建和执行过程代码的能力,而无需将代码作为数据库对象持久存储在系统目录中。 匿名块的概念类似于UNIX Shell脚本,它使几个手动输入的命令可以被分组并作为一个步骤执行。 顾名思义,匿名块没有名称,因此,不能从其他对象中引用它们。 尽管匿名块是动态构建的,但可以轻松地将它们作为脚本存储在操作系统文件中以重复执行。

匿名块是标准的过程语言块。 它们带有语法并遵守适用于过程语言的规则,包括变量的声明和范围,执行,异常处理和语言使用。

匿名块的编译和执行在一个步骤中组合在一起,而每次定义更改时,都必须在使用前重新定义用户定义的函数。

参数

code
要执行的过程语言代码。 必须将其指定为字符串文字,就像使用CREATE FUNCTION命令一样。 建议使用美元符号将代码括起来。 可选关键字无效。 支持以下过程语言:PL/pgSQL(plpgsql), PL/Python(plpythonu)和PL/Perl(plperlplperlu)。
lang_name
编写代码的过程语言的名称。默认值为plpgsql。 该语言必须安装在Greenplum数据库系统上并在数据库中注册。

注解

PL/pgSQL语言已安装在Greenplum数据库系统上,并已在用户创建的数据库中注册。 PL/Python和PL/Perl语言是默认安装的,但未注册。 未安装或注册其他语言。 系统目录pg_language包含有关数据库中已注册语言的信息。

用户必须对过程语言具有USAGE特权,或者如果该语言不受信任,则必须是超级用户。 这与使用该语言创建函数需要的特权相同。

匿名块不支持函数易变性或EXECUTE ON属性。

示例

此PL/pgSQL示例向角色webuser授予对模式public的所有视图的所有特权:

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$$;
该PL/pgSQL示例确定Greenplum数据库用户是否为超级用户。 在该示例中,匿名块从临时表中检索输入值。
CREATE TEMP TABLE list AS VALUES ('gpadmin') DISTRIBUTED RANDOMLY;

DO $$ 
DECLARE
  name TEXT := 'gpadmin' ;
  superuser TEXT := '' ;
  t1_row   pg_authid%ROWTYPE;
BEGIN
  SELECT * INTO t1_row FROM pg_authid, list 
     WHERE pg_authid.rolname = name ;
  IF t1_row.rolsuper = 'f' THEN
    superuser := 'not ';
  END IF ;
  RAISE NOTICE 'user % is %a superuser', t1_row.rolname, superuser ;
END $$ LANGUAGE plpgsql ;
Note: 示例PL/pgSQL将SELECTINTO子句一起使用。 它与SQL命令SELECT INTO不同。

兼容性

SQL标准中没有DO语句。

另见

CREATE LANGUAGE Greenplum PL/pgSQL过程语言