sábado, 20 de agosto de 2016

Declaração de Cursor

Olá!

Ao desenvolver um programa que consulte a base de dados (DB), e tenha mais de um registro como resultado da instrução Select, é necessário realizar a declaração de um Cursor para utilizar o SQL que realiza a seleção dos dados no DB.

A sintaxe da declaração de um cursor, é:

Sintaxe declaração cursor site IBM
Sintaxe declaração cursor - Site IBM
Os comandos que estão sublinhados em vermelho são de uso obrigatório, os demais são opcionais. Logo, os comandos básicos para declarar um cursor, são:

DECLARE CURSOR-NAME CURSOR FOR
SELECT-STATEMENT

Onde:
CURSOR-NAME: é o nome do cursor. Boa prática é nomear o Cursor com objetivo da consulta.
SELECT-STATEMENT: instrução Select.

Exemplo básico de um Cursor:
DECLARE LISTAR-NOMES CURSOR FOR
SELECT NOME
  FROM PESSOA
 WHERE CD_PESSOA > 0

Para esse exemplo de Cursor a leitura seria realizada com o comando Fetch da seguinte forma:
FETCH LISTAR-NOMES
INTO :GDA-NOME


  • INSENSITIVE SCROLL

Quando ocorre a necessidade de controlar a leitura dos registros retornados da instrução Select do Cursor, utilizamos o comando opcional INSENSITIVE SCROLL na declaração do Cursor, conforme:

DECLARE LISTAR-NOMES INSENSITIVE SCROLL CURSOR FOR
SELECT NOME
  FROM PESSOA
 WHERE CD_PESSOA > 0

De modo que para realizar a leitura dos registros deste Cursor, o comando Fetch deve possuir os seguintes comandos adicionais:

FETCH INSENSITIVE ABSOLUTE POSITION-READ CURSOR-NAME

Sendo que POSITION-READ é um valor numérico que indica a posição do registro que será lido pelo comando Fetch. Exemplo:

Tabela:
PESSOA
RegistroCD_PESSOANOMESOBRENOMEIDADE
1123FelipeBarbosa23
2212AnaVieira20
3354JoãoSantos19
4674AlineSilva21
5995MairaDantas25

Então, abaixo temos os passos principais em código COBOL para realizar a leitura dos registros da tabela acima:
* -- Variavel para armazenar a posição de leitura do cursor
77 POSICAO-REGISTRO                             PIC S9(009) COMP VALUE +0.

* -- Adiciona um para a posicao de leitura de registro
ADD 1 TO POSICAO-REGISTRO.

* -- Realiza a leitura do cursor na posição informada em posicao-registro
FETCH INSENSITIVE ABSOLUTE :POSICAO-REGISTRO LISTAR-NOMES
INTO :GDA-NOME

Então, se colocarmos as duas instruções de código acima (adição e leitura) em um loop que tenha a condição de executar enquanto POSICAO-REGISTRO < 5, o resultado seria:

Valor de POSICAO-REGISTROResultado (GDA-NOME)
1Felipe
2Ana
3João
4Aline


Caso o valor inicial de POSICAO-REGISTRO seja 3, a resposta apresentada seria:

Valor de POSICAO-REGISTROResultado (GDA-NOME)
1João
2Aline

Então, com a utilização do Insensitive Scroll na declaração do Cursor podemos realizar a paginação dos registros que são retornados da instrução SQL do Cursor. Pois, podemos construir uma lógica para controlar a quantidade de registros lidos do Cursor, e começar a ler novamente a partir da última posição lida.

Para maiores informações dos comandos contidos na declaração de um Cursor veja no site da IBM clique aqui.

Consultar a relação de Termos e Abreviaturas acesse aqui.
FELIPE BARBOSA FERREIRA

Até o próximo post!

Nenhum comentário:

Postar um comentário