DO
执行匿名代码块作为临时匿名函数。
概要
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的所有视图的所有特权:
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将SELECT与INTO子句一起使用。 它与SQL命令SELECT INTO不同。
兼容性
SQL标准中没有DO语句。
另见
CREATE LANGUAGE Greenplum PL/pgSQL过程语言
Parent topic: SQL Command Reference