COBOL - Interface da Base de Dados


Advertisements

A partir de agora, nós aprendemos a utilização de arquivos em COBOL. Agora, vamos discutir como um programa em COBOL interage com DB2. Ela envolve os seguintes termos:

  • Embedded SQL
  • Programação de Aplicativos DB2,
  • Variáveis Host
  • SQLCA
  • Consultas SQL
  • Cursores

Embedded SQL

Embedded instruções SQL são usados em COBOL programas para executar operações SQL padrão. Embedded instruções SQL são pré-processadas pelo SQL processador antes que o programa de aplicação é compilada. COBOL é conhecido como língua do país de acolhimento. EM COBOL e DB2, os aplicativos são os aplicativos que incluem tanto EM COBOL e DB2.

Embedded SQL declarações funcionam como comandos SQL normal com algumas pequenas alterações. Por exemplo, se a saída de uma consulta é direcionado a um conjunto pré-definido de variáveis que são referidos como variáveis. Mais uma cláusula dentro é colocado na instrução SELECT.

Programação de Aplicativos DB2,

São regras que devem ser seguidas durante a codificação de linguagem COBOL e DB2, programa:

  • Todas as declarações SQL deve ser delimitada entre EXEC SQL e TERMO-EXEC.

  • Declarações SQL deve ser codificado na área B.

  • Todas as tabelas que são usadas em um programa devem ser declaradas na Working-Storage Seção. Isso é feito usando-se a instrução INCLUDE.

  • Todos os comandos SQL que não INCLUEM e DECLARAR TABELA devem constar no processo Divisão.

Variáveis Host

Hospedar as variáveis são utilizadas para receber dados de uma tabela ou inserindo dados em uma tabela. Host variáveis devem ser declaradas para todos os valores que estão a ser transmitidas entre o programa e a DB2. Elas são declaradas na Working-Storage Seção.

As variáveis podem ser Host itens do grupo, mas podem ser agrupados em estrutura de acolhimento. Eles não podem ser renomeados ou redefinido. Usando variáveis host com instruções SQL, prefixo-los com dois pontos (:).

Sintaxe

Seguir é a sintaxe para declarar variáveis host e incluem tabelas na Working-Storage seção:

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 é um SQL área de comunicação através da qual DB2 passa o feedback do SQL a execução do programa. Diz o programa se a execução foi bem sucedido ou não. Há um número de variáveis predefinidas no SQLCA como SQLCODE que contém o código de erro. O valor '000' no SQLCODE membros uma execução bem sucedida.

Sintaxe

Seguir é a sintaxe para declarar um SQLCA na Working-Storage seção:

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

Consultas SQL

Vamos assumir que temos uma tabela nomeada como "Estudante", que contém Student-Id , Student-Name , e Student-Address .

O aluno tabela 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 da consulta em um programa em 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 em 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
/*

Quando você compilar e executar o programa acima referido, que produz o seguinte resultado:

1004 Chulbul Pandey		Lucknow

O exemplo a seguir mostra o uso do elemento query em um programa em 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 'Howcodex' 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 em 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
/*

Quando você compilar e executar o programa acima referido, que produz o seguinte resultado:

Record Inserted Successfully
1005 Howcodex		Hyderabad

O exemplo a seguir mostra o uso da atualização consulta em um programa em 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 em 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
/*

Quando você compilar e executar o programa acima referido, que produz o seguinte resultado:

Record Updated Successfully

O exemplo a seguir mostra o uso de excluir a consulta em um programa em 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 em 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
/*

Quando você compilar e executar o programa acima referido, que produz o seguinte resultado:

Record Deleted Successfully

Cursores

Os cursores são usados para lidar com seleções múltiplas linhas de uma vez. Eles são estruturas de dados que armazenam todos os resultados de uma consulta. Eles podem ser definidos na Working-Storage secção ou o processo Divisão. Seguem-se as operações associadas com o Cursor.

  • Declarar
  • Abra
  • Fechar
  • Buscar

Declarar o Cursor

Cursor declaração pode ser feita na Working-Storage secção ou o processo Divisão. A primeira afirmação é a DECLARAR, que é um 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.

Abra

Antes de utilizar um cursor, declaração aberta deve ser realizada. A declaração aberta prepara o SELECIONE para execução.

EXEC SQL
   OPEN STUDCUR
END-EXEC.

Fechar

Close declaração libera toda a memória ocupada pelo cursor. É obrigatório para fechar o cursor antes de terminar um programa.

EXEC SQL
   CLOSE STUDCUR
END-EXEC.

Buscar

Buscar declaração identifica o cursor e coloca o valor da cláusula Into. Um comando de busca está codificada em loop, como temos uma linha de cada vez.

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

O exemplo a seguir mostra o uso de cursor para buscar todos os registros da tabela ALUNO:

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

Quando você compilar e executar o programa acima referido, que produz o seguinte resultado:

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