На данный момент мы изучили использование файлов в COBOL. Теперь мы обсудим, как программа на COBOL взаимодействует с DB2. Это включает в себя следующие термины —
- Встроенный SQL
- Прикладное программирование DB2
- Переменные хоста
- SQLCA
- SQL-запросы
- курсоры
Встроенный SQL
Встроенные операторы SQL используются в программах на языке COBOL для выполнения стандартных операций SQL. Встроенные операторы SQL предварительно обрабатываются процессором SQL перед компиляцией прикладной программы. COBOL известен как язык хоста . Приложения COBOL-DB2 — это те приложения, которые включают COBOL и DB2.
Встроенные операторы SQL работают как обычные операторы SQL с некоторыми незначительными изменениями. Например, выходные данные запроса направлены на предварительно определенный набор переменных, которые называются переменными хоста . Дополнительное предложение INTO помещается в оператор SELECT.
Прикладное программирование DB2
Ниже приведены правила, которым необходимо следовать при кодировании программы на языке COBOL-DB2.
-
Все операторы SQL должны быть разграничены между EXEC SQL и ENDEXEC. ,
-
Операторы SQL должны быть закодированы в области B.
-
Все таблицы, используемые в программе, должны быть объявлены в разделе WorkingStorage. Это делается с помощью оператора INCLUDE .
-
Все операторы SQL, кроме INCLUDE и DECLARE TABLE, должны отображаться в разделе «Процедура».
Все операторы SQL должны быть разграничены между EXEC SQL и ENDEXEC. ,
Операторы SQL должны быть закодированы в области B.
Все таблицы, используемые в программе, должны быть объявлены в разделе WorkingStorage. Это делается с помощью оператора INCLUDE .
Все операторы SQL, кроме INCLUDE и DECLARE TABLE, должны отображаться в разделе «Процедура».
Переменные хоста
Переменные хоста используются для получения данных из таблицы или вставки данных в таблицу. Переменные хоста должны быть объявлены для всех значений, которые должны передаваться между программой и DB2. Они объявлены в разделе «Рабочее-складское помещение».
Переменные хоста не могут быть элементами группы, но они могут быть сгруппированы вместе в структуре хоста. Они не могут быть переименованы или переопределены . Используя переменные хоста с инструкциями SQL, добавьте их к двоеточию (:). ,
Синтаксис
Ниже приводится синтаксис объявления переменных хоста и включения таблиц в раздел «Рабочее хранилище».
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 — это область связи SQL, через которую DB2 передает программе информацию об исполнении SQL. Он сообщает программе, было ли выполнение успешным или нет. В SQLCA есть несколько предопределенных переменных, таких как SQLCODE, который содержит код ошибки. Значение ‘000’ в SQLCODE указывает на успешное выполнение.
Синтаксис
Ниже приведен синтаксис объявления SQLCA в разделе «Рабочее хранилище»:
DATA DIVISION. WORKING-STORAGE SECTION. EXEC SQL INCLUDE SQLCA END-EXEC.
SQL-запросы
Давайте предположим, что у нас есть одна таблица с именем «Student», которая содержит «Student-Id», «Student-Name» и «Student-Address».
Таблица STUDENT содержит следующие данные —
Student Id Student Name Student Address 1001 Mohtashim M. Hyderabad 1002 Nishant Malik Delhi 1003 Amitabh Bachan Mumbai 1004 Chulbul Pandey Lucknow
В следующем примере показано использование запроса SELECT в программе на языке 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 для выполнения вышеуказанной программы 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 /*
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
1004 Chulbul Pandey Lucknow
В следующем примере показано использование запроса INSERT в программе на языке 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 для выполнения вышеуказанной программы 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 /*
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Record Inserted Successfully 1005 TutorialsPoint Hyderabad
В следующем примере показано использование запроса UPDATE в программе на языке 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 для выполнения вышеуказанной программы 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 /*
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Record Updated Successfully
В следующем примере показано использование запроса DELETE в программе на языке 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 для выполнения вышеуказанной программы 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 /*
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —
Record Deleted Successfully
курсоры
Курсоры используются для одновременного выбора нескольких строк. Это структуры данных, которые содержат все результаты запроса. Они могут быть определены в разделе «Рабочее-складское помещение» или «Отдел процедур». Ниже приведены операции, связанные с курсором —
- декларировать
- открыто
- близко
- получать
Объявить курсор
Объявление курсора может быть сделано в Секции рабочего хранения или в Отделе процедур. Первый оператор — это оператор DECLARE, который является неисполнимым оператором.
EXEC SQL DECLARE STUDCUR CURSOR FOR SELECT STUDENT-ID, STUDENT-NAME, STUDENT-ADDRESS FROM STUDENT WHERE STUDENT-ID >:WS-STUDENT-ID END-EXEC.
открыто
Перед использованием курсора необходимо выполнить оператор Open. Оператор Open подготавливает SELECT к выполнению.
EXEC SQL OPEN STUDCUR END-EXEC.
близко
Оператор Close освобождает всю память, занятую курсором. Перед завершением программы обязательно закрывать курсор.
EXEC SQL CLOSE STUDCUR END-EXEC.
получать
Оператор Fetch идентифицирует курсор и помещает значение в предложение INTO. Оператор Fetch закодирован в цикле, поскольку мы получаем по одной строке за раз.
EXEC SQL FETCH STUDCUR INTO :WS-STUDENT-ID, :WS-STUDENT-NAME, WS-STUDENT-ADDRESS END-EXEC.
В следующем примере показано использование курсора для извлечения всех записей из таблицы 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 для выполнения вышеуказанной программы 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 /*
Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —