Você está na página 1de 14

Programando com cursores PL/SQL

Page 1 of 14

Enviar Consulta

Tecnologias

Revistas

Cursos

Bem vindo a DevMedia!

post favorito

Pocket videos

DevWare

LOGIN:

Frum

Servios

Publicar

Esqueci minha senha

SENHA:

comentrios

re

Programando com cursores


PL/SQL

nR

eg

is

te

Os livros disponveis no mercado voltados para programao


Oracle, inclusive a documententao oficial, so abrangentes e
neles contm uma grande quantidade de informaes, que num
primeiro momento podem dificultar o aprendizado da
linguagem PL/SQL. Neste artigo, sem dvida, temos apenas o
essencial para a iniciao a programao de cursores PL/SQL,
para que esta experincia seja rpida e direta.

Curtir

Gostei (1)

(0)

Cursores

Em alguns casos necessitamos de espaos de armazenamento mais complexos que as variveis,


como uma matriz de informao resultada de uma consulta SQL, neste case se faz necessrio o
uso de cursores.
Os cursores em PL/SQL podem ser explcitos e implcitos. O PL/SQL declara um cursor
implicitamente para toda instruo DML (UPDATE, INSERT, DELETE, SELECT...INTO), incluindo

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 2 of 14

consultas que retornam apenas uma linha. As consultas que retornam mais de uma linha devero
ser declaradas explicitamente.
Cursores explcitos so indicados quando necessrio um controle no processamento do mesmo.

Declarando um Cursor (DECLARE)


Quando declaramos um cursor associado a ele um nome e a consulta SQL que ser processada
por este cursor. Assim como as variveis, os cursores devem ser declarados na seo DECLARE.
O escopo de validade dos cursores o mesmo de uma varivel. Cursores declarados em um bloco

is

te

re

declarados no sub-bloco no so acessveis pelo bloco externo.

externo so acessveis apenas neste bloco e em qualquer sub-bloco contido neste, porm cursores

eg

CURSOR nome_cursor

,parametro2 tipo

,...,

nR

[(parametro1 tipo

,parametroN tipo)]
IS Instruo_SQL;

Figura 1 Declarando um cursor

Os cursores podem ser definidos com parmetros e para cada parmetro devem ser escolhidos um
nome e um tipo de dado.

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 3 of 14

Mais p
Abrindo um Cursor (OPEN)

O comando OPEN abre o cursor, executa a consulta associada a ele e gera o conjunto ativo,
que consiste de todas as linhas que atendem os critrios de pesquisa da consulta associada ao
cursor. Para gerenciar o conjunto ativo existe um ponteiro que registra qual linha est passvel do

comando FETCH. Aps o OPEN o FETCH atuar sobre a primeira linha do conjunto ativo.

te

re

OPEN nome_cursor[(var1,var2,...)];

eg

is

Figura 2 Abrindo um cursor

nR

Extraindo dados do Cursor (FETCH)

Extair os dados do cursor o evento onde os dados da linha atual do conjunto ativo so

copiados para variveis ou registros e a cada FETCH realizado, o ponteiro passar a apontar para
a linha seguinte do conjunto ativo.

FETCH nome_cursor INTO [var1,var2,...|record_name];

Figura 3 Fetch Cursor

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 4 of 14

Diretrizes

Inclua o mesmo nmero de variveis na clusula INTO da instruo FETCH do que as

colunas na instruo SELECT e certifique-se que os tipos de dados so compatveis

Faa a correspondncia de cada varivel para coincidir com as posies das colunas

Registros podem ser utilizados. O tipo %ROWTYPE pode ser associado ao cursor ou

diretamente a uma tabela. Os campos do cursor devem ser idnticos aos campos do registro usado

em quantidade e tipo

re

Fechando do Cursor (CLOSE)

te

O comando CLOSE desativa o cursor e libera o conjunto ativo. Esta etapa permite que o cursor

nR

CLOSE nome_cursor;

eg

is

seja reaberto, se necessrio, para gerar um outro conjunto ativo.

Figura 4 Fechando um cursor

1 DECLARE
2

V_empno NUMBER;

V_ename VARCHAR2(100);

CURSOR cEmplyee IS

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

5
6

SELECT employee_id,first_name
FROM EMPLOYEES;

