Cuando queramos extraer más de un registro de una tabla DB2 ya no nos será suficiente con emplear la sentencia SELECT (con la que únicamente se obtiene un registro). En cambio, tendremos que recurrir a la sentencia FETCH, que nos permitirá ir recuperando, de forma recurrente, registros de la tabla.
La sentencia FETCH se emplea normalmente cuando queremos implementar un programa Cobol cuyo objetivo es extraer un listado de información o mostrar por pantalla una lista de datos. En esos casos, con dicha sentencia podremos ir recuperando registros de forma iterativa a partir de una clave inicial de lectura.
Aquí tenemos un ejemplo de cómo se debería implementar una sentencia FETCH con acceso, mediante Cursor, a una tabla DB2.
EXEC SQL
FETCH CUR_JJCLIEM0
INTO
:S-CLIENTE,
:S-NOMBRE,
:S-APELLIDO1,
:S-APELLIDO2,
:S-ALTURA,
:S-PESO,
:S-IMC,
:S-OBSERVACIONES INDICATOR :I-OBS,
:S-FECHA
END-EXEC
La estructura de la tabla DB2 (cuya denominación es JJCLIEM0) a la que se accede mediante el cursor indicado se compone de los siguientes campos:
CLIENTE numeric(10)
NOMBRE char(20)
APELLIDO1 char(20)
APELLIDO2 char(20)
ALTURA numeric(3,2)
PESO numeric(3,2)
IMC numeric(3,2)
OBSERVACIONES char(50)
FECHA timestamp
Como vemos, esta sentencia tiene los siguientes componentes:
1º) En primer lugar, se incluye el comando FETCH y, a continuación, se indica el nombre del Cursor con el que se accederá a la tabla DB2 (en este caso, se trata del cursor CUR_JJCLIEM0, que accede a la tabla DB2 JJCLIEM0).
2º) Posteriormente, tras la claúsula INTO, se deben añadir los nombres de las variables en las que se irán cargando los valores recogidos de los campos correspondientes de la tabla DB2. Los nombres de las variables del programa Cobol deberán estar precedidos por el literal ":".
En el caso del ejemplo, las variables que recogen la información están definidas de la siguiente forma en el programa Cobol.
01 PAR-SALIDA.
05 S-CLIENTE PIC S9(10) COMP.
05 S-NOMBRE PIC X(20).
05 S-APELLIDO1 PIC X(20).
05 S-APELLIDO2 PIC X(20).
05 S-ALTURA PIC S999V99 COMP-3.
05 S-PESO PIC S999V99 COMP-3.
05 S-IMC PIC S999V99 COMP-3.
05 S-OBSERVACIONES PIC X(50).
05 S-FECHA PIC X(26).
01 VAR-INDICADOR-NULO.
05 I-OBS PIC S9(4) COMP.
Como vemos, para poder trabajar con la sentencia FETCH previamente tendremos que haber definido un CURSOR para la tabla DB2 sobre la que queremos acceder. En un futuro post veremos cómo se debe realizar la declaración de un cursor en un programa Cobol.
Obviamente, y al igual que ocurría con la sentencia SELECT, en la sección WORKING-STORAGE tendremos que haber realizado el DECLARE TABLE de la tabla JJCLIEM0 y el INCLUDE SQLCA correspodientes. En caso contrario, se producirá un error en la fase de compilación.
De hecho, tras la sentencia FETCH deberíamos incluir un control de la variable SQLCODE (de la estructura SQLCA), para verificar si el acceso a DB2 ha sido correcto o no. El acceso podría realizarse de forma similar a la indicada a continuación.
EVALUATE TRUE
WHEN SQLCODE = ZEROES
ADD 1 TO CO-LEIDOS-ENTRADA1
DISPLAY 'ACCESO DB2 OK'
WHEN SQLCODE = +100
SET FIN-ENTRADA1 TO TRUE
DISPLAY '---> NO EXISTE REGISTRO'
WHEN OTHER
MOVE SQLCODE TO SQLCODE-DIS
DISPLAY 'ERROR ACCESO DB2. SQLCODE: ' SQLCODE-DIS
MOVE SQLCODE-DIS TO WS-FILE-ERROR
MOVE 'ERROR ACCESO DB2' TO WS-DESCRIPCION
PERFORM 9980-GENERAR-ERROR
THRU 9980-GENERAR-ERROR-EXIT
END-EVALUATE.
Finalmente, también hay que mencionar que, antes de la ejecución del FETCH, deberá realizarse la apertura del CURSOR. Del mismo modo, una vez finalizado el acceso FETCH, habrá que realizar el cierre del CURSOR. Esto lo veremos en detalle en el post sobre Cursores.
Pues nada, eso es todo por lo que respecta a esta sentencia. Definiéndola tal y como se comenta en el post, no deberíamos tener problema alguno en la compilación y el bind.
Saludos.
No hay comentarios:
Publicar un comentario