Copyright © OBCOM INGENIERIA S.A. (Chile)
OBCOM SQL Wizard es una herramienta que permite generar componentes para invocar a procedimientos almacenados en una base de datos DB2, Oracle, SolidDB, SQL Server y Sybase. Esta herramienta pueden generar: páginas ASP y JSP, clases Visual Basic 6, componentes EJB y Servicios Web (GlassFish, JBoss, WebLogic, WebSphere), componentes .NET y Servicios Web (Visual Basic y C-Sharp), y aplicaciones Adobe Flex para probar los Servicios web.
OBCOM SQL Wizard es un control ActiveX (Rich Internet Application) que se utiliza con el navegador Internet Explorer de Microsoft (ver figura más abajo). Su forma de uso es simple. Primero se conecta OBCOM SQL Wizard a una de base de datos. Luego se seleccionan los procedimientos almacenados que se desea invocar. Finalmente, se generan las componentes haciendo clic en un botón la barra de herramientas. Los detalles de estos pasos se explican en las próximas secciones de este documento.
OBCOM SQL Wizard genera sólo archivos de texto. No se requieren bibliotecas (run-time) adicionales, excepto por aquellas bibliotecas propias del ambiente de desarrollo y/o ejecución donde se utilizarán los archivos de texto generados.

Antes de poder utilizar OBCOM SQL Wizard, es necesario registrarse y obtener una licencia de uso. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la siguiente figura. Los pasos necesarios para solicitar y obtener una licencia de uso están claramente explicados en esta ventana.

El primer paso para usar OBCOM SQL Wizard es conecterse a una base de datos. Al presionar el botón de la barra de herramientas, aparece una ventana como la que se observa en la siguiente figura. Esta ventana solicita la siguiente información: (1) tipo del servidor de base de datos, (2) nombre o número IP (SID en caso de Oracle) del servidor de base de datos, (3) nombre del usuario, y (4) contraseña del usuario.

Importante: para que OBCOM SQL Wizard se pueda conectar a una base de datos es necesario que el computador tenga instalado: (1) la biblioteca MDAC de Microsoft versión 2.5 ó superior, y (2) la biblioteca OLEDB específica de la base de datos. Normalmente, los sistemas operativos Windows ya tienen instalada una biblioteca MDAC adecuada, y una biblioteca OLEDB para Microsoft SQL Server. Las bibliotecas OLEDB para las bases datos DB2, Oracle, SolidDB y Sybase se deben instalar manualmente. Estas bibliotecas pueden ser descargadas gratuitamente de los sitios Internet de las empresas respectivas.
La parte superior de la ventana de OBCOM SQL Wizard muestra la lista de los procedimientos almacenados disponibles en la base de datos (o esquema) seleccionado. Al hacer clic sobre uno de los procedimientos de esta lista, la parte inferior de la ventana permite ver (1) los parámetros de entrada/salida, y (2) el código fuente del procedimiento seleccionado. Las siguientes dos figuras muestran las dos pestañas que entregan esta información.


La barra de herramientas posee un campo de texto que permite filtrar la lista de procedimientos almacenados que se muestran. Para filtrar esta lista, primero se debe digitar un patrón en el campo de texto, y luego presionar la tecla [Enter]. La lista se ajustará de inmediato de modo de mostrar sólo aquellos procedimientos almacenados cuyo nombre coincide con el patrón digitado. Un patrón es una secuencia de uno o más caracteres, algunos de los cuales tienen significados especiales. En particular:
|
Carácter del Patrón |
Carácter del nombre del Procedimiento Almacenado |
|
? |
Coincide con cualquier carácter |
|
* |
Coincide con una secuencia de cero o más caracteres |
|
# |
Coincide con un dígito cualquiera (0-9) |
|
[lista-de-caracteres] |
Coincide con un carácter incluido en la lista-de-caracteres |
|
[!lista-de-caracteres] |
Coincide con un carácter no incluido en la lista-de-caracteres |
|
otro carácter |
Coincide con el mismo carácter |
Se puede especificar un intervalo de caracteres en lista-de-caracteres colocando un guión (–) para separar los límites inferior y superior del intervalo. Por ejemplo, la secuencia [A–Z] en patrón permite hallar una coincidencia si en la posición correspondiente de la cadena (String) hay un carácter en mayúsculas cualquiera, comprendido en el intervalo de la “A” a la “Z”. Se pueden incluir múltiples intervalos entre corchetes, sin necesidad de delimitadores, por ejemplo: [A–Za-z0-9].
Para poder generar componentes con OBCOM SQL Wizard, es
necesario seleccionar uno o más procedimientos almacenados. Para esto, se debe
hacer clic en la caja
asociada
a cada procedimiento, como se muestra en la siguiente figura:

Para seleccionar (o deseleccionar) varios procedimientos a
la vez, se puede utilizar el menú de la barra de herramientas identificado con
el ícono
.
Alternativamente, el menú se puede activar haciendo clic con el botón derecho
sobre la lista de procedimientos. En ambos casos, aparece una lista de opciones
como se observa en la figura siguiente, la cual permite seleccionar o
deseleccionar procedimientos en base a distintos criterios:

Las opciones “Incluir nombres…” y “Excluir nombres…” permiten seleccionar o deseleccionar procedimientos en base a una lista de nombres provistas en un archivo de texto. Cuando se utilizan estas opciones, OBCOM SQL Wizard muestra una ventana para que el usuario seleccione el archivo que contiene los nombres. Cada nombre de procedimiento debe estar en una línea separada, como se muestra en la siguiente figura:

Un conjunto de resultados (ResultSet) es una entidad dinámica, cuya estructura sólo se conoce en el momento que se ejecuta un procedimiento almacenado. No existe un mecanismo estándar que permita conocer, de antemano, el nombre y tipo de las columnas de componen los conjuntos de resultado que retorna por un procedimiento. Debido a esta falta de información, las estructuras que genera OBCOM SQL Wizard para representar conjuntos de resultado son genéricas, y sus campos (fields) están definidos sólo como “Object”, en vez de tener tipos más específicos. Estas estructuras genéricas (weakly-typed) tienen varios problemas: (1) el compilador no puede detectar mal uso de tipos de datos, (2) el código generado es menos eficiente, y (3) la representación XML de estas estructuras es grande.
OBCOM SQL Wizard es capaz de leer el código fuente de un procedimiento, y obtener la definición de los conjuntos de resultado (ResultSets) que el procedimiento retorna. Con esta información, OBCOM SQL Wizard puede generar estructuras específicas (strongly-typed) para cada uno de los conjuntos de resultado. Estas estructuras específicas son eficientes y generan representaciones XML muy compactas. Es decir, no tienen los problemas de las estructuras genéricas (weakly-typed) antes mencionadas.
Para que esto pueda ocurrir, se necesita que el programador defina los conjuntos de resultados (ResultSets) usando comentarios especiales en el código fuente del procedimiento. Cada definición debe comenzar con la marca “#ResultSet” y debe terminar con la marca “#EndResultSet”. Entre estas dos marcas deben existir una o más marcas “#Column” que definen el nombre y el tipo de cada una de las columnas del conjunto de resultados.
El siguiente cuadro muestra un ejemplo con el código fuente de un procedimiento Microsoft SQL Server que contiene la definición de un conjunto de resultados denominado “EMPLEADO”, cuyo nombre en plural es “EMPLEADOS”:
CREATE PROCEDURE
EMP$BUSCAR_POR_RUT
@RUT VARCHAR(10)
AS
BEGIN
-- #ResultSet EMPLEADO
EMPLEADOS
-- #Column
ID DECIMAL
-- #Column
DEPT_ID DECIMAL
-- #Column
NOMBRE VARCHAR
-- #Column
PATERNO VARCHAR
-- #Column
MATERNO VARCHAR
-- #Column
RUT VARCHAR
-- #Column
NACIMIENTO DATE
-- #Column
SUELDO DECIMAL
-- #EndResultSet
SELECT
E.ID AS
ID,
E.DEPT_ID AS DEPT_ID,
RTRIM(E.NOMBRE) AS NOMBRE,
RTRIM(E.PATERNO) AS PATERNO,
RTRIM(E.MATERNO) AS MATERNO,
E.RUT
AS RUT,
E.NACIMIENTO AS NACIMIENTO,
E.SUELDO AS SUELDO
FROM EMPLEADOS E
WHERE E.RUT = @RUT
END
El siguiente cuadro muestra el mismo ejemplo anterior, pero con código fuente de un procedimiento Oracle:
CREATE OR REPLACE
PROCEDURE EMP$BUSCAR_POR_RUT
(
RUT$ IN VARCHAR2,
EMPLEADOS$ OUT SYS_REFCURSOR
)
AS
BEGIN
-- #ResultSet EMPLEADO
EMPLEADOS
-- #Column
ID NUMBER
-- #Column
DEPT_ID NUMBER
-- #Column
NOMBRE VARCHAR
-- #Column
PATERNO VARCHAR
-- #Column
MATERNO VARCHAR
-- #Column
RUT VARCHAR
-- #Column
NACIMIENTO DATE
-- #Column
SUELDO NUMBER
-- #EndResultSet
OPEN EMPLEADOS$ FOR
SELECT
E.ID AS
ID,
E.DEPT_ID
AS DEPT_ID,
RTRIM(E.NOMBRE) AS NOMBRE,
RTRIM(E.PATERNO) AS PATERNO,
RTRIM(E.MATERNO) AS MATERNO,
E.RUT
AS RUT,
E.NACIMIENTO
AS NACIMIENTO,
E.SUELDO
AS SUELDO
FROM EMPLEADOS E
WHERE E.RUT = RUT$;
END
Importante: los nombres de las columnas definidas con la marca “#Column” deben coincidir exactamente con los nombres de las columnas (alias) especificados en la sentencia “SELECT”.
OBCOM SQL Wizard puede generar componentes EJB (Stateless Session Beans) para invocar a procedimientos almacenados desde servidores GlassFish, JBoss, WebLogic y WebSphere. Adicionalmente, puede generar un servicio web para invocar a los procedimientos mediante protocolo SOAP estándar. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la siguiente figura:

Esta ventana de opciones solicita la siguiente información para generar la componente EJB:
Las componentes EJB que genera el OBCOM SQL Wizard son de tipo sesión sin estado (Stateless Session Beans). Cada método de la clase principal del EJB (SessionBean) implementa un llamado a un procedimiento almacenado, y los argumentos de este método corresponden a los parámetros de entrada (input) del procedimiento. Los valores de salida (output) del procedimiento, así como los conjuntos de resultado (ResultSets), son retornados en una clase serializable basada en el patrón “Data Transfer Object” (DTO).
Si ocurre un error durante la ejecución del procedimiento, se dispara una excepción Java que incluye un mensaje explicativo y la excepción base (SQLException). Estas excepciones pueden ser generadas por el programador dentro de los procedimientos almacenados utilizando funciones estándar tales como “RAISE_APPLICATION_ERROR” en Oracle o “RAISERROR” en MS-SQL.
Cuando la opción “Generar usando definiciones de #ResultSet contenidas en código fuente” no se selecciona, OBCOM SQL Wizard genera código que toma la data contenida en clases javax.sql.ResultSet y la almacena en otras clases que implementan las interfaces javax.sql.RowSet y javax.sql.rowset.CachedRowSet. Esto permite utilizar esta data sin necesidad de mantener una conexión abierta con la base de datos. En aquellos servidores que no posean clases que implementen estas interfaces (por ejemplo, IBM WebSphere 6.01), es necesario utilizar alguna biblioteca que provea esta funcionalidad (por ejemplo, la biblioteca gratuita JDBC Rowset Implementations 1.0.1 provista por la Java Community Process).
OBCOM SQL Wizard puede generar componentes .NET de Microsoft (Visual Basic o C-Sharp) para invocar los procedimientos almacenados seleccionados. Adicionalmente, puede generar un Servicio Web (Web Service) ASMX para invocar a los procedimientos mediante protocolo SOAP estándar. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la siguiente figura:

Esta ventana de opciones solicita la siguiente información para generar la componente.NET:
OBCOM SQL Wizard puede generar una página JSP por cada procedimiento almacenado seleccionado. Las páginas JSP generadas por OBCOM SQL Wizard implementan servicios de tipo REST (Representational State Transfer). Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la figura siguiente:

Esta ventana de opciones solicita la siguiente información para generar las páginas JSP:
Una vez seleccionadas las opciones de generación, OBCOM SQL Wizard genera una página JSP con el mismo nombre del procedimiento. La página JSP obtiene los valores de los parámetros de entrada (input) del procedimiento de los parámetros GET o POST suministrados. Por ejemplo, la siguiente URL ejecuta un procedimiento llamado “GetUserData”, que tiene dos parámetros de entrada “UserID” y “FromDate”. Los valores de estos parámetros son “106035” y “2004-10-24”, respectivamente:
http://www.foo.cl/dbas/GetUserData.jsp?UserID=106035&FromDate=2004-10-24
Una vez ejecutado el procedimiento, la página JSP retorna los valores de los parámetros de salida (output), incluyendo el/los conjuntos de resultado (ResultSets) devueltos por el procedimiento. La página JSP también está preparada para atrapar y retornar cualquier error que ocurra durante la ejecución del procedimiento. Los valores de salida, los conjuntos de resultado (ResultSets), y los posibles errores se retornan siempre en formato XML.
OBCOM SQL Wizard puede generar una aplicación Adobe Flex que permite probar los servicios web generados en los puntos anteriores. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la siguiente figura:

Esta ventana de opciones solicita la siguiente información para generar la aplicación Adobe Flex:
Para compilar la aplicación Adobe Flex generada se necesita el compilador “mxmlc.exe”, el cual forma parte del paquete de desarrollo “Flex SDK”. Este SDK es gratuito, y se puede descargar del sito de Adobe. Al compilar la aplicación Adobe Flex, se produce un archivo “Adobe Shockwave Flash” (SWF), el cual puede activarse dentro de un navegador (browser) estándar como muestra la siguiente figura:

OBCOM SQL Wizard puede generar una página ASP de Microsoft por cada procedimiento almacenado seleccionado. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la figura siguiente:

Esta ventana de opciones solicita la siguiente información para generar las páginas ASP:
La modalidad adCmdStoreProc invoca directamente al procedimiento, en cambio la modalidad adCmdText invoca al procedimiento utilizando un comando de la forma “{?=call proc(?,?)}”. La modalidad adCmdText es más estándar, pero menos eficiente. La modalidad adCmdStoreProc es más eficiente, pero no está disponible en todas las bibliotecas OLEDB. Si está disponible, se recomienda utilizar la modalidad adCmdStoreProc.
Por cada procedimiento seleccionado, se genera una página ASP con el mismo nombre del procedimiento. La página ASP obtiene los valores de los parámetros de entrada (input) del procedimiento de los parámetros GET o POST suministrados. Por ejemplo, la siguiente URL ejecuta un procedimiento llamado “GetUserData”, que tiene dos parámetros de entrada “UserID” y “FromDate”. Los valores de estos parámetros son “106035” y “2004-10-24”, respectivamente:
http://www.foo.cl/dbas/GetUserData.asp?UserID=106035&FromDate=2004-10-24
Una vez ejecutado el procedimiento, la página ASP retorna los valores de los parámetros de salida (output), incluyendo el/los conjuntos de resultado (ResultSets) devueltos por el procedimiento. La página ASP también está preparada para atrapar y retornar cualquier error que ocurra durante la ejecución del procedimiento.
Los valores de salida, los conjuntos de resultado (ResultSets), y los posibles errores se pueden retornan en formato ADTG (binario compacto) o en formato XML. Por defecto, el formato utilizado es ADTG. Para obtener un resultado en formato XML, se debe invocar al procedimiento con un parámetro adicional de nombre “EcuFormat” con valor “XML”:
http://www.foo.cl/dbas/GetUserData.asp?EcuFormat=XML&UserID=106035&...
OBCOM SQL Wizard permite ver los parámetros ADO (OLEDB) de la conexión a la base de datos. Estos parámetros se usan para configurar el archivo GLOBAL.ASA que requieren las páginas ASP generadas en la sección anterior. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la siguiente figura:

Esta ventana muestra una lista de nombres y valores separada por punto y coma. Los nombres de los parámetros, su significado, y sus posibles valores dependen del motor de base de datos. Para mayor información, consultar la documentación de la biblioteca OLEDB respectiva.
Las páginas ASP que genera OBCOM SQL Wizard hacen uso de una variable global que define los parámetros de conexión con la base de datos. Esta variable global es inicializada en el archivo GLOBAL.ASA, y su valor normalmente corresponde a la lista de parámetros de conexión que muestra la ventana “Propiedades de la conexión ADO” (figura anterior). Por ejemplo, el siguiente cuadro muestra un archivo GLOBAL.ASA que inicializa una variable global “EcuConnString” con una lista de parámetros de conexión:
<SCRIPT
LANGUAGE=VBScript RUNAT=Server>
Sub Application_OnStart
'++
' Called when the first page of the application is used for the first time.
'--
Application("EcuConnString")
= "Provider=SQLOLEDB;User ID=DsnAdmin;..."
End Sub
</SCRIPT>
La mayoría de los parámetros de conexión que muestra OBCOM SQL Wizard tienen un valor predeterminado (default), y, por consiguiente, no es necesario definirlos en el archivo GLOBAL.ASA. Típicamente, los parámetros mínimos que se deben definir son los siguientes:
OBCOM SQL Wizard puede generar clases Visual Basic 6 de Microsoft para invocar a procedimientos almacenados. Al presionar el botón de la barra de herramientas, aparece una ventana como se observa en la siguiente figura:

Esta ventana de opciones solicita la siguiente información para generar las clases Visual Basic 6:
La modalidad adCmdStoreProc invoca directamente al procedimiento, en cambio la modalidad adCmdText invoca al procedimiento utilizando un comando de la forma “{?=call proc(?,?)}”. La modalidad adCmdText es más estándar, pero menos eficiente. La modalidad adCmdStoreProc es más eficiente, pero no está disponible en todas las bibliotecas OLEDB. Si está disponible, se recomienda utilizar la modalidad adCmdStoreProc.
OBCOM SQL Wizard posee una barra de estado como la que se muestra en la siguiente figura:
![]()
La información provista por esta barra de estado (de izquierda a derecha) es: