DO
DO¶
执行匿名代码块作为临时匿名函数。
- 语法
sql DO [ LANGUAGE lang_name ] code
- 描述
-
DO
执行过程代码中的一个匿名代码块,或一个临时的匿名函数。将代码块视为没有参数的函数的主体,并返回void。 它被解析并执行一次。
可选的
LANGUAGE
子句可以出现在代码块之前或之后。匿名块是过程语言结构,它提供了动态创建和执行过程代码的能力,而无需将代码作为数据库对象持久存储在系统目录中。 匿名块的概念类似于UNIX Shell脚本,它使几个手动输入的命令可以被分组并作为一个步骤执行。 顾名思义,匿名块没有名称,因此,不能从其他对象中引用它们。尽管匿名块是动态构建的,但可以轻松地将它们作为脚本存储在操作系统文件中以重复执行。
匿名块是标准的过程语言块。 它们带有语法并遵守适用于过程语言的规则,包括变量的声明和范围,执行,异常处理和语言使用。
匿名块的编译和执行在一个步骤中组合在一起,而每次定义更改时,都必须在使用前重新定义用户定义的函数。
- 参数
-
该SQL命令参数说明见下
code
- 要执行的过程语言代码。 必须将其指定为字符串文字,就像使用
CREATE FUNCTION
命令一样。 建议使用美元符号将代码括起来。可选关键字无效。 支持以下过程语言:PL/pgSQL(plpgsql
),PL/Python(plpythonu
)和PL/Perl(plperl
和plperlu
)。 lang_name
- 编写代码的过程语言的名称。默认值为
plpgsql
。 该语言必须安装在SeaboxMPP数据库系统上并在数据库中注册。
- 注解
-
PL/pgSQL语言已安装在SeaboxMPP数据库系统上,并已在用户创建的数据库中注册。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示例确定SeaboxMPP数据库用户是否为超级用户。 在该示例中,匿名块从临时表中检索输入值。
CREATE TEMP TABLE list AS VALUES ('seabox') DISTRIBUTED RANDOMLY; DO $$ DECLARE name TEXT := 'seabox' ; 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将
SELECT
与INTO
子句一起使用。它与SQL命令SELECT INTO
不同。 - 兼容性说明
- SQL标准中没有
DO
语句。 - 相关SQL命令
CREATE LANGUAGE
[SeaboxMPP PL/pgSQL过程语言]