Wrap y errores de compilación.

La utilidad de ‘wrap’ de Oracle presenta un curioso comportamiento con ciertas construcciones sintácticas un poco peculiares.

Veamos un ejemplo:

sql> select * from V$VERSION;

BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production
TNS for 32-bit Windows: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 - Production

sql>

sql> DESC X;
Nombre  ¿Nulo?   Tipo
------- -------- ----------------------------
ID_N    NOT NULL NUMBER
C_TXT_1          VARCHAR2(10)
D_DATE           DATE

sql> DESC V;
Nombre ¿Nulo? Tipo
------ -------- ----------------------------
ID_N   NOT NULL NUMBER
C_TXT           VARCHAR2(10)

sql> SELECT * FROM V;

ID_N C_TXT
---------- ----------
1 UNO
2 DOS
3 TRES
4 CUATRO

sql> SELECT * FROM X;

ninguna fila seleccionada

En un editor de texto creamos un fichero que contenga la compilación de un procedimiento PL/SQL:

CREATE OR REPLACE
PROCEDURE INSERTA_PRUEBA
IS
BEGIN
INSERT INTO X ( ID_N ,
C_TXT_1 ,
D_DATE )
VALUES ( 1,
(SELECT C_TXT FROM V WHERE ID_N = 1),
SYSDATE );
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

Lo guardamos como D:\Basura\INSERTA_PRUEBA.sql

Volvemos al sqlplus, donde lo compilamos:

sql> @D:\Basura\INSERTA_PRUEBA.sql

Procedimiento creado.

sql> exec INSERTA_PRUEBA;

Procedimiento PL/SQL terminado correctamente.

sql> select * from X;

ID_N       C_TXT_1    D_DATE
---------- ---------- -------------------
1 UNO        08/08/2006 13:11:11

sql>

Pero, al invocar a la utilidad ‘wrap’ nos ocurre que:

D:\Basura>

D:\Basura>wrap iname=inserta_prueba.sql oname=inserta_prueba.wrap

PL/SQL Wrapper: Release 9.2.0.6.0- Production on Mar Ago 08 13:09:29 2006

Copyright (c) Oracle Corporation 1993, 2001. All Rights Reserved.

Processing inserta_prueba.sql to inserta_prueba.wrap
PSU(103,1,9,24):Se ha encontrado el símbolo "SELECT" cuando se esperaba uno de los siguientes:

( - + case mod new not null others <an identifier>
<a double-quoted delimited-identifier> <a bind variable> avg
count current exists max min prior sql stddev sum variance
execute forall merge time timestamp interval date
<a string literal with character set specification>
<a number> <a single-quoted SQL string> pipe

PSU(103,1,9,58):Se ha encontrado el símbolo ")" cuando se esperaba uno de los siguientes:

* & - + ; / at for mod rem <an exponent (**)> and or group
having intersect minus order start union where connect ||

PL/SQL Wrapper error: Compilation error(s) for:
CREATE OR REPLACE
PROCEDURE INSERTA_PRU
Outputting source and continuing.

¡Y nos canta errores de compilación que el propio PL/SQL compiló perfectamente!

No obstante, si compilamos el fichero generado ‘por las malas’ tenemos que:

sql> @D:\Basura\INSERTA_PRUEBA.wrap

Procedimiento creado.

sql>

sql> exec INSERTA_PRUEBA;

Procedimiento PL/SQL terminado correctamente.

sql> select * from X;

ID_N       C_TXT_1    D_DATE
---------- ---------- -------------------
1 UNO        08/08/2006 13:11:11
1 UNO        08/08/2006 13:16:23


sql>

Así que wrap se queja de la sintaxis pero, tras lanzar sus errores y demás, permite la creación del .wrap, que será ejecutado sin novedad. Aunque parece extraño a primera vista, es un comportamiento razonable: la verificación sintáctica del wrap (mucho menos refinada que la del motor PL/SQL) avisa y se inhibe ante la verificación ‘real’ PL/SQL que se efectuará si continuamos con la compilación, como es el caso.

No obstante, hay que tener en cuenta que el fichero ‘.wrap’ generado no estará cifrado -o al menos las partes afectadas por los errores de compilación detectados por la utilidad-, con lo que dichas partes aparecerán ‘en limpio’ en el diccionario de datos y seran visibles como codigo fuente para cualquiera que pueda acceder a ellas.

El comportamiento de ‘wrap’ prima pues la ‘usabilidad’ sobre la seguridad: las partes que no puede cifrar, no las cifra, pero el fichero ‘.wrap’ generado podrá compilarse y utilizarse. Eso sí: con las partes conflictivas visibles. Dependerá del usuario de la utilidad si le merece la pena correr el riesgo o no…

Saludos.

Carlos.

2 respuestas a Wrap y errores de compilación.

  1. MadQuark dice:

    Hola, he llegado a tu blog por el mismo problema que comentas en este post. No se si has seguido investigando en él, pero he visto que se puede solucionar añadiendo “edebug=wrap_new_sql” al hacer el wrap.

    http://www.mydatabasesupport.com/forums/showthread.php?t=129902

    Un saludo

  2. carlosal dice:

    No creo que esta sea la solución.

    La documentación de Oracle “PL/SQL User’s Guide and Reference Release 2 (9.2)” dice:

    “Some recent SQL syntax is not supported by the wrap utility by default. To enable the support for all SQL syntax, specify the option edebug=wrap_new_sql (with no dash). This option is not the default because it causes all SQL statements to appear in plain text in the wrapped file.”

    Parece que está pensada más para nuevas construcciones como JOIN, CASE y MERGE.

    Aunque ahora no tengo un cliente 9.2 a mano para comprobarlo.

    Saludos.

    Carlos

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: