PRAGMA

161 views
Skip to first unread message

Hugo Vera

unread,
Aug 20, 2010, 10:36:34 AM8/20/10
to escuel...@googlegroups.com

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
Reply all
Reply to author
Forward
0 new messages