Ab sofort haben wir die Verwendung von Dateien in COBOL gelernt. Jetzt werden wir diskutieren, wie ein COBOL-Programm interagiert mit DB2. Es geht um folgende Begriffe:
Embedded SQL-Anweisungen werden in COBOL-Programmen verwendet werden, um Standard-SQL-Operationen durchzuführen. Embedded SQL-Anweisungen, die von SQL-Prozessor vorverarbeitet, bevor das Anwendungsprogramm kompiliert wird. COBOL als Host-Sprache bekannt. COBOL-DB2-Anwendungen sind Anwendungen, die sowohl COBOL und DB2 sind.
Embedded SQL-Anweisungen arbeiten wie normale SQL-Anweisungen mit einigen kleinen Änderungen. Beispielsweise wird die Ausgabe einer Anfrage an eine vordefinierte Reihe von Variablen, die als genannten Hostvariablen gerichtet ist. Eine zusätzliche INTO-Klausel in der SELECT-Anweisung gesetzt..
Im Folgenden sind Regeln, während der Codierung eines COBOL-DB2-Programm beachtet werden:
Alle SQL-Anweisungen muss abgegrenzt zwischen EXEC SQL und END-EXEC.
SQL-Anweisungen müssen im Bereich B kodiert werden
Alle Tabellen, die in einem Programm verwendet werden, müssen in der WORKING-STORAGE SECTION deklariert werden. Dies wird durch verwendung getan enthalten Aussage.
Alle SQL-Anweisungen andere als INCLUDE und DECLARE TABLE müssen angezeigt in der Prozedur Abteilung.
Host Variablen sind zum Empfangen von Daten aus einer Tabelle oder zum Einfügen von Daten in eine Tabelle verwendet. Host-Variablen muss deklariert für alle Werte, die zwischen dem Programm und der DB2 übergeben werden sollen. Sie werden in der WORKING-STORAGE SECTION deklariert.
Hostvariable können nicht Gruppe Artikel sein, aber sie können in der Host-Struktur zusammen gruppiert werden. sie können nicht umbenannt oder neu definiert . Verwendung Hostvariable mit SQL-Anweisungen, voran sie mit einem Doppelpunkt (:).
Es folgt die Syntax, um Host-Variablen deklarieren und Tabellen in WORKING-STORAGE SECTION:
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 ist ein SQL-Kommunikationsbereich , durch den DB2 übergibt die Bewertungen von SQL-Ausführung des Programms. Es erzählt die Programm, ob eine Ausführung erfolgreich war oder nicht. Es gibt eine Reihe von vordefinierten Variablen im SQL-Kommunikationsbereich wie SQLCODE , die den Fehlercode enthält. Der Wert "000" in SQLCODE besagt eine erfolgreiche Umsetzung.
Es folgt die Syntax, um eine SQL-Kommunikationsbereich in der WORKING-STORAGE SECTION deklariert werden:
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC.
Lassen Sie uns Nehmen wir an, wir haben eine Tabelle als "Schüler", dass enthält Schüler-ID, Schülername , und der Student-Adresse .
Der STUDENT Tabelle enthält die folgenden Daten:
Student Id Student Name Student Address 1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
In der folgenden Beispiel zeigt die Verwendung von SELECT Abfrage in einem COBOL-Programm:
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 oben COBOL-Programm zu ausführen:
//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 /*
Wenn Sie kompilieren und führen Sie das obige Programm, es produziert das folgende Ergebnis:
1004 Chulbul Pandey Lucknow
In der folgenden Beispiel zeigt die Verwendung von INSERT Abfrage in einem COBOL-Programm:
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 oben COBOL-Programm zu ausführen:
//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 /*
Wenn Sie kompilieren und führen Sie das obige Programm, es produziert das folgende Ergebnis:
Record Inserted Successfully 1005 Howcodex Hyderabad
In der folgenden Beispiel zeigt die Verwendung von UPDATE Abfrage in einem COBOL-Programm:
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 oben COBOL-Programm zu ausführen:
//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 /*
Wenn Sie kompilieren und führen Sie das obige Programm, es produziert das folgende Ergebnis:
Record Updated Successfully
In der folgenden Beispiel zeigt die Verwendung von DELETE Abfrage in einem COBOL-Programm:
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 oben COBOL-Programm zu ausführen:
//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 /*
Wenn Sie kompilieren und führen Sie das obige Programm, es produziert das folgende Ergebnis:
Record Deleted Successfully
Cursor werden verwendet, um mehrere Auswahlen Reihe zu einer Zeit, zu behandeln. Es sind Datenstrukturen, die alle Ergebnisse einer Abfrage zu halten. Sie können in der WORKING-STORAGE SECTION oder der Prozedur Teilung definiert werden. Im Folgenden werden die Operationen mit Cursor verbunden:
Cursor Deklaration Getan werden kann in der WORKING-STORAGE SECTION oder der Prozedur Teilung . Die erste Aussage ist die DECLARE-Anweisung, die eine nicht-ausführbare Anweisung ist.
EXEC SQL DECLARE STUDCUR CURSOR FOR SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID >:WS-STUDENT-ID END-EXEC.
Bevor verwendung einen Cursor, muss Open-Anweisung ausgeführt werden. Die Open-Anweisung bereitet den SELECT für Ausführung.
EXEC SQL OPEN STUDCUR END-EXEC.
Close Erklärung veröffentlicht gesamten Speicher durch den Cursor besetzt. Es ist zwingend erforderlich, um einen Cursor bevor zur Beendigung eines Programms zu schließen.
EXEC SQL CLOSE STUDCUR END-EXEC.
Abruf-Anweisung gibt den Cursor und legt den Wert in der INTO-Klausel. Ein Fetch-Anweisung ist in einer Schleife kodiert, wie wir bekommen eine Zeile zu einem Zeitpunkt.
EXEC SQL FETCH STUDCUR INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS END-EXEC.
In der folgenden Beispiel zeigt die Verwendung des Cursors, um alle Datensätze aus der Tabelle STUDENT abholen:
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 oben COBOL-Programm zu ausführen:
//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 /*
Wenn Sie kompilieren und führen Sie das obige Programm, es produziert das folgende Ergebnis:
1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow