DO

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

概要

  1. DO [ LANGUAGE lang_name ] code

描述

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

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

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

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

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

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

参数

code

要执行的过程语言代码。 必须将其指定为字符串文字,就像使用CREATE FUNCTION命令一样。 建议使用美元符号将代码括起来。 可选关键字无效。 支持以下过程语言:PL/pgSQL(plpgsql), PL/Python(plpythonu)和PL/Perl(plperl和plperlu)。

lang_name

编写代码的过程语言的名称。默认值为plpgsql。 该语言必须安装在Greenplum数据库系统上并在数据库中注册。

注解

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

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

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

示例

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

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

该PL/pgSQL示例确定Greenplum数据库用户是否为超级用户。 在该示例中,匿名块从临时表中检索输入值。

  1. CREATE TEMP TABLE list AS VALUES ('gpadmin') DISTRIBUTED RANDOMLY;
  2. DO $$
  3. DECLARE
  4. name TEXT := 'gpadmin' ;
  5. superuser TEXT := '' ;
  6. t1_row pg_authid%ROWTYPE;
  7. BEGIN
  8. SELECT * INTO t1_row FROM pg_authid, list
  9. WHERE pg_authid.rolname = name ;
  10. IF t1_row.rolsuper = 'f' THEN
  11. superuser := 'not ';
  12. END IF ;
  13. RAISE NOTICE 'user % is %a superuser', t1_row.rolname, superuser ;
  14. END $$ LANGUAGE plpgsql ;

Note: 示例PL/pgSQL将SELECT与INTO子句一起使用。 它与SQL命令SELECT INTO不同。

兼容性

SQL标准中没有DO语句。

另见

CREATE LANGUAGE Greenplum PL/pgSQL过程语言

Parent topic: SQL Command Reference