COBOL - Interfaz de la Base de Datos


Advertisements

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:

  • Embedded SQL
  • Programación de aplicaciones DB2
  • Variables Host
  • SQLCA
  • Las consultas SQL
  • Cursores

Embedded SQL

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.

Programación de aplicaciones DB2

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.

Variables Host

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 ( : ).

Sintaxis

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

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.

Sintaxis

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.

Las consultas SQL

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

Cursores

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:

  • Declarar
  • Abrir
  • Cerrar
  • Buscar

Declare 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.

Abrir

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

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.

Buscar

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
Advertisements