关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
工具指南
数据类型
存储引擎
执行引擎
流计算引擎
灾难恢复
系统配置参数
索引
扩展
SQL 参考
常见问题(FAQ)
将匿名代码块作为临时匿名函数运行。
DO [ LANGUAGE <lang_name> ] <code>
DO 执行一个匿名代码块,或者说在过程化语言中相当于一个短暂存在的匿名函数。
该代码块被视为一个无参数函数体,返回 void 类型。它会被解析并仅执行一次。
可选的 LANGUAGE 子句可出现在代码块之前或之后。
匿名块是过程化语言结构,能够即时创建并运行过程化代码,而无需将代码作为数据库对象持久存储在系统目录中。其概念类似于 UNIX shell 脚本,可将多个手动输入的命令组合为单一步骤执行。顾名思义,匿名块不具备名称,因此无法被其他对象引用。尽管动态生成,匿名块仍可轻松存储为操作系统文件中的脚本以供重复执行。
匿名块是标准的过程化语言块。它们遵循过程化语言的语法规则,包括变量声明与作用域、执行流程、异常处理以及语言用法等规范。
匿名块的编译与执行合并为一步操作,而用户定义函数每次定义变更后都需要重新定义才能使用。
要使用的过程语言必须已通过 CREATE EXTENSION 命令安装到当前数据库中。PL/pgSQL 语言随数据库安装,并默认注册到每个用户创建的数据库中。PL/Python和PL/Perl 语言默认安装但未注册。其他语言既未安装也未注册。pg_language 系统目录包含数据库中已注册语言的相关信息。
用户必须拥有该过程语言的USAGE权限,若该语言为不可信语言,则用户必须是超级用户。此权限要求与创建该语言函数的要求相同。
若DO在事务块中运行,则过程代码不得执行事务控制语句。仅当 DO 在其自身事务中运行时,才允许使用事务控制语句。
匿名块不支持函数的 volatility 属性或 EXECUTE ON 属性。
此 PL/pgSQL 示例将公共模式下所有视图的所有权限授予角色 webuser:
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$$;
SQL标准中不存在DO语句。