DO

DO — ejecuta un bloque de código anónimo

Synopsis

DO [ LANGUAGE nombre_lenguaje ] código

Descripción

DO ejecuta un bloque de código anónimo, o en otras palabras, una función anónima transitoria en un lenguaje procedimental.

El bloque de código se trata como si fuera el cuerpo de una función sin parámetros, devolviendo void. Se analiza y ejecuta una sola vez.

La cláusula opcional LANGUAGE se puede escribir tanto antes como después del bloque de código.

Parámetros

código

El código del lenguaje procedimental que se va a ejecutar. Debe especificarse como un literal de cadena, exactamente igual que en CREATE FUNCTION. Se recomienda el uso de un literal entrecomillado con dólares (dollar-quoted).

nombre_lenguaje

El nombre del lenguaje procedimental en el que está escrito el código. Si se omite, el valor predeterminado es plpgsql.

Notas

El lenguaje procedimental que se va a utilizar ya debe estar instalado en la base de datos actual mediante CREATE EXTENSION. plpgsql viene instalado por defecto, pero otros lenguajes no.

El usuario debe tener el privilegio USAGE para el lenguaje procedimental, o debe ser un superusuario si el lenguaje no es de confianza (untrusted). Este es el mismo requisito de privilegios que para crear una función en dicho lenguaje.

Si DO se ejecuta en un bloque de transacción, el código del procedimiento no puede ejecutar sentencias de control de transacciones. Las sentencias de control de transacciones solo están permitidas si DO se ejecuta en su propia transacción.

Ejemplos

Conceder todos los privilegios sobre todas las vistas del esquema public al rol 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$$;

Compatibilidad

No existe la sentencia DO en el estándar SQL.

Véase también

CREATE LANGUAGE