rEmployee cEmplyee%ROWTYPE;

CURSOR cEmplyeeJob

12
13

SELECT first_name

11

IS

FROM EMPLOYEES

re

10

(p_job varchar)

WHERE Job_id = p_job;

te

Page 5 of 14

is

14 BEGIN
OPEN cEmplyee;

16

FETCH cEmplyee INTO V_empno, V_ename;

17

DBMS_OUTPUT.PUT_LINE(V_ename);

18

FETCH cEmplyee INTO V_empno, V_ename;

19

DBMS_OUTPUT.PUT_LINE(V_ename);

20

FETCH cEmplyee INTO V_empno, V_ename;

21

DBMS_OUTPUT.PUT_LINE(V_ename);

22

FETCH cEmplyee INTO rEmployee ;

23

DBMS_OUTPUT.PUT_LINE(rEmployee.first_name);

24

CLOSE cEmplyee;

nR

eg

15

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 6 of 14

25
OPEN cEmplyeeJob('SALESMAN');

27

FETCH cEmplyeeJob INTO V_ename;

28

DBMS_OUTPUT.PUT_LINE(V_ename);

29

FETCH cEmplyeeJob INTO V_ename;

30

DBMS_OUTPUT.PUT_LINE(V_ename);

31

CLOSE cEmplyeeJob;

26

OPEN cEmplyeeJob('MANAGER');

34

FETCH cEmplyeeJob INTO V_ename;

35

DBMS_OUTPUT.PUT_LINE(V_ename);

36

FETCH cEmplyeeJob INTO V_ename;

37

DBMS_OUTPUT.PUT_LINE(V_ename);

38

CLOSE cEmplyeeJob;

39 END;

nR

eg

is

33

te

re

32

40 /

Exemplo 1 Cursores

Obs: No exemplo acima, as linhas 8 at 13 mostram a declarao de um cursor com parmetro e


nas linhas 15, 26 e 33 mostra o open do cursor. A linha 7 mostra um registro recebendo a

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 7 of 14

estrutura de linha de um cursor (isso poderia ser feito a uma tabela) e as linhas 22 e 23 mostram o
fetch para o registro e o uso do valor do registro

Atributos do Cursor Explcito

Quando anexados ao nome do cursor, esses atributos retornam informaes teis sobre a

execuo de uma instruo de manipulao de dados.

Tipo

Descrio

%ISOPEN

Booleano

Ser avaliado para TRUE se o cursor estiver aberto

%NOTFOUND

Booleano

Ser avaliado para TRUE se a extrao mais recente no

is

te

re

Atributo

Booleano

Ser avaliado para TRUE se a extrao mais recente retornar

nR

%FOUND

eg

retornar linha.

%ROWCOUNT

linha.

Numerico

Ser avaliado para o nmero total de linhas retornadas at o


momento.

LOOP Simples X Cursor

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 8 of 14

Neste primeiro estilo de loop de busca, a sintaxe de loop simples utilizada para processamento
do cursor. Atributos explcitos de cursor so utilizados para controlar o nmero de vezes que o
loop executado.

1 DECLARE
CURSOR cEmpregados IS

SELECT first_name FROM employees;

aName employees.first_name%TYPE;

LOOP

is

OPEN cEmpregados;

eg

te

5 BEGIN

FETCH cEmpregados INTO aName;

EXIT WHEN cEmpregados%NOTFOUND;

nR

DBMS_OUTPUT.PUT_LINE(aName);

10

re

11

END LOOP;

12

CLOSE cEmpregados;

13 END;
14 /

Exemplo 2 Cursores Loop Simples

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 9 of 14

LOOP While X Cursor

O mesmo Exemplo 2 poderia ser escrito utilizando a sintaxe WHILE..LOOP, da seguinte maneira.

re

SELECT * FROM locations;


rCity locations%ROWTYPE;

5 BEGIN
OPEN cCidades;

FETCH cCidades INTO rCity;

WHILE cCidades%FOUND LOOP

10

nR

is

te

CURSOR cCidades IS

eg

1 DECLARE

DBMS_OUTPUT.PUT_LINE(rCity.city||' - '||rCity.state_province);
FETCH cCidades INTO rCity;

11

END LOOP;

12

CLOSE cCidades;

