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