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