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