CURSORS

Transcrição

CURSORS
UNINGÁ – UNIDADE DE ENSINO SUPERIOR INGÁ
FACULDADE INGÁ
CIÊNCIA DA COMPUTAÇÃO
CURSORS
Profº Erinaldo Sanches Nascimento
Introdução
●
●
●
Cursor é usado para percorrer um conjunto de
linhas retornadas por uma consulta e processar
cada linha.
O MySQL
procedures.
suporta
cursor
em
stored
O cursor é uma instrução SELECT que será
acessada linha a linha através de um laço
While e alguns comandos específicos para
cursores.
●
●
●
O modelo relacional de banco de dados acessam
vários registros de uma só vez através dos
comandos SELECT, UPDATE e DELETE.
O número de registros retornados depende do
tamanho da tabela e da forma com que são
buscados em conjunto com a cláusula WHERE,
que realiza uma filtragem nos dados
selecionados.
Contudo, existem situações em que trazer os
registros de uma só vez não é conveniente ou
possível para realizar certos tipos de operações,
onde é necessário obter resultado de cada linha
uma a uma.
Sintaxe
DECLARE nomecursor CURSOR FOR SELECT ...;
/* Declarar e preencher o cursor com uma instrução SELECT * /
DECLARE CONTINUE HANDLER FOR NOT FOUND
/* Especificar o que fazer quando mais nenhum registros for
encontrado */
OPEN nomecursor;
/* Abrir cursor para uso */
FETCH nomecursos INTO variavel [, variavel];
/* Cria variáveis com os valores da coluna atuais */
CLOSE nomecursor;
/* Fechar cursor após o uso */
DELIMITER //
CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)
BEGIN
DECLARE a, b, c INT;
DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;
OPEN cur1;
SET b = 0;
SET c = 0;
WHILE b = 0 DO
FETCH cur1 INTO a;
IF b = 0 THEN
SET c = c + a;
END IF;
END WHILE;
CLOSE cur1;
SET param1 = c;
END //
Propriedades
●
Asensitive: Uma vez aberto, o cursor não reflete
alterações nas suas tabelas de origem.
–
●
●
O MySQL não garante o cursor será atualizado,
assim você não pode contar com ele.
Somente leitura:
atualizáveis.
Os
cursores
não
são
Não rolável: Os cursores podem ser percorridos
em apenas para frente, e você não pode ignorar
os registros de busca.
Prática
●
●
●
Para o exemplo será utilizado o modelo que contém
uma tabela de clientes, vendas, produtos e itens da
venda.
Neste modelo, a venda é gravada juntamente com os
seus itens, mas seu estoque não é baixado enquanto
a venda não é finalizada.
Será criado um procedimento armazenado chamado
finaliza_vendas, que alterará o campo situação da
venda (icSitVenda) de 0 (aberta) para 1 (finalizada) e
neste momento serão baixados todos os produtos do
estoque (tabela produtos, coluna qtProdEstoque) de
acordo com o que foi inserido na tabela itens (campo
qtItemVenda).
●
●
Para iniciar a utilização de um cursor é necessário
definir a instrução SELECT que ele acessará.
No nosso exemplo:
–
Buscar todos os itens da venda que deve ser finalizada
(variável @CodVen).
SELECT idProduto, qtItemVenda
FROM tbItensVenda
WHERE idVenda = @VenCod
●
●
É recomendável executar o SELECT no Query
Analyser para verificar se o resultado é o esperado.
Após isso, deve ser utilizado o comando
DECLAREpara declarar variáveis e o cursor.
A variável @VenCod será um parâmetro do
procedimento, logo não necessita declaração.
-- Declarando cursor
●
DECLARE CurItens --Nome do cursor
CURSOR FOR
-- Select utilizado para o cursor
SELECT
idProduto,
qtItemVenda
FROM
tbItensVenda WHERE idVenda = @VenCod
●
●
●
●
Realizada a declaração do cursor é necessário
realizar a abertura dele buscando o primeiro
registro.
Para isto serão declaradas variáveis que receberão
o código do produto e a quantidade vendida, através
do comando FETCH.
O comando FETCH NEXT traz a próxima linha do
SELECT.
O comando FETCH pode ser usado em conjunto
com outras cláusulas para outros comportamentos,
como:
–
FETCH PRIOR (Anterior),
–
FETCH FIRST (Primeiro),
–
FETCH LAST (Último), etc.
–- Declarando variáveis
DECLARE @ProdCod INTEGER, @IVQtd MONEY
–- Abrindo cursor
OPEN CurItens
–- Atribuindo
variáveis
valores
do
select
nas
FETCH NEXT FROM CurItens INTO @ProdCod,
@IVQtd
●
●
●
●
O comando anterior definiu os valores da primeira linha de
retorno, contudo o cursor é utilizado para acessar várias
linhas.
Para isso será utilizado um laço (WHILE) em conjunto com
a variável global do SQL Server @@FETCH_STATUS.
Esta variável retorna 0 (zero) caso o último comando de
FETCH tenha sido executado com sucesso e tenha
retornado dados e –1 caso não haja mais dados (EOF – fim
de arquivo).
Por fim utilizamos os comandos CLOSE , para fechar o
cursor e DEALLOCATE, para eliminá-lo da memória, pois
caso o procedimento seja executado novamente, pode
apresentar erro na declaração do cursor, caso o cursor
ainda exista.
-- Iniciando laço
WHILE @@FETCH_STATUS = 0
BEGIN
-- Próxima linha do cursor
FETCH NEXT FROM CurItens INTO
@ProdCod, @IVQtd
END
-- Fechando e desalocando cursor
CLOSE CurItens
DEALLOCATE CurItens
●
●
De posse do código do produto e da
quantidade em estoque podemos baixar o
estoque na tabela de produtos com o cuidado
de não deixarmos os estoque negativo.
–
Poderia ser feito através de uma restrição de
domínio (check) na tabela de estoque,
–
No exemplo utilizaremos uma verificação com um
SELECT na tabela de estoque.
Caso o estoque não fique negativo, o
comando para baixar o estoque é realizado,
caso contrário será levantado um erro com o
comando RAISERROR.
-- Iniciando laço
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT ProdQtdEst - @IVQtd FROM Produtos WHERE ProdCod =
@ProdCod) >= 0
UPDATE Produtos
SET ProdQtdEst = ProdQtdEst - @IVQtd
WHERE ProdCod = @ProdCod
ELSE
RAISERROR(‘Estoque insuficiente!’, 15, 1)
-- Próxima linha do cursor
FETCH NEXT FROM CurItens INTO @ProdCod, @IVQtd
END
-- Fechando e desalocando cursor
CLOSE CurItens
DEALLOCATE CurItens

Documentos relacionados

TECNOLOGIA DE BANCO DE DADOS Cursores

TECNOLOGIA DE BANCO DE DADOS Cursores retornar várias linhas ou colunas, especialmente em conjuntos de resultados muito grandes. Para ser feito, a função abre o cursor e retorna o nome do cursor para quem chamou (ou simplesmente abre o...

Leia mais