PRAGMA
Pragma es una palabra reservada en Oracle PL/SQL que se usa para darle directivas al compilador.
PRAGMA
La
Instrucción es una sentencia que da directivas al compilador. O sea le
pide al compilador que se comporte de una determinada manera.Los Pragmas se definen en la parte Declarativa del PL (DECLARE)
Existen los siguientes tipos de PRAGMA:
AUTONOMOUS_TRANSACTION
Antes
de Oracle 8.1, cada sesión en PL/SQL podía tener como mucho una
transacción activa en un momento dado. En otras palabras, los cambios se
aplicaban todos o ninguno.Oracle
8i PL/SQL solucionó esto con el pragma AUTONOMOUS_TRANSACTION. Este
pragma puede realizar una transacción autonoma en un bloque PL/SQL entre
el BEGIN y el END, sin afectar la transacción global.Por
ejemplo, si tenemos que hacer un ROLLBACK o COMMIT en el bloque, sin
afectar a la transacción fuera del bloque, se puede usar este pragma.Podríamos tener por ejemplo el siguiente procedimiento:
CREATE OR REPLACE PROCEDURE grabar_log (texto varchar2) IS
PRAGMA AUTONOMOUS_TRANSACTION
BEGIN INSERT INTO mi_log (fecha,log) VALUES (sysdate,texto);
-- El COMMIT solo va a afectar al INSERT de este procedimiento
COMMIT;END;
Y haríamos uso de este procedimiento de la siguiente manera:
DECLARE -- Declaración
BEGIN -- El código que sea, con sus instrucciones DML
COMMIT;EXCEPTION
WHEN OTHERS THEN
grabar_log(SQLERRM);
-- El ROLLBACK solo afectará a las instrucciones DML que hemos ejecutado en este bloque.
-- El COMMIT del procedimiento grabar_log no afecta a las instrucciones de este bloque.
ROLLBACK;END;
EXCEPTION_INIT
Este es el PRAGMA mas usado, sirve para ligar una EXCEPTION definida por el usuario a un número de Error determinado.
Por ejemplo:Declare
I_GIVE_UP EXCEPTION;
PRAGMA EXCEPTION_INIT(I_give_up, -20000);
BEGIN
..
EXCEPTION WHEN I_GIVE_UP
do something..
END;SERIALLY_REUSABLE
Este pragma le dice al motor de PL/SQL que los datos a nivel de paquete no deben ser persistentes entre referencias a ellos.
Los
datos del paquete (variables globales en la especificación del paquete
etc.) por defecto persisten durante la sesión (o hasta que el paquete es
recompilado). Las estructuras de datos globalmente accesibles pueden
causar algún efecto lateral. Por ejemplo, que pasa si dejamos un cursor
abierto en un paquete. Además, un programa puede gastar mucha memoria
(UGA) y no liberarla si los datos están almacenados en una estructura a
nivel de paquete.Para solucionar esto, a partir de Oracle8i se introdujo el pragma SERIALLY_REUSABLE. Este pragma se usa solo en paquetes y debe ser definido tanto en la especificación del paquete como en el cuerpo.
CREATE PACKAGE pkg1 IS
PRAGMA SERIALLY_REUSABLE;
num NUMBER := 0;
PROCEDURE init_pkg_state(n NUMBER);
PROCEDURE print_pkg_state;
END pkg1;
CREATE PACKAGE BODY pkg1 IS
PRAGMA SERIALLY_REUSABLE;
PROCEDURE init_pkg_state (n NUMBER) IS
BEGIN pkg1.num := n;
END;
PROCEDURE print_pkg_state IS
BEGIN dbms_output.put_line('Number: ' || pkg1.num);
END;END pkg1;
RESTRICT REFERENCES
Este PRAGMA está obsoleto (DEPRECATED), Oracle recomienda usar DETERMINISTIC y PARALLEL_ENABLE.
PRAGMA RESTRICT_REFERENCES (
function_name, WNDS [, WNPS] [, RNDS] [, RNPS] [, TRUST] )
CREATE PACKAGE showrec AS
FUNCTION isok (amount NUMBER) RETURN BOOLEAN;
FUNCTION isok (net_time DATE) RETURN BOOLEAN;
PRAGMA RESTRICT_REFERENCES (isok, WNDS);
...END showrec;
Hugo Vera
Consultor Business Intelligence
Ayi & asociados
Antonio del Viso 658 Av. Corrientes 640 3 Piso Of 38 A
Córdoba - Argentina Buenos Aires - Argentina
54 351 4711900 54 11 43286538
www.ayi-asociados.com