COBOL - Interface de Banco de Dados

A partir de agora, aprendemos a usar arquivos em COBOL. Agora, discutiremos como um programa COBOL interage com o DB2. Envolve os seguintes termos -

  • SQL embutido
  • Programação de aplicativo DB2
  • Variáveis ​​hospedeiras
  • SQLCA
  • Consultas SQL
  • Cursors

SQL embutido

As instruções SQL incorporadas são usadas em programas COBOL para executar operações SQL padrão. As instruções SQL incorporadas são pré-processadas pelo processador SQL antes que o programa de aplicação seja compilado. COBOL é conhecido como oHost Language. Aplicativos COBOL-DB2 são aqueles aplicativos que incluem COBOL e DB2.

As instruções SQL incorporadas funcionam como instruções SQL normais, com algumas pequenas alterações. Por exemplo, a saída de uma consulta é direcionada a um conjunto predefinido de variáveis ​​que são referidas comoHost Variables. Uma cláusula INTO adicional é colocada na instrução SELECT.

Programação de aplicativo DB2

A seguir estão as regras a serem seguidas durante a codificação de um programa COBOL-DB2 -

  • Todas as instruções SQL devem ser delimitadas entre EXEC SQL e ENDEXEC..

  • As instruções SQL devem ser codificadas na Área B.

  • Todas as tabelas que são usadas em um programa devem ser declaradas na Seção WorkingStorage. Isso é feito usando oINCLUDE declaração.

  • Todas as instruções SQL diferentes de INCLUDE e DECLARE TABLE devem aparecer na Divisão de Procedimento.

Variáveis ​​hospedeiras

Variáveis ​​de host são usadas para receber dados de uma tabela ou inserir dados em uma tabela. As variáveis ​​do host devem ser declaradas para todos os valores que devem ser transmitidos entre o programa e o DB2. Eles são declarados na Seção de Trabalho-Armazenamento.

As variáveis ​​do host não podem ser itens de grupo, mas podem ser agrupadas na estrutura do host. Eles não podem serRenamed ou Redefined. Usando variáveis ​​de host com instruções SQL, prefixe-as com umcolon (:)..

Sintaxe

A seguir está a sintaxe para declarar variáveis ​​de host e incluir tabelas na seção 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 é uma área de comunicação SQL por meio da qual o DB2 passa o feedback da execução de SQL para o programa. Diz ao programa se uma execução foi bem-sucedida ou não. Existem várias variáveis ​​predefinidas no SQLCA, comoSQLCODEque contém o código de erro. O valor '000' em SQLCODE indica uma execução bem-sucedida.

Sintaxe

A seguir está a sintaxe para declarar um SQLCA na seção Working-Storage -

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

Consultas SQL

Vamos supor que temos uma tabela chamada 'Aluno' que contém a Id do Aluno, o Nome do Aluno e o Endereço do Aluno.

A tabela STUDENT contém os seguintes dados -

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

O exemplo a seguir mostra o uso de SELECT consulta em um programa 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 para executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

1004 Chulbul Pandey		Lucknow

O exemplo a seguir mostra o uso de INSERT consulta em um programa 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 para executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Inserted Successfully
1005 TutorialsPoint		Hyderabad

O exemplo a seguir mostra o uso de UPDATE consulta em um programa 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 para executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Updated Successfully

Os seguintes example mostra o uso de DELETE consulta em um programa 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 para executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

Record Deleted Successfully

Cursores

Os cursores são usados ​​para lidar com várias seleções de linha ao mesmo tempo. Eles são estruturas de dados que contêm todos os resultados de uma consulta. Eles podem ser definidos na Seção de Trabalho-Armazenamento ou na Divisão de Procedimento. A seguir estão as operações associadas ao Cursor -

  • Declare
  • Open
  • Close
  • Fetch

Declare Cursor

A declaração do cursor pode ser feita na Seção de Trabalho-Armazenamento ou na Divisão de Procedimento. A primeira instrução é a instrução DECLARE, que é uma instrução não executável.

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

Abrir

Antes de usar um cursor, a instrução Open deve ser executada. A instrução Open prepara o SELECT para execução.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Fechar

A instrução Close libera toda a memória ocupada pelo cursor. É obrigatório fechar um cursor antes de encerrar um programa.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Buscar

A instrução Fetch identifica o cursor e coloca o valor na cláusula INTO. Uma instrução Fetch é codificada em loop conforme obtemos uma linha por vez.

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

O exemplo a seguir mostra o uso do cursor para buscar todos os registros da tabela 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 para executar o programa COBOL acima -

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

Quando você compila e executa o programa acima, ele produz o seguinte resultado -

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