13 END;
14 /

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 10 of 14

Exemplo 3 Cursores Loop While

1.8

LOOP For X Cursor

Os dois exemplos de LOOPs descritos anteriormente requerem um processamento explcito de


cursor por meio de instrues OPEN, FETCH, CLOSE ver (11.8.1). A programao PL/SQL

te

re

fornece um tipo de LOOP mais eficiente, que trata implicitamente o processamento de cursor.

SELECT job_title, job_id

FROM jobs;

5 BEGIN

FOR rCargo IN cCargos LOOP

7
8

eg

CURSOR cCargos IS

nR

is

1 DECLARE

DBMS_OUTPUT.PUT_LINE(rCargo.job_id||' - '||rCargo.job_title);
END LOOP;

9 END;
10 /

Exemplo 4 Cursor FOR

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 11 of 14

Observaes

O registro rCargo no declarado, sua declarao executada implicitamente, recebe o

tipo cCargos%ROWTYPE e o seu escopo apenas o LOOP.

O cursor cCargos processado implicitamente, sendo desnecessrio os comandos OPEN,

FETCH, CLOSE.

te

re

LOOP For Implcitos

Alm do registro, o prprio cursor pode ser implicitamente declarado. A consulta SQL geradora do

is

conjunto ativo apresentada em de parnteses dentro da prpria instruo FOR, e neste caso,

nR

eg

tanto o registro com o cursor so implicitamente declarados.

1 BEGIN

FOR rDepartamento IN (SELECT d.department_id, d.department_name

3
4
5

FROM departments d) LOOP


DBMS_OUTPUT.PUT_LINE(rDepartamento.department_name);
END LOOP;

6 END;
7 /

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 12 of 14

Exemplo 5 Cursor FOR Implcito

Cursores Implcitos

Existem os cursor implcitos que so criados para processar as instrues INSERT, UPDATE,
DELETE, SELECT...INTO e so manipulados a revelia do programador. Neste caso apenas o
atributo %ROWCOUTN interessante para a instruo UPDATE. O cursor implcito representado

te

re

pela palavra reservada SQL.

WHERE MAX_SALARY < 9000;

5
6

eg

SET MAX_SALARY = MAX_SALARY+100

nR

UPDATE jobs

is

1 BEGIN

DBMS_OUTPUT.PUT_LINE(SQL%ROWCOUNT||' linhas salarios foram atualizadas');

7 END;
8 /

Exemplo 6 Cursor Implcito

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 13 of 14

Marcus William
Marcus William, Tecnlogo em Processamento de Dados, com mais de 10 anos na rea de TI, convive h mais de sete anos
com produtos Oracle, autodidata no aprendizado da programao PL/SQL, foi coordenador dos programadores PL/SQL em
[...]

Curtir

(0)

Gostei (1)

0 COMENTRIO

re

Nenhum comentrio foi postado - seja o primeiro a comentar!

Curso Online

Revista

eg

Revista SQL Magazine 116

is

te

Curso Dominando XML com SQL Server

Video aula

Video aula

nR

Outras estruturas de memria - Curso de Oracle: Otimizao de


desempenho - Aula 10

Cache manual de tabelas - Curso de Oracle: Otimizao de


desempenho - Aula 9
Video aula

Buffer Pools - Curso de Oracle: Otimizao de desempenho - Aula


8
Video aula

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013

Programando com cursores PL/SQL

Page 14 of 14

Redimencionando o buffer cache - Curso de Oracle: Otimizao


de desempenho - Aula 7
Video aula

Data Dictionary Cache, UGA e Large Pool - Curso de Oracle:


Otimizao de desempenho - Aula 6
Artigo

Artigo

re

Segurana em bancos de dados Oracle 11g

Tablespace: Estrutura de armazenamento de dados Oracle

te

Artigo

eg

nR

Listar mais contedo

is

Alta disponibilidade no banco de dados Oracle Parte 2

DevMedia
Curtir
13.966 pessoas curtiram DevMedia

DevMedia | Anuncie | Fale conosco


Hospedagem web por Porta 80 Web Hosting
2013 - Todos os Direitos Reservados a web-03
Plug-in social do Facebook

http://www.devmedia.com.br/programando-com-cursores-pl-sql/13041

8/10/2013