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, PostgreSQL, Oracle, 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 una aplicación Java que se puede usar en cualquier estación de trabajo que tenga instalado Oracle Java 7 o superior. 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 del servidor, (3) nombre de la base de datos (SID en caso de Oracle), (4) nombre del usuario, y (5) contraseña del usuario.
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 opción “Filtrar procedimientos…” del menú “Procedimientos” permite filtrar la lista de procedimientos almacenados usando (1) un patrón del nombre de los procedimientos, o (2) el nombre del esquema al que pertenecen los procedimientos. Una vez que se digitan los valores de estos filtros, hay que hacer clic en el botón “Aceptar”. El botón “Mostrar todos” cancela todos los filtros, y muestra todos los procedimientos almacenados.
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. Para seleccionar (o deseleccionar) varios procedimientos a la vez, se puede utilizar el menú “Procedimientos”. 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.
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”.
La opción “Componentes JEE…” del menú “Generar” permite 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 seleccionar esta opción de menú, aparece una ventana como se observa en la siguiente figura:
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 #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).
La opción “Componentes .NET…” del menú “Generar” permite 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 seleccionar esta opción de menú, aparece una ventana como se observa en la siguiente figura:
La opción “Páginas JSP…” del menú “Generar” permite 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 seleccionar esta opción de menú, aparece una ventana como se observa en la figura siguiente:
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.
La opción “Páginas ASP…” del menú “Generar” permite 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:
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&...
La opción “Visual Basic 6…” del menú “Generar” permite 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:
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.