COBOL - interfejs bazy danych

Na razie nauczyliśmy się obsługi plików w języku COBOL. Teraz omówimy, jak program w języku COBOL współdziała z DB2. Obejmuje następujące terminy -

  • Wbudowany SQL
  • Programowanie aplikacji DB2
  • Zmienne hosta
  • SQLCA
  • Zapytania SQL
  • Cursors

Wbudowany SQL

Wbudowane instrukcje SQL są używane w programach języka COBOL do wykonywania standardowych operacji SQL. Wbudowane instrukcje SQL są wstępnie przetwarzane przez procesor SQL przed skompilowaniem aplikacji. COBOL jest znany jakoHost Language. Aplikacje COBOL-DB2 to aplikacje, które obejmują zarówno język COBOL, jak i DB2.

Wbudowane instrukcje SQL działają jak zwykłe instrukcje SQL z niewielkimi zmianami. Na przykład wynik zapytania jest kierowany do wstępnie zdefiniowanego zestawu zmiennych, które są określane jakoHost Variables. Dodatkowa klauzula INTO jest umieszczona w instrukcji SELECT.

Programowanie aplikacji DB2

Poniżej przedstawiono zasady, których należy przestrzegać podczas kodowania programu w języku COBOL-DB2:

  • Wszystkie instrukcje SQL muszą być rozdzielone między EXEC SQL i ENDEXEC..

  • Instrukcje SQL muszą być zakodowane w Obszarze B.

  • Wszystkie tabele używane w programie muszą być zadeklarowane w sekcji WorkingStorage. Odbywa się to za pomocąINCLUDE komunikat.

  • Wszystkie instrukcje SQL inne niż INCLUDE i DECLARE TABLE muszą znajdować się w dziale procedury.

Zmienne hosta

Zmienne hosta służą do odbierania danych z tabeli lub wstawiania danych do tabeli. Zmienne hosta muszą być zadeklarowane dla wszystkich wartości, które mają być przekazywane między programem a bazą danych DB2. Są zadeklarowane w sekcji roboczej i magazynowej.

Zmienne hosta nie mogą być elementami grupowymi, ale mogą być grupowane razem w strukturze hosta. Nie mogąRenamed lub Redefined. Używając zmiennych języka macierzystego z instrukcjami SQL, poprzedz je przedrostkiemcolon (:)..

Składnia

Poniżej znajduje się składnia deklarowania zmiennych języka macierzystego i dołączania tabel do sekcji 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 to obszar komunikacji SQL, przez który DB2 przekazuje do programu informację zwrotną o wykonaniu SQL. Informuje program, czy wykonanie się powiodło, czy nie. Istnieje wiele predefiniowanych zmiennych, takich jak SQLCASQLCODEktóry zawiera kod błędu. Wartość „000” w SQLCODE oznacza pomyślne wykonanie.

Składnia

Poniżej znajduje się składnia deklarowania obszaru SQLCA w sekcji Working-Storage -

DATA DIVISION.
WORKING-STORAGE SECTION.
	EXEC SQL
	INCLUDE SQLCA
	END-EXEC.

Zapytania SQL

Załóżmy, że mamy jedną tabelę o nazwie „Student”, która zawiera identyfikator ucznia, nazwę ucznia i adres ucznia.

Tabela STUDENT zawiera następujące dane -

Student Id		Student Name		Student Address
1001 			   Mohtashim M.		Hyderabad
1002			   Nishant Malik		Delhi
1003 			   Amitabh Bachan		Mumbai
1004			   Chulbul Pandey		Lucknow

Poniższy przykład pokazuje użycie SELECT zapytanie w programie 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 aby wykonać powyższy program w języku COBOL -

//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
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

1004 Chulbul Pandey		Lucknow

Poniższy przykład pokazuje użycie INSERT zapytanie w programie 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 aby wykonać powyższy program w języku COBOL -

//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
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Inserted Successfully
1005 TutorialsPoint		Hyderabad

Poniższy przykład pokazuje użycie UPDATE zapytanie w programie 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 aby wykonać powyższy program w języku COBOL -

//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
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Updated Successfully

Następujące example pokazuje użycie DELETE zapytanie w programie 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 aby wykonać powyższy program w języku COBOL -

//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
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

Record Deleted Successfully

Kursory

Kursory służą do jednoczesnej obsługi wielu zaznaczeń wierszy. Są to struktury danych, które zawierają wszystkie wyniki zapytania. Można je zdefiniować w Sekcji Roboczej-Magazynowania lub Wydziale Procedur. Poniżej przedstawiono operacje związane z kursorem -

  • Declare
  • Open
  • Close
  • Fetch

Zadeklaruj kursor

Deklarację kursora można złożyć w Sekcji Roboczej-Magazynowej lub w Dziale Procedur. Pierwsza instrukcja to DECLARE, która jest instrukcją niewykonalną.

EXEC SQL
   DECLARE STUDCUR CURSOR FOR
   SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT
   WHERE STUDENT-ID >:WS-STUDENT-ID
END-EXEC.

otwarty

Przed użyciem kursora należy wykonać instrukcję Open. Instrukcja Open przygotowuje SELECT do wykonania.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Blisko

Instrukcja Close zwalnia całą pamięć zajmowaną przez kursor. Zamknięcie kursora jest obowiązkowe przed zakończeniem programu.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Sprowadzać

Instrukcja Fetch identyfikuje kursor i umieszcza wartość w klauzuli INTO. Instrukcja Fetch jest kodowana w pętli, ponieważ otrzymujemy po jednym wierszu na raz.

EXEC SQL
   FETCH STUDCUR
   INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS
END-EXEC.

Poniższy przykład pokazuje użycie kursora do pobrania wszystkich rekordów z tabeli 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 aby wykonać powyższy program w języku COBOL -

//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
/*

Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -

1001 Mohtashim M.		Hyderabad
1002 Nishant Malik		Delhi
1003 Amitabh Bachan		Mumbai
1004 Chulbul Pandey		Lucknow