COBOL - Interfaccia database

A partire da ora, abbiamo imparato l'uso dei file in COBOL. Ora discuteremo come un programma COBOL interagisce con DB2. Comprende i seguenti termini:

  • SQL incorporato
  • Programmazione dell'applicazione DB2
  • Variabili host
  • SQLCA
  • Query SQL
  • Cursors

SQL incorporato

Le istruzioni SQL incorporate vengono utilizzate nei programmi COBOL per eseguire operazioni SQL standard. Le istruzioni SQL incorporate vengono preelaborate dal processore SQL prima che il programma applicativo venga compilato. COBOL è noto comeHost Language. Le applicazioni COBOL-DB2 sono quelle applicazioni che includono sia COBOL che DB2.

Le istruzioni SQL incorporate funzionano come normali istruzioni SQL con alcune piccole modifiche. Ad esempio, l'output di una query viene indirizzato a un insieme predefinito di variabili che vengono indicate comeHost Variables. Una clausola INTO aggiuntiva viene inserita nell'istruzione SELECT.

Programmazione dell'applicazione DB2

Di seguito sono riportate le regole da seguire durante la codifica di un programma COBOL-DB2:

  • Tutte le istruzioni SQL devono essere delimitate tra EXEC SQL e ENDEXEC..

  • Le istruzioni SQL devono essere codificate nell'Area B.

  • Tutte le tabelle utilizzate in un programma devono essere dichiarate nella sezione WorkingStorage. Questo viene fatto usando ilINCLUDE dichiarazione.

  • Tutte le istruzioni SQL diverse da INCLUDE e DECLARE TABLE devono essere visualizzate nella divisione procedure.

Variabili host

Le variabili host vengono utilizzate per ricevere dati da una tabella o inserire dati in una tabella. Le variabili host devono essere dichiarate per tutti i valori che devono essere passati tra il programma e il DB2. Sono dichiarati nella sezione Working-Storage.

Le variabili host non possono essere elementi di gruppo, ma possono essere raggruppate insieme nella struttura host. Non possono essereRenamed o Redefined. Utilizzando variabili host con istruzioni SQL, anteponile acolon (:)..

Sintassi

Di seguito è riportata la sintassi per dichiarare le variabili host e includere tabelle nella sezione Working-Storage -

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 è un'area di comunicazione SQL attraverso la quale DB2 trasmette il feedback dell'esecuzione SQL al programma. Indica al programma se un'esecuzione ha avuto successo o meno. Ci sono un certo numero di variabili predefinite in SQLCA comeSQLCODEche contiene il codice di errore. Il valore "000" in SQLCODE indica un'esecuzione riuscita.

Sintassi

Di seguito è riportata la sintassi per dichiarare un SQLCA nella sezione Working-Storage -

DATA DIVISION.
WORKING-STORAGE SECTION.
	EXEC SQL
	INCLUDE SQLCA
	END-EXEC.

Query SQL

Supponiamo di avere una tabella denominata "Student" che contiene Student-Id, Student-Name e Student-Address.

La tabella STUDENT contiene i seguenti dati:

Student Id		Student Name		Student Address
1001 			   Mohtashim M.		Hyderabad
1002			   Nishant Malik		Delhi
1003 			   Amitabh Bachan		Mumbai
1004			   Chulbul Pandey		Lucknow

L'esempio seguente mostra l'utilizzo di SELECT query in un programma 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 per eseguire il programma COBOL di cui sopra -

//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
/*

Quando compili ed esegui il programma sopra, produce il seguente risultato:

1004 Chulbul Pandey		Lucknow

L'esempio seguente mostra l'utilizzo di INSERT query in un programma 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 per eseguire il programma COBOL di cui sopra -

//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
/*

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Record Inserted Successfully
1005 TutorialsPoint		Hyderabad

L'esempio seguente mostra l'utilizzo di UPDATE query in un programma 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 per eseguire il programma COBOL di cui sopra -

//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
/*

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Record Updated Successfully

Il seguente example mostra l'utilizzo di DELETE query in un programma 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 per eseguire il programma COBOL di cui sopra -

//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
/*

Quando compili ed esegui il programma sopra, produce il seguente risultato:

Record Deleted Successfully

Cursori

I cursori vengono utilizzati per gestire più selezioni di righe alla volta. Sono strutture di dati che contengono tutti i risultati di una query. Possono essere definiti nella sezione Working-Storage o nella Divisione Procedure. Di seguito sono riportate le operazioni associate al Cursore:

  • Declare
  • Open
  • Close
  • Fetch

Dichiara il cursore

La dichiarazione del cursore può essere effettuata nella sezione Working-Storage o nella Divisione Procedure. La prima istruzione è l'istruzione DECLARE che è un'istruzione non eseguibile.

EXEC SQL
   DECLARE STUDCUR CURSOR FOR
   SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
   WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

Aperto

Prima di utilizzare un cursore, è necessario eseguire l'istruzione Open. L'istruzione Open prepara SELECT per l'esecuzione.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Vicino

L'istruzione Close rilascia tutta la memoria occupata dal cursore. È obbligatorio chiudere un cursore prima di terminare un programma.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Fetch

L'istruzione Fetch identifica il cursore e inserisce il valore nella clausola INTO. Un'istruzione Fetch è codificata in loop man mano che otteniamo una riga alla volta.

EXEC SQL
   FETCH STUDCUR
   INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

Il seguente esempio mostra l'utilizzo del cursore per recuperare tutti i record dalla tabella STUDENT -

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 per eseguire il programma COBOL di cui sopra -

//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
/*

Quando compili ed esegui il programma sopra, produce il seguente risultato:

1001 Mohtashim M.		Hyderabad
1002 Nishant Malik		Delhi
1003 Amitabh Bachan		Mumbai
1004 Chulbul Pandey		Lucknow