== DO == .. container:: refentry :name: SQL-DO .. container:: titlepage .. container:: refnamediv .. rubric:: DO :name: do DO — 执行一个匿名代码块 .. container:: refsynopsisdiv .. rubric:: 大纲 :name: 大纲 .. code:: synopsis DO [ LANGUAGE lang_name ] code .. container:: refsect1 :name: id-1.9.3.102.6 .. rubric:: 描述 :name: 描述 ``DO``\ 执行一个匿名代码块,或者换句话说 执行一个以一种过程语言编写的瞬时匿名函数。 代码块就好像是一个没有参数并且返回\ ``void``\ 的函数的函数体。 它会被在一次时间内解析并且执行。 可选的\ ``LANGUAGE``\ 子句可以卸载代码块之前或者之后。 .. container:: refsect1 :name: id-1.9.3.102.7 .. rubric:: 参数 :name: 参数 .. container:: variablelist *``code``* 要被执行的过程语言代码。就像在 ``CREATE FUNCTION``\ 中一样,必须把它指定为一个 字符串。推荐使用一个美元引用的文本。 *``lang_name``* 编写该代码的过程语言的名称。如果省略,默认为\ ``plpgsql``\ 。 .. container:: refsect1 :name: id-1.9.3.102.8 .. rubric:: 注解 :name: 注解 要使用的过程语言必须已经用\ ``CREATE EXTENSION``\ 安装在 当前数据库中。默认已经安装了\ ``plpgsql``\ ,但是其他语言没有被 安装。 用户必须拥有该过程语言的\ ``USAGE``\ 特权,如果该语言 是不可信的则必须是一个超级用户。这和创建一个该语言的函数对 特权的要求相同。 如果在事务块中执行\ ``DO``\ ,过程代码则无法执行事务控制语句。只有在自己的事务中执行\ ``DO``\ 时,才允许使用事务控制语句。 .. container:: refsect1 :name: SQL-DO-EXAMPLES .. rubric:: 例子 :name: 例子 把模式\ ``public``\ 中所有视图上的所有特权授予 给角色\ ``webuser``\ : .. code:: programlisting 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$$; .. container:: refsect1 :name: id-1.9.3.102.10 .. rubric:: 兼容性 :name: 兼容性 SQL 标准中没有\ ``DO``\ 语句。 .. container:: refsect1 :name: id-1.9.3.102.11 .. rubric:: 另见 :name: 另见 `CREATE LANGUAGE `__