COBOL - Datenbankschnittstelle
Ab sofort haben wir die Verwendung von Dateien in COBOL gelernt. Nun werden wir diskutieren, wie ein COBOL-Programm mit DB2 interagiert. Es beinhaltet die folgenden Begriffe -
- Embedded SQL
- DB2-Anwendungsprogrammierung
- Hostvariablen
- SQLCA
- SQL-Abfragen
- Cursors
Embedded SQL
Eingebettete SQL-Anweisungen werden in COBOL-Programmen verwendet, um Standard-SQL-Operationen auszuführen. Eingebettete SQL-Anweisungen werden vom SQL-Prozessor vorverarbeitet, bevor das Anwendungsprogramm kompiliert wird. COBOL ist bekannt alsHost Language. COBOL-DB2-Anwendungen sind solche Anwendungen, die sowohl COBOL als auch DB2 enthalten.
Eingebettete SQL-Anweisungen funktionieren mit einigen geringfügigen Änderungen wie normale SQL-Anweisungen. Beispielsweise wird die Ausgabe einer Abfrage an einen vordefinierten Satz von Variablen gerichtet, auf die verwiesen wirdHost Variables. Eine zusätzliche INTO-Klausel wird in die SELECT-Anweisung eingefügt.
DB2-Anwendungsprogrammierung
Die folgenden Regeln müssen beim Codieren eines COBOL-DB2-Programms beachtet werden:
Alle SQL-Anweisungen müssen zwischen begrenzt werden EXEC SQL und ENDEXEC..
SQL-Anweisungen müssen in Bereich B codiert werden.
Alle Tabellen, die in einem Programm verwendet werden, müssen im Abschnitt WorkingStorage deklariert werden. Dies geschieht mit demINCLUDE Erklärung.
Alle SQL-Anweisungen außer INCLUDE und DECLARE TABLE müssen in der Prozedurabteilung erscheinen.
Hostvariablen
Hostvariablen werden zum Empfangen von Daten aus einer Tabelle oder zum Einfügen von Daten in eine Tabelle verwendet. Hostvariablen müssen für alle Werte deklariert werden, die zwischen dem Programm und dem DB2 übergeben werden sollen. Sie sind im Abschnitt Arbeitsspeicher deklariert.
Hostvariablen können keine Gruppenelemente sein, sie können jedoch in der Hoststruktur zusammengefasst werden. Sie können nicht seinRenamed oder Redefined. Stellen Sie Hostvariablen mit SQL-Anweisungen ein a vorancolon (:)..
Syntax
Im Folgenden finden Sie die Syntax zum Deklarieren von Hostvariablen und zum Einfügen von Tabellen in den Abschnitt Arbeitsspeicher.
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 ist ein SQL-Kommunikationsbereich, über den DB2 die Rückmeldung der SQL-Ausführung an das Programm weiterleitet. Es teilt dem Programm mit, ob eine Ausführung erfolgreich war oder nicht. Es gibt eine Reihe von vordefinierten Variablen unter SQLCA wieSQLCODEwelches den Fehlercode enthält. Der Wert '000' in SQLCODE gibt eine erfolgreiche Ausführung an.
Syntax
Im Folgenden finden Sie die Syntax zum Deklarieren einer SQLCA im Abschnitt "Arbeitsspeicher".
DATA DIVISION.
WORKING-STORAGE SECTION.
EXEC SQL
INCLUDE SQLCA
END-EXEC.
SQL-Abfragen
Nehmen wir an, wir haben eine Tabelle mit dem Namen 'Student', die die Studenten-ID, den Studenten-Namen und die Studenten-Adresse enthält.
Die 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
Das folgende 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 um das obige COBOL-Programm auszufü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 das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:
1004 Chulbul Pandey Lucknow
Das folgende 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 '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 um das obige COBOL-Programm auszufü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 das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:
Record Inserted Successfully
1005 TutorialsPoint Hyderabad
Das folgende 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 um das obige COBOL-Programm auszufü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 das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:
Record Updated Successfully
Folgende example 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 um das obige COBOL-Programm auszufü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 das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:
Record Deleted Successfully
Cursor
Cursor werden verwendet, um mehrere Zeilen gleichzeitig zu verarbeiten. Dies sind Datenstrukturen, die alle Ergebnisse einer Abfrage enthalten. Sie können im Abschnitt Arbeitsspeicher oder in der Verfahrensabteilung definiert werden. Im Folgenden sind die mit Cursor verbundenen Vorgänge aufgeführt:
- Declare
- Open
- Close
- Fetch
Cursor deklarieren
Die Cursordeklaration kann im Bereich Arbeitsspeicher oder in der Verfahrensabteilung erfolgen. Die erste Anweisung ist die DECLARE-Anweisung, die keine 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.
Öffnen
Vor der Verwendung eines Cursors muss die Open-Anweisung ausgeführt werden. Die Open-Anweisung bereitet SELECT für die Ausführung vor.
EXEC SQL
OPEN STUDCUR
END-EXEC.
Schließen
Die Anweisung close gibt den gesamten vom Cursor belegten Speicher frei. Vor dem Beenden eines Programms muss unbedingt ein Cursor geschlossen werden.
EXEC SQL
CLOSE STUDCUR
END-EXEC.
Holen
Die Fetch-Anweisung identifiziert den Cursor und fügt den Wert in die INTO-Klausel ein. Eine Fetch-Anweisung wird in einer Schleife codiert, wenn jeweils eine Zeile angezeigt wird.
EXEC SQL
FETCH STUDCUR
INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.
Das folgende Beispiel zeigt die Verwendung des Cursors zum Abrufen aller Datensätze aus der STUDENT-Tabelle.
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 um das obige COBOL-Programm auszufü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 das obige Programm kompilieren und ausführen, wird das folgende Ergebnis erzielt:
1001 Mohtashim M. Hyderabad
1002 Nishant Malik Delhi
1003 Amitabh Bachan Mumbai
1004 Chulbul Pandey Lucknow