Você está na página 1de 5

AULA 07 – CURSORES ( RODAR script1.

sql)
Cursores são áreas compostas de linhas e colunas em memória que servem para armazenar o resultado de
uma seleção que retorna 0 (zero) ou mais linhas.
No PL/SQL os cursores podem ser de dois tipos:
• Explícitos
• Implícitos

Cursores Implícitos
Definidos pelo próprio PL/SQL.
“SQL” é o identificador de “cursor implícito”. Todo comando DML, automaticamente (implicitamente) abre um
cursor interno no SGBD sempre identificado como “SQL”.
É útil para testar o que aconteceu com o último comando DML executado, através das "propriedades" do
cursor, chamadas de “atributos do cursor”. Todos eles têm seu nome começando com o símbolo “%” e são
referenciados colocando-se o nome do cursor antes do “%”. Pode ser usado com algumas propriedades
(FOUND, NOTFOUND, ROWCOUNT).
Exemplo 1:
BEGIN
Update aluno set media=(nota1+nota2)/2;
IF SQL%FOUND then
dbms_output.put_line('Alteração efetuada com sucesso. ' || SQL%ROWCOUNT || ' linhas
alteradas');
ELSE
dbms_output.put_line('Nenhum aluno encontrado');
END IF;
END;

Exemplo 2:
BEGIN
Update aluno set media=(nota1+nota2)/2 where (nota1+nota2)/2 >= 6;
IF SQL%FOUND then
dbms_output.put_line('Alteração efetuada com sucesso');
ELSE
dbms_output.put_line('Nenhum aluno encontrado');
END IF;
END;

Visualizar media na tabela aluno (select nome, media from aluno;)


Apagar dados do campo media (update aluno set media=null;)

1/5
Exemplo 3:
BEGIN
Update aluno set media=(nota1+nota2)/2 where (nota1+nota2)/2 = 10;
IF SQL%FOUND then
dbms_output.put_line('Alteração efetuada com sucesso');
ELSE
dbms_output.put_line('Nenhum aluno encontrado');
END IF;
END;
Visualizar media na tabela aluno (select nome, media from aluno;)

Mostra quantidade de alunos alterados.

BEGIN
Update aluno set media=(nota1+nota2)/2 where (nota1+nota2)/2 >= 6;
dbms_output.put_line(SQL%ROWCOUNT);
END;

2/5
Cursores Explícitos

São utilizados para execução de consultas que possam retornar nenhuma ou mais de uma linha.
Neste caso o cursor deve ser explicitamente declarado na área DECLARE.
Para nomear o resultado do cursor é necessário que ele e suas colunas possuam nomes (alias). Para isso
algumas regras devem ser observadas:
• O nome do cursor não pode ser igual ao da tabela.
• Para dar um nome a uma coluna da seleção, basta colocar o nome do alias logo após a definição da coluna
ou expressão.
Dentro de um cursor, o comando SELECT não utiliza a cláusula INTO.
Ao fazermos a declaração, apenas foi definida uma estrutura que será utilizada posteriormente, quando o
SELECT for executado e a recuperação das linhas for realizada.
A primeira instrução realmente executável relativa ao cursor é a sua abertura, feita na área de instruções
através do comando OPEN.
É no momento da abertura que o SELECT é executado e as linhas recuperadas tornam-se disponíveis para uso.
Para sua utilização são necessários alguns passos básicos:
declarar o cursor;
declarar as variáveis que receberão os dados;
abrir (uma espécie de preparação) o cursor na área de instruções;
ler os dados produzidos pelo cursor;
fechar (desalocar a memória) do cursor.
OPEN Abre o cursor
FETCH Disponibiliza a linha corrente e posiciona na próxima linha do cursor. As linhas
armazenadas no cursor somente poderão ser processadas quando o seu conteúdo
for transferido para variáveis que possam ser manipuladas no PL/SQL.
CLOSE Fecha o cursor.

Para cada cursor, quatro atributos podem ser verificados, e seus valores podem ser alterados a cada execução
de um comando FETCH. Esses atributos são:

3/5
nome_cursor%FOUND retorna TRUE caso FETCH consiga retornar alguma linha e FALSE caso
contrário. Se nenhum FETCH tiver sido executado, será retornado NULL.
nome_cursor%NOTFOUND retorna FALSE caso FETCH consiga retornar alguma linha e TRUE caso
contrário. Se nenhum FETCH tiver sido executado, será retornado NULL
nome_cursor%ROWCOUNT retorna o número de linhas já processadas pelo cursor. Se nenhum FETCH
tiver sido executado, será retornado 0 (zero).
nome_cursor%ISOPEN retorna TRUE caso o cursor esteja aberto e FALSE caso contrário.

O comando FETCH recupera a próxima linha de um cursor e pode ser utilizado com variáveis ou registro
FETCH nome_cursor INTO var1, var2, ...;
Ou
FETCH nome_cursor INTO reg_declarado;
onde:
var1, var2 – são as variáveis que vão receber os valores recuperados pelo cursor. Estas variáveis devem ser
previamente declaradas e devem concordar em número e tipo com as expressões do comando SELECT do
cursor.
Exemplo 1: Utilizando cursor com variáveis
DECLARE
CURSOR C_ALUNO IS
SELECT NOTA1, NOTA2, CPF FROM ALUNO;
V_N1 NUMBER(4,2);
V_N2 NUMBER(4,2);
V_CPF NUMBER(11);
V_M NUMBER(4,2);
BEGIN
OPEN C_ALUNO;
LOOP
FETCH C_ALUNO INTO V_N1, V_N2, V_CPF;
EXIT WHEN C_ALUNO%NOTFOUND;
V_M := (V_N1+V_N2)/2;
UPDATE ALUNO SET MEDIA = V_M WHERE CPF=V_CPF;
END LOOP;
CLOSE C_ALUNO;
END;

4/5
Exercícios
1 – Considere a seguinte tabela e dados que foram criados via script1.sql
Codigo Nome Estrelas
1 Leonardo Mantovani 5
2 Monica Silva 5
3 Fabio Henrique 2
4 Simeia Santos 3
5 Anderson Molgora 4
Ao executar o código abaixo, o que teremos como saida?
DECLARE
CURSOR c_cliente IS SELECT nome FROM cliente where estrelas>= 4 order by nome;
v_nomecli VARCHAR2(20);
BEGIN
OPEN c_cliente;
LOOP
FETCH c_cliente INTO v_nomecli;
EXIT when c_cliente%notfound;
DBMS_OUTPUT.PUT_LINE('Cliente: '||v_nomecli);
END LOOP;
CLOSE c_cliente;
END;

2 – Dada a tabela CLIENTE1 que foi criada pelo script1.sql, utilizar PL/SQL com um cursor implícito para
conceder desconto de 10% para código informado pelo cliente (CODIGO).
OBS: se alteração efetuada apresentar a mensagem “Alteração efetuada com sucesso”, caso contrário
apresentar a mensagem “Nenhuma atualização efetuada”.

3 - Criar um bloco PL/SQL para atualizar os preços conforme segue (utilizar tabela produto – criada por
script1.sql):
• Produtos com CODIGO inferior a 2000: Acrescentar 10% ao VALOR atual.
• Produtos com CODIGO igual ou superior a 2000: Acrescentar 20% ao VALOR atual.
Nota: usar cursor explícito.

4 – Dado a tabela aluno (criada por script1.sql), calcular média do aluno e atualizar tabela do aluno com
média. Para calculo da média, considerar as 2 maiores notas entre nota1, nota2 e nota3. Somar as 2 maiores
notas e dividir por 2.
Nota: usar cursor explícito.

5/5

Você também pode gostar