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