COBOL - Datenbankschnittstelle



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:

  • eingebettet SQL
  • DB2 Anwendungsprogrammierung
  • Gastgeber-Variablen
  • SQLCA
  • SQL-Abfragen
  • Cursoren

Eingebettet SQL

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..

DB2 Anwendungsprogrammierung

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.

Gastgeber-Variablen

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 (:).

Syntax

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

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.

Syntax

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.

SQL-Abfragen

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 '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 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 TutorialsPoint		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

Cursors

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:

  • Erklären
  • Öffnen
  • Schließen
  • Fetch

Erklären Cursor

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.

Öffnen

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.

Schließen

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.

Fetch

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
Advertisements