Учебники

COBOL — интерфейс базы данных

На данный момент мы изучили использование файлов в 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
/*

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —