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