DO

DO(做)

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

概要

DO [ LANGUAGE lang_name ] code

描述

DO 执行了一个匿名代码块,或换而言之为一个程序化语言的暂时的匿名函数

该代码块被认为似乎是一个没有参数的函数体,返回空值。它被解析被执行了一次。

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

匿名块是程序化语言结构,该结构提供在运行时创建和执行程序代码的能力,而不用将代码作为数据库对象持久的存储在系统目录中。匿名代码块的概念和UNIX shell脚本相似,该能允许将多个手动输入命令分组并作为一步骤执行。顾名思义,匿名块没有名字,因此不能被其他对象引用。虽然动态创建,匿名块可以轻松的作为脚本存储在操作系统文件中以便重复执行。

匿名块是标准程序语言块。他们携带语法并且遵循适用于该程序语言的规则,包括变量的声明和作用于,执行,异常处理和语言使用。

匿名块的编译和执行结合在一个步骤中,而用户定义的函数需要在每次定义变更之前重新定义。

参数

code
需要执行的程序化语言代码。这必须指定为字符串文本。正如使用 CREATE FUNCTION 命令。建议使用美元引用文字。可选关键字无效。支持这些程序语言:PL/pgSQL(plpgsql),PL/Python (plpythonu),and PL/Perl (plperlplperlu)。
lang_name
代码所用程序语言的名字。该语言默认是 plpgsql。该语言必须在Greenplum数据库中安装并且在用户数据库中注册。

注意

PL/pgSQL 语言安装在Greenplum数据库系统中并且注册在用户创建的数据库中。PL/Python 语言是默认安装的,但是没有注册。其他语言没有安装也没有注册。系统目录 pg_language 包含了在数据库中注册语言的信息。

如果语言不可信,则用户必须有对程序语言有 USAGE 权限,或者必须是超级用户。这和使用该语言创建函数的权限要求一样。

示例

该 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 ;
注意: 例子 PL/pgSQL 使用 SELECTINTO 子句。它和 SQL 命令的 SELECT INTO 语句不同。

兼容性

SQL标准中没有 DO 语句。

另见

CREATE LANGUAGE Greenplum PL/pgSQL 程序化语言