sábado, 9 de septiembre de 2017

Oracle 12c R2 - PRAGMA DEPRECATE

¿Qué es "PRAGMA DEPRECATE"?


La opción de compilador "PRAGMA DEPRECATE" permite marcar a un elemento PL/SQL como obsoleto. El compilador emite advertencias para usos del pragma DEPRECATE o el de elementos obsoletos.

Las advertencias le indican a los usuarios que utilizan un elemento obsoleto que es necesario cambiar el código para tener en cuenta la depreciación.


¿Qué objetos se pueden marcar como obsoletos con "PRAGMA DEPRECATE"?


Se puede marcar como obsoleto objetos de los siguientes tipos:

  • Subprograms
  • Packages
  • Variables
  • Constants
  • Types
  • Subtypes
  • Exceptions
  • Cursors

¿Cómo se utiliza?

Habilitar las advertencias de compilador

Como primer medida, tenemos que habilitar las advertencias de compilador para poder utilizar este nuevo Pragma. Se puede hacer para las advertencias relacionadas con "PRAGMA DEPRECATE" o bien se puede habilitar para todas las advertencias de compilación.

ALTER SESSION SET PLSQL_WARNINGS='ENABLE:(6019,6020,6021,6022)';
ALTER SESSION SET PLSQL_WARNINGS='ENABLE:ALL'; 

Compilar una unidad de programación utilizando ""PRAGMA DEPRECATE"

En el siguiente ejemplo, compilamos un paquete e indicamos que el mismo se encuentra obsoleto al incluir la línea "PRAGMA DEPRECATE" seguida del nombre del paquete.

CREATE OR REPLACE PACKAGE pkg_Deprecado AUTHID DEFINER 
AS
   PRAGMA DEPRECATE (pkg_Deprecado);
   --
   PROCEDURE Procedimiento1;
   --
   FUNCTION Funcion1 RETURN NUMBER;
END pkg_Deprecado;

SP2-0808: Package created with compilation warnings

Dependiendo de la IDE que utilicemos para desarrollar, la advertencia puede mostrarse en forma automática o tendremos que consultar que tipo de advertencia se ha generado:

SQL> SHOW ERRORS
Errors for PACKAGE PKG_DEPRECADO:

LINE/COL ERROR
-------- -------------------------------------------------------
3/4      PLW-06019: entity PKG_DEPRECADO is deprecated

Lo mismo si probamos de marcar como obsoleto sólo a un procedimiento de un paquete:

CREATE OR REPLACE PACKAGE pkg_Codigo AUTHID DEFINER
AS
  PROCEDURE Procedimiento1;
  PRAGMA DEPRECATE (Procedimiento1, 
      'pkg_Codigo.Procedimiento1 deprecado. Utilice pkg_Codigo.Procedimiento2');
  --
  PROCEDURE Procedimiento2;
END;

SP2-0808: Package created with compilation warnings

El mensaje de error ahora nos indica que la entidad que se encuentra marcada como obsoleta es el procedimiento "PROCEDIMIENTO1" y no el paquete completo.

SQL> SHOW ERRORS
Errors for PACKAGE PKG_DEPRECADO:

LINE/COL ERROR
-------- -------------------------------------------------------
4/3      PLW-06019: entity PROCEDIMIENTO1 is deprecated

¿Qué significa cada mensaje de Advertencia?

A continuación tenemos la definición oficial de cada uno de los cuatro mensajes de advertencia o error relacionados con "PRAGMA DEPRECATE"


Nro. de AdvertenciaSignificado de la Advertencia
6019La entidad ha sido marcada como obsoleta y puede ser removida en una versión futura. No utilice esta entidad.
6020La entidad referenciada ha sido marcada como obsoleta y puede ser removida en una versión futura. No utilice esa entidad. Siga las instrucciones especificadas en la advertencia si están disponibles
6021Pragma mal ubicado. El pragma DEPRECATE debe seguir en forma inmediata a la declaración de la entidad que esta siendo marcada como obsoleta.Ubique al pragma inmediatamente debajo de la declaración de la entidad que esta siendo marcada como obsoleta
6022Esta entidad no puede ser marcada como obsoleta. Esta funcionalidad sólo aplica a entidades que se declaran en un Paquete, a especificaciones de tipos o a Procedimientos y Funciones. Elimine el pragma.

Advertencia 6019
La advertencia (o error) 6019, como vimos al compilar los dos paquetes anteriores, ocurrirá cada vez que compilemos un objeto que se ecuentra "marcado" como obsoleto con la instrucción "PRAGMA DEPRECATE".

Advertencia 6020
La advertencia (o error) 6020 ocurrirá cada vez que compilemos un objeto que referencia a otro que se encuentra "marcado" como obsoleto con la instrucción "PRAGMA DEPRECATE".

Siguiendo con el ejemplo anterior, si intentamos compilar un procedimiento que referencia al procedimiento "Procedimiento1" del paquete "pkg_Codigo", obtendremos la advertencia 6020:

CREATE OR REPLACE PROCEDURE Usar_Procedimiento_Deprecado
IS
BEGIN
   pkg_codigo.procedimiento1;
END;
/

SP2-0804: Procedure created with compilation warnings

SQL> SHOW ERRORS
Errors for PROCEDURE USAR_PROCEDIMIENTO_DEPRECADO:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/4      PLW-06020: reference to a deprecated entity: PROCEDIMIENTO1
         declared in unit PKG_CODIGO[3,13].  pkg_Codigo.Procedimiento1
         deprecado. Utilice pkg_Codigo.Procedimiento2

Este escenario es el mas útil, ya que una vez que un objeto sea marcado como obsoleto, cualquier usuario que compile cualquier unidad de programación que haga referencia al mismo recibirá la advertencia, pudiendo en ese caso modificar su código para utilizar el código vigente en vez del objeto obsoleto.

Advertencia 6021
La advertencia (o error) 6021 ocurrirá si tratamos de compilar un objeto con una sentencia "PRAGMA DEPRECATE" ubicada en un lugar incorrecto, como podemos ver en el siguiente ejemplo:

CREATE OR REPLACE PACKAGE MiPaquete AUTHID DEFINER AS
  --
  PRAGMA DEPRECATE(CalculaTotal);
  --
  CURSOR c_cursor IS
    SELECT dummy FROM dual;
  --
  PROCEDURE CalculaTotal;
  --
END MiPaquete;
/

SP2-0808: Package created with compilation warnings

SQL> SHOW ERRORS
Errors for PACKAGE MIPAQUETE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
3/10     PLW-06021: PRAGMA DEPRECATE on CALCULATOTAL is misplaced


Advertencia 6022
La advertencia (o error) 6022 indica que estamos tratando de marcar como obsoleto un objeto que no puede ser marcado como obsoleta. Esto puede ocurrir si marcamos como obsoleto un procedimiento o función interna (declarada dentro de otro procedimiento o función), como podemos ver en el siguiente ejemplo:

CREATE OR REPLACE PROCEDURE Error6022
IS
   PROCEDURE Error6022_Interno
   IS
   PRAGMA DEPRECATE (Error6022_Interno, 'Error6022_Interno es Obsoleto');
   BEGIN
     DBMS_OUTPUT.PUT_LINE('Probando Error6022_Interno');
   END;
BEGIN
  --
  DBMS_OUTPUT.PUT_LINE('Probando Error6022');
  --
  Error6022_Interno;
  --
END;

Warning: PROCEDURE ERROR6022
Line: 5 PLW-06022: cannot use PRAGMA DEPRECATE on this entity


Documentación y ejemplos en Oracle Live SQL

No hay comentarios.:

Publicar un comentario