Hasta ahora, hemos aprendido el uso de los archivos en COBOL. Ahora, vamos a analizar cómo interactúa un programa COBOL con DB2. Implica las siguientes condiciones:
Las sentencias SQL incorporadas se utilizan en programas COBOL SQL estándar para realizar las operaciones. Las sentencias SQL incorporadas son preprocesados por procesador SQL antes de que el programa de aplicación se compila. COBOL es conocida como la lengua del país anfitrión. COBOL-DB2 son las aplicaciones que incluyen tanto COBOL y DB2.
Las sentencias SQL incorporadas como declaraciones SQL normal con algunos cambios de menor importancia. Por ejemplo, que la producción de una consulta se dirige a un conjunto predefinido de variables que se conoce como Host Variables. Cláusula adicional se coloca dentro de la instrucción SELECT.
Siguientes son las reglas que deben seguirse al codificar un COBOL-DB2 programa:
Todas las instrucciones SQL debe estar delimitado entre EXEC SQL y END-EXEC.
Instrucciones SQL debe estar codificado en la zona B.
Todas las tablas en las que se utilizan en un programa debe ser declarado en la Working-Storage Sección. Esto se realiza mediante lainclude instrucción.
Todas las instrucciones SQL que incluyen y DECLARAR TABLA debe aparecer en el procedimiento.
De las variables se utilizan para la recepción de datos de una tabla o insertar datos en una tabla. De las variables se deben declarar en todos los valores que se van a pasar entre el programa y el DB2. Que se declare en la Working-Storage Sección.
Las variables de los elementos del grupo no puede ser, pero pueden ser agrupados en estructura de acogida. Que no se puede cambiar o redefinirse. Uso de variables con instrucciones SQL, anteponga el prefijo de dos puntos ( : ).
Siguiente es la sintaxis para declarar variables y host incluir tablas en Working-Storage sección:
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE table-name END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 STUDENT-REC. 05 STUDENT-ID PIC 9(4). 05 STUDENT-NAME PIC X(25). 05 STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC.
SQLCA SQL es un área de la comunicación a través del cual pasa el DB2 comentarios de SQL a la ejecución del programa. Indica al programa si la ejecución ha sido correcta o no. Hay una serie de variables predefinidas en SQLCA como SQLCODE que contiene el código de error. El valor '000' en los estados SQLCODE una ejecución correcta.
Siguiente es la sintaxis para declarar una SQLCA en la Working-Storage sección:
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC.
Supongamos que tenemos una tabla denominada como 'alumno' que contiene Student-Id , Student-Name y Student-Address .
La tabla de alumnos contiene los siguientes datos:
Student Id Student Name Student Address 1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
El siguiente ejemplo muestra el uso deSELECT consulta en un programa COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE STUDENT END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 WS-STUDENT-REC. 05 WS-STUDENT-ID PIC 9(4). 05 WS-STUDENT-NAME PIC X(25). 05 WS-STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC. PROCEDURE DIVISION. EXEC SQL SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID=1004 END-EXEC. IF SQLCODE=0 DISPLAY WS-STUDENT-RECORD ELSE DISPLAY 'Error' END-IF. STOP RUN.
JCL para ejecutar el programa COBOL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP001 EXEC PGM=IKJEFT01 //STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
Cuando se compila y ejecuta el programa antes mencionado, se produce el resultado siguiente:
1004 Chulbul Pandey Lucknow
El siguiente ejemplo muestra el uso de INSERT en un programa COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE STUDENT END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 WS-STUDENT-REC. 05 WS-STUDENT-ID PIC 9(4). 05 WS-STUDENT-NAME PIC X(25). 05 WS-STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC. PROCEDURE DIVISION. MOVE 1005 TO WS-STUDENT-ID. MOVE 'Howcodex' TO WS-STUDENT-NAME. MOVE 'Hyderabad' TO WS-STUDENT-ADDRESS. EXEC SQL INSERT INTO STUDENT(STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS) VALUES (:WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS) END-EXEC. IF SQLCODE=0 DISPLAY 'Record Inserted Successfully' DISPLAY WS-STUDENT-REC ELSE DISPLAY 'Error' END-IF. STOP RUN.
JCL para ejecutar el programa COBOL.
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP001 EXEC PGM=IKJEFT01 //STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
Cuando se compila y ejecuta el programa antes mencionado, se produce el resultado siguiente:
Record Inserted Successfully 1005 Howcodex Hyderabad
El siguiente ejemplo muestra el uso deACTUALIZAR consulta en un programa COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE STUDENT END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 WS-STUDENT-REC. 05 WS-STUDENT-ID PIC 9(4). 05 WS-STUDENT-NAME PIC X(25). 05 WS-STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC. PROCEDURE DIVISION. MOVE 'Bangalore' TO WS-STUDENT-ADDRESS. EXEC SQL UPDATE STUDENT SET STUDENT-ADDRESS=:WS-STUDENT-ADDRESS WHERE STUDENT-ID=1003 END-EXEC. IF SQLCODE=0 DISPLAY 'Record Updated Successfully' ELSE DISPLAY 'Error' END-IF. STOP RUN.
JCL para ejecutar el programa COBOL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP001 EXEC PGM=IKJEFT01 //STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
Cuando se compila y ejecuta el programa antes mencionado, se produce el resultado siguiente:
Record Updated Successfully
El siguiente ejemplo muestra el uso de ELIMINAR consulta en un programa COBOL:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE STUDENT END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 WS-STUDENT-REC. 05 WS-STUDENT-ID PIC 9(4). 05 WS-STUDENT-NAME PIC X(25). 05 WS-STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC. PROCEDURE DIVISION. MOVE 1005 TO WS-STUDENT-ID. EXEC SQL DELETE FROM STUDENT WHERE STUDENT-ID=:WS-STUDENT-ID END-EXEC. IF SQLCODE=0 DISPLAY 'Record Deleted Successfully' ELSE DISPLAY 'Error' END-IF. STOP RUN.
JCL para ejecutar el programa COBOL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP001 EXEC PGM=IKJEFT01 //STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
Cuando se compila y ejecuta el programa antes mencionado, se produce el resultado siguiente:
Record Deleted Successfully
Los cursores se utilizan para manejar múltiples filas selecciones en un momento. Son estructuras de datos que contenga todos los resultados de una consulta. Estas pueden ser definidas en la Working-Storage sección o división del procedimiento. A continuación, se indican las operaciones asociadas con el cursor:
Declaración Cursor se puede hacer en la Working-Storage sección o división del procedimiento. La primera declaración es la instrucción DECLARE que no es una instrucción ejecutable.
EXEC SQL DECLARE STUDCUR CURSOR FOR SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID >:WS-STUDENT-ID END-EXEC.
Antes de utilizar un cursor, declaración abierta debe realizarse. La instrucción Open prepara la SELECCIONE para su ejecución.
EXEC SQL OPEN STUDCUR END-EXEC.
Cerrar declaración libera toda la memoria ocupada por el cursor. Es obligatorio para cerrar el cursor antes de terminar el programa.
EXEC SQL CLOSE STUDCUR END-EXEC.
Fetch identifica el cursor y establece el valor de la cláusula into. Una instrucción Fetch es codificada en bucle, como tenemos una fila a la vez.
EXEC SQL FETCH STUDCUR INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS END-EXEC.
El siguiente ejemplo muestra el uso del cursor para obtener todos los registros de la tabla de alumnos:
IDENTIFICATION DIVISION. PROGRAM-ID. HELLO. DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC. EXEC SQL INCLUDE STUDENT END-EXEC. EXEC SQL BEGIN DECLARE SECTION END-EXEC. 01 WS-STUDENT-REC. 05 WS-STUDENT-ID PIC 9(4). 05 WS-STUDENT-NAME PIC X(25). 05 WS-STUDENT-ADDRESS X(50). EXEC SQL END DECLARE SECTION END-EXEC. EXEC SQL DECLARE STUDCUR CURSOR FOR SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID >:WS-STUDENT-ID END-EXEC. PROCEDURE DIVISION. MOVE 1001 TO WS-STUDENT-ID. PERFORM UNTIL SQLCODE = 100 EXEC SQL FETCH STUDCUR INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS END-EXEC DISPLAY WS-STUDENT-REC END-PERFORM STOP RUN.
JCL para ejecutar el programa COBOL:
//SAMPLE JOB(TESTJCL,XXXXXX),CLASS=A,MSGCLASS=C //STEP001 EXEC PGM=IKJEFT01 //STEPLIB DD DSN=MYDATA.URMI.DBRMLIB,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSUDUMP DD SYSOUT=* //SYSOUT DD SYSOUT=* //SYSTSIN DD * DSN SYSTEM(SSID) RUN PROGRAM(HELLO) PLAN(PLANNAME) - END /*
Cuando se compila y ejecuta el programa antes mencionado, se produce el resultado siguiente:
1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow