COBOL - Interfaz de base de datos
A partir de ahora, hemos aprendido el uso de archivos en COBOL. Ahora, discutiremos cómo un programa COBOL interactúa con DB2. Implica los siguientes términos:
- SQL incorporado
- Programación de aplicaciones DB2
- Variables de host
- SQLCA
- Consultas SQL
- Cursors
SQL incorporado
Las sentencias de SQL incorporado se utilizan en los programas COBOL para realizar operaciones de SQL estándar. El procesador SQL procesa previamente las sentencias de SQL incorporado antes de que se compile el programa de aplicación. COBOL se conoce como elHost Language. Las aplicaciones COBOL-DB2 son aquellas aplicaciones que incluyen tanto COBOL como DB2.
Las sentencias SQL incorporadas funcionan como sentencias SQL normales con algunos cambios menores. Por ejemplo, la salida de una consulta se dirige a un conjunto predefinido de variables que se denominanHost Variables. Se coloca una cláusula INTO adicional en la instrucción SELECT.
Programación de aplicaciones DB2
Las siguientes son reglas que se deben seguir al codificar un programa COBOL-DB2:
Todas las sentencias SQL deben estar delimitadas entre EXEC SQL y ENDEXEC..
Las sentencias SQL deben codificarse en el Área B.
Todas las tablas que se utilizan en un programa deben declararse en la sección WorkingStorage. Esto se hace usando elINCLUDE declaración.
Todas las sentencias SQL distintas de INCLUDE y DECLARE TABLE deben aparecer en la División de procedimientos.
Variables de host
Las variables de host se utilizan para recibir datos de una tabla o insertar datos en una tabla. Las variables del sistema principal deben declararse para todos los valores que se pasarán entre el programa y DB2. Se declaran en la Sección Trabajo-Almacenamiento.
Las variables del host no pueden ser elementos de grupo, pero pueden agruparse en la estructura del host. Ellos no pueden serRenamed o Redefined. Utilizando variables del lenguaje principal con sentencias SQL, antepongacolon (:)..
Sintaxis
A continuación se muestra la sintaxis para declarar variables del lenguaje principal e incluir tablas en la sección Almacenamiento de trabajo:
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
SQLCA es un área de comunicación de SQL a través de la cual DB2 pasa la retroalimentación de la ejecución de SQL al programa. Le dice al programa si una ejecución fue exitosa o no. Hay una serie de variables predefinidas en SQLCA comoSQLCODEque contiene el código de error. El valor '000' en SQLCODE indica una ejecución exitosa.
Sintaxis
A continuación se muestra la sintaxis para declarar un SQLCA en la sección Working-Storage:
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
Consultas SQL
Supongamos que tenemos una tabla llamada 'Estudiante' que contiene Id. De estudiante, Nombre de estudiante y Dirección de estudiante.
La tabla ESTUDIANTE 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 de SELECT 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 anterior -
//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 compila y ejecuta el programa anterior, produce el siguiente resultado:
1004 Chulbul Pandey Lucknow
El siguiente ejemplo muestra el uso de INSERT 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.
MOVE 'TutorialsPoint' 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 anterior -
//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 compila y ejecuta el programa anterior, produce el siguiente resultado:
Record Inserted Successfully
1005 TutorialsPoint Hyderabad
El siguiente ejemplo muestra el uso de UPDATE 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 anterior -
//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 compila y ejecuta el programa anterior, produce el siguiente resultado:
Record Updated Successfully
El seguimiento example muestra el uso de DELETE 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 anterior -
//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 compila y ejecuta el programa anterior, produce el siguiente resultado:
Record Deleted Successfully
Cursores
Los cursores se utilizan para gestionar varias selecciones de filas a la vez. Son estructuras de datos que contienen todos los resultados de una consulta. Se pueden definir en la Sección Trabajo-Almacenamiento o en la División de Procedimientos. Las siguientes son las operaciones asociadas con Cursor:
- Declare
- Open
- Close
- Fetch
Declarar cursor
La declaración del cursor se puede hacer en la Sección de Trabajo-Almacenamiento o en la División de Procedimientos. La primera declaración es la declaración DECLARE, que es una declaración no ejecutable.
EXEC SQL
DECLARE STUDCUR CURSOR FOR
SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.
Abierto
Antes de usar un cursor, se debe realizar la instrucción Open. La instrucción Open prepara SELECT para su ejecución.
EXEC SQL
OPEN STUDCUR
END-EXEC.
Cerrar
La instrucción Close libera toda la memoria ocupada por el cursor. Es obligatorio cerrar un cursor antes de finalizar un programa.
EXEC SQL
CLOSE STUDCUR
END-EXEC.
Ir a buscar
La instrucción Fetch identifica el cursor y coloca el valor en la cláusula INTO. Una instrucción Fetch se codifica en bucle a medida que obtenemos 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 recuperar todos los registros de la tabla ESTUDIANTE:
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 anterior -
//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 compila y ejecuta el programa anterior, produce el siguiente resultado:
1001 Mohtashim M. Hyderabad
1002 Nishant Malik Delhi
1003 Amitabh Bachan Mumbai
1004 Chulbul Pandey Lucknow