DO — 执行一个匿名代码块
DO [ LANGUAGElang_name]code
DO 执行一个匿名代码块,或者换句话说,执行一种过程语言中的临时匿名函数。
该代码块会被当作一个没有参数并且返回 void 的函数体来对待。它只会被解析和执行一次。
可选的 LANGUAGE 子句既可以写在代码块之前,也可以写在代码块之后。
code 要执行的过程语言代码。必须像在 CREATE FUNCTION 中那样把它指定为一个字符串字面值。推荐使用美元符引用的字面值。
lang_name 编写该代码所用的过程语言的名称。如果省略,默认值是 plpgsql。
要使用的过程语言必须已经通过 CREATE EXTENSION 被安装到当前数据库中。plpgsql 默认会被安装,但其他语言不会。
用户必须拥有该过程语言的 USAGE 特权;如果该语言是非受信任的,则用户必须是超级用户。这与用该语言创建函数时的特权要求相同。
如果 DO 在一个事务块中执行,则过程代码不能执行事务控制语句。只有当 DO 在其自己的事务中执行时,才允许使用事务控制语句。
把模式 public 中所有视图上的所有特权授予角色 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 语句。