| <!-- |
| doc/src/sgml/ref/do.sgml |
| PostgreSQL documentation |
| --> |
| |
| <refentry id="sql-do"> |
| <indexterm zone="sql-do"> |
| <primary>DO</primary> |
| </indexterm> |
| |
| <indexterm zone="sql-do"> |
| <primary>anonymous code blocks</primary> |
| </indexterm> |
| |
| <refmeta> |
| <refentrytitle>DO</refentrytitle> |
| <manvolnum>7</manvolnum> |
| <refmiscinfo>SQL - Language Statements</refmiscinfo> |
| </refmeta> |
| |
| <refnamediv> |
| <refname>DO</refname> |
| <refpurpose>execute an anonymous code block</refpurpose> |
| </refnamediv> |
| |
| <refsynopsisdiv> |
| <synopsis> |
| DO [ LANGUAGE <replaceable class="parameter">lang_name</replaceable> ] <replaceable class="parameter">code</replaceable> |
| </synopsis> |
| </refsynopsisdiv> |
| |
| <refsect1> |
| <title>Description</title> |
| |
| <para> |
| <command>DO</command> executes an anonymous code block, or in other |
| words a transient anonymous function in a procedural language. |
| </para> |
| |
| <para> |
| The code block is treated as though it were the body of a function |
| with no parameters, returning <type>void</type>. It is parsed and |
| executed a single time. |
| </para> |
| |
| <para> |
| The optional <literal>LANGUAGE</literal> clause can be written either |
| before or after the code block. |
| </para> |
| </refsect1> |
| |
| <refsect1> |
| <title>Parameters</title> |
| |
| <variablelist> |
| <varlistentry> |
| <term><replaceable class="parameter">code</replaceable></term> |
| <listitem> |
| <para> |
| The procedural language code to be executed. This must be specified |
| as a string literal, just as in <command>CREATE FUNCTION</command>. |
| Use of a dollar-quoted literal is recommended. |
| </para> |
| </listitem> |
| </varlistentry> |
| |
| <varlistentry> |
| <term><replaceable class="parameter">lang_name</replaceable></term> |
| <listitem> |
| <para> |
| The name of the procedural language the code is written in. |
| If omitted, the default is <literal>plpgsql</literal>. |
| </para> |
| </listitem> |
| </varlistentry> |
| </variablelist> |
| </refsect1> |
| |
| <refsect1> |
| <title>Notes</title> |
| |
| <para> |
| The procedural language to be used must already have been installed |
| into the current database by means of <command>CREATE EXTENSION</command>. |
| <literal>plpgsql</literal> is installed by default, but other languages are not. |
| </para> |
| |
| <para> |
| The user must have <literal>USAGE</literal> privilege for the procedural |
| language, or must be a superuser if the language is untrusted. |
| This is the same privilege requirement as for creating a function |
| in the language. |
| </para> |
| |
| <para> |
| If <command>DO</command> is executed in a transaction block, then the |
| procedure code cannot execute transaction control statements. Transaction |
| control statements are only allowed if <command>DO</command> is executed in |
| its own transaction. |
| </para> |
| </refsect1> |
| |
| <refsect1 id="sql-do-examples"> |
| <title>Examples</title> |
| <para> |
| Grant all privileges on all views in schema <literal>public</literal> to |
| role <literal>webuser</literal>: |
| <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$$; |
| </programlisting></para> |
| </refsect1> |
| |
| <refsect1> |
| <title>Compatibility</title> |
| |
| <para> |
| There is no <command>DO</command> statement in the SQL standard. |
| </para> |
| </refsect1> |
| |
| <refsect1> |
| <title>See Also</title> |
| |
| <simplelist type="inline"> |
| <member><xref linkend="sql-createlanguage"/></member> |
| </simplelist> |
| </refsect1> |
| </refentry> |