tema del mes 148  
noviembre 2004    
 
Portada
Utilizar SQL dinámico en RPG

Utilizar SQL dinámico en RPG  

Cree y ejecute dinámicamente sentencias de SQL en un programa RPGLE

SQL es una herramienta muy potente que permite llevar a cabo funciones de la base de datos que pueden ser muy engorrosas de realizar, por no decir imposibles, en CL, Cobol, Java, RPG u otros lenguajes. RPG, sin embargo, nos ofrece lo mejor de ambos mundos con SQLRPGLE. Con un programa escrito en SQLRPGLE es posible crear y ejecutar dinámicamente sentencias de SQL en un programa RPGLE, lo que aumenta la flexibilidad y el rendimiento. SQL permite realizar funciones de la base de datos que no pueden ejecutarse con archivos lógicos ni con OPNQRYF. Por ejemplo, SQL puede utilizarse para unir dos archivos y que la clave pertenezca al segundo archivo.

La universidad confesional Brigham Young de Idaho, donde trabajo, tiene una gran número de usuarios que han sido misioneros en distintas partes del mundo y muchos de ellos hablan por lo menos otro idioma aparte del inglés. El campus se encuentra en Rexburg (Idaho), por donde pasa la autopista 20 de los Estados Unidos, una de las principales vías para acceder al Parque Nacional de Yellowstone. Cada año, miles de turistas extranjeros pasan por allí. Ocasionalmente se producen accidentes de tránsito graves y el personal médico local necesita intérpretes que puedan comunicarse con las víctimas de los accidentes. Una noche, la policía del campus me pidió una lista de estudiantes que hablaran chino mandarín. Unos turistas taiwaneses se habían visto implicados en un accidente y necesitaban un intérprete. Como en nuestra base de datos se listan los países en que han servido nuestros misioneros, pude utilizar SQL para generar en un abrir y cerrar de ojos una lista de los que reunían las condiciones necesarias.

Al día siguiente, me dí cuenta de que podía darse el caso de que yo u otras personas del departamento informático no estuvieran disponibles y que deberíamos permitir que la policía del campus tuviera acceso a esas listas sin necesidad de que tuvieran que localizarnos. Después de experimentar con los métodos tradicionales de acceso a la base de datos, dirigí mi atención al método SQLRPGLE, que ofrecía la flexibilidad y rendimiento que estaba buscando. Inicialmente me preocupaba el tiempo de respuesta de la aplicación, pero fue una grata sorpresa comprobar que apenas había diferencias entre el tiempo de respuesta de esta aplicación y la de un programa tradicional. A continuación, vamos a examinar cómo se utiliza SQLRPGLE en un programa escrito en RPGLE.

El código
Los programas en SQLRPGLE se escriben de forma muy parecida a cualquier otro programa en RPGLE. El tipo de fuente de PDM es SQLRPGLE. El mandato para crear el programa es CRTSQLRPGI (Crear SQL RPG ILE), que se ejecutará cuando se utiliza la opción 14 de PDM con un miembro fuente de tipo SQLRPGLE. No obstante, se necesitan algunas adiciones al código para habilitar el acceso a SQL. Vamos a ver qué es lo que se necesita.

Cursor de SQL. En un programa escrito en SQLRPGLE, primero debe declararse un cursor de SQL. Un cursor es un puntero que hace referencia a una fila (es decir, a un registro) de una base de datos, de la misma forma que el cursor de una hoja de cálculo apunta a la fila en la que se está trabajando. Si un programa intenta abrir un cursor que ya está abierto, se producirá un error. Por lo que el programa deberá cerrar el cursor antes de intentar abrirlo.

Para indicar las sentencias de SQL en el programa SQLRPGLE se utiliza la especificación C entre las sentencias /Exec y /End-Exec de SQL. Cada especificación C incluída debe tener un signo " + " en la columna 7. Por ejemplo, el código siguiente declara el cursor Cursor para la sentencia de SQL llamada MySQL:

C/EXEC SQL
C   DECLARE Cursor CURSOR FOR MySQL
C/END-EXEC

Sentencia de SQL. A continuación, debe crearse una sentencia de SQL con la misma sintaxis que se utilizaría en una sesión de SQL. Por ejemplo:

SELECT Nom from Nombres where Nom like 'S%'

consulta el campo Nom del archivo Nombres y devuelve todos los nombres que empiezan por la letra "S".

Utilice una sentencia Eval, como la sentencia que se muestra en la Figura 1, para crear la serie de caracteres de la sentencia de SQL.

 *--- Figura 1
 *
C      eval  SqlStr = 'SELECT SLRCURR.NLFMMS, -
C            SRLCURR.LOPHMS, SRLCURR.IDNOMS, -
C            ADLMISON.NAMEMN -
C            FROM adLmison, SRLCURR -
C            WHERE adLmison.namemn like '''
C            + %trim(CNTRY) + '%''' +
C            AND ADLMISON.CODEMN = srlcurr.mscdms'

En la sentencia de la Figura 1, el programa une dos archivos lógicos: SRLCURR y ADLMISON. SRLCURR contiene la lista de estudiantes actuales de la universidad y ADLMISON los nombres de las misiones en que han prestado sus servicios los estudiantes. Observe que he mezclado mayúsculas y minúsculas en la sentencia. SQL no distingue entre mayúsculas y minúsculas excepto en los propios datos, de manera que he utilizado una combinación de mayúsculas y minúsculas para que la sentencia sea más legible.

Preparación de SQL. Cuando la sentencia de SQL ya está lista, debemos prepararla para ejecutarla. Este es un ejemplo de sentencia Prepare:

C/EXEC SQL
C+   PREPARE MySQL FROM :SerieCarSQL
C/END-EXEC

A continuación, hay que cerrar y volver a abrir el cursor:

C/EXEC SQL
C+   CLOSE Cursor
C/END-EXEC
C/EXEC SQL
C+   OPEN Cursor
C/END-EXEC

Fetch de SQL. Ahora ya estamos listos para utilizar una sentencia Fetch para obtener los datos del programa. En la Figura 2 se muestra una sentencia Fetch. SQLCOD es el código devuelto por SQL.

 *--- Figura 2
 *
C          DOW  SQLCOD <> 100 and SQLCOD >= 0

C/EXEC SQL
C+   FETCH MyCursor
C+   INTO :ilfmms, :lophms, :IDNOM, :NAMES
C/END-EXEC

C          IF   SQLCOD <> 100 and SQLCOD >= 0
C          exsr Processdata
C          ENDIF
C          ENDDO

C/EXEC SQL
C+   CLOSE MyCursor
C/END-EXEC

Un valor de 100 significa que el programa ha llegado al final de los datos. Un valor negativo indica una condición de error. Para especificar los campos de datos de recepción se utiliza un signo de dos puntos " : " seguido de los nombres de los campos. Estos nombres de campos no tienen por qué ser los mismos que los nombres de los campos del conjunto de datos, pero los tipos de datos sí que deben coincidir y tener una longitud lo suficiente grande para recibir el valor completo de los campos del conjunto de datos. La cláusula Into traslada los datos de los campos del archivo consultado a los campos definidos en el programa. Cuando éste llega al final de los datos, cierra el cursor.

Utilizar campos de RPG
Las sentencias de SQL pueden utilizar campos de RPG en vez de campos dinámicos. En el ejemplo, siguiente, el programa elimina los registros de ARCHIVO si el campo Fecha del registro es menor que el valor de la variable Fecha1.

D FECHA1                1     8 0

C/EXEC SQL DELETE FROM ARCHIVO WHERE
C+ FECHA < :FECHA1
C/END-EXEC

Tenga en cuenta que para utilizar programas SQLRPGLE con el fin de modificar archivos de datos, deberá registrar por diario los archivos o establecer el parámetro Commit del mandato CRTSQLRPGI a *NONE. De lo contrario, los archivos de datos prohíben las operaciones de actualización y eliminación.

¡Conquistar lo inconquistable!
La combinación de SQL y RPG le proveerá de más armas para su arsenal de programación, que harán que tareas aparentemente invencibles le parezcan factibles.

Terry Silva es programador de sistemas en la universidad Brigham Young de Rexburg (Idaho). Trabaja con equipos midrange desde hace 28 años.


Total Lecturas: 11529  |  Recomendar su lectura:  


   
   

© Publicaciones HELP400, S.L. (Todos los derechos reservados)