Sei sulla pagina 1di 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;)

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;

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
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:

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;

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.