Desarrollando en Cobol y Natural sobre Plataforma Mainframe

viernes, 1 de noviembre de 2013

Sentencia FETCH en una tabla DB2

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

Related Posts Plugin for WordPress, Blogger...