Introdução à Linguagem PL/SQL - Parte 4

Cursores

Uma definição PL / SQL chamado de cursor permite nomear uma área de registros e acessar suas informações armazenadas. Existem dois tipos de cursores: implícitos e explícitos. PL / SQL declara implicitamente um cursor para todas as instruções SQL de manipulação de dados, incluindo consultas que retornam apenas uma linha. Para consultas que retornam mais de uma linha, você pode declarar explicitamente um cursor para processar as linhas individualmente.

Exemplo:

DECLARE CURSOR registros IS SELECT idpessoa, nome FROM pessoa;    

Você usa os OPEN , FETCH e CLOSE para controlar um cursor.

O OPEN executa a consulta associada ao cursor, identifica o conjunto de resultados e posiciona o cursor antes da primeira linha.
O FETCH recupera a linha atual e avança o cursor para a próxima linha.
Quando a última linha ter sido processada, o CLOSE desativa o cursor.

declare
	    cursor registro is select * from pessoa;

	    vidpessoa	pessoa.idpessoa%type;	
	    vnome	pessoa.nome%type;
	begin
	    open registro;	
	       loop fetch registro into vidpessoa, vnome, vdatanasc,
					vlogradouro, vestado;	
	        dbms_output.put_line('IdPessoa..: ' || vidpessoa);
			dbms_output.put_line('Nome......: ' || vnome);
			exit when registro%notfound;
	       end loop;	
	    close registro;	
	end;
	/    

Controle de decisões

Muitas vezes, é necessário tomar medidas alternativas, dependendo das circunstâncias. O IF-THEN-ELSE permite que você execute uma seqüência de instruções condicionalmente. O IF verifica uma condição: o THEN define o que fazer se a condição for verdadeira, o ELSE define o que fazer se a condição for falso ou nulo.

Segue um exemplo utilizando cursores implícitos:

declare
		total number(10,2) := 0;
		vsexo varchar2(15) := '&sexo';
	begin
		for c in (select * from vw_clientes)
		loop

			if c.sexo = vsexo then

			dbms_output.put_line('Codigo.....: ' || c.codigo);
			dbms_output.put_line('Cliente....: ' || c.cliente);
			dbms_output.put_line('......');		

			end if;		
		end loop;	
	end;
	/