jueves, 10 de mayo de 2007

Manipulando HTML en SQL*plus

"Necesito ejecutar unos scripts SQL*plus que insertan líneas de código HTML en una tabla. El problema que tengo es que cuando los valores contienen el símbolo ampersand, Oracle me pide que ingrese un valor. Como hago para evitarlo?"

Es común en HTML encontrar cosas del estilo:

<font><B>Acentuaci&oacute;n en la Gram&aacute;tica</B></font>

El símbolo ampersand en SQL*Plus suele utilizarse como prefijo standard para indicar un parámetro de sustitución en un script.

Por lo pronto, el único problema que presenta el código HTML en SQL*Plus, es para escribir el símbolo ampersand (suerte que las comillas en HTML son dobles y no simples).

Bueno, quien me planteó el problema no tenía intenciones de modificar los scripts originales, así que le di una solución simple: crear un script que invoque a los demás (con @), y que al comienzo del mismo contenga la línea:

SET DEFINE OFF

Este comando de SQL*Plus inhibe los parámetros de entrada en SQL*Plus, por lo cual va a ignorar todos los ampersand que encuentre.

Aunque la solución es simple y funciona para muchos casos, es también un poco drástica: inhibe los verdaderos parámetros que contengan nuestros scripts. Si nuestro script recibe un parámetro &valor y en la siguiente línea inserta un texto que contiene un &aacute, entonces no hay manera de que SQL*plus se de cuenta cuál es parámetro y cuál no. Conclusión: los scripts deben alterarse.

Para esto hay algunas alternativas. La primera, es cambiar el prefijo para definir parámetros, por algún símbolo que no sea caracter especial en HTML, por ejemplo, el símbolo de pesos.

SET DEFINE $

De esta manera los ampersand de HTML serán ignorados.

Una segunda alternativa, es utilizar el caracter de escape (por defecto '\') para 'escapar' los ampersand del código. Luego los ampersand no son incluídos al guardarse en la tabla. Por lo general tendremos muchos menos parámetros que símbolos ampersand, así que particularmente elijo la primer opción.

En conclusión, cambiar el prefijo de parámetros con SET DEFINE $ es la opción más flexible. Usar SET DEFINE OFF al comienzo del script nos inhibe los parámetros, pero si no los necesitamos, se transforma en la opción más sencilla de implementar.

3 comentarios:

Viejex dijo...
Este comentario ha sido eliminado por el autor.
Viejex dijo...

Que pena que desde 2010 no hayan más artículos! Este articulo particularmente me resultó muy claro y útil. Soy un usuario de una base de datos oracle, que utilizo para hacer pruebas principalmente. Ocasionalmente hago algunas modificaciones menores a la base usando una herramienta -que crea scripts automáticamente- que me agregaba esta línea SET DEFINE OFF al principio y no sabía para que servía.

Saludos

Daniel Tala dijo...

perfecto, gracias!