Você está na página 1de 2

Formas de Manipulao de Cursores em PL/SQL

Cursores so reas compostas de linhas e colunas armazenadas em memria que servem para armazenar o resultado de uma seleo que retorna nenhuma, uma ou diversas linhas. Os cursores, no banco de dados Oracle podem ser explcitos e implcitos, mas no momento irei abordar somente os cursores explcitos. Com o uso de cursores possvel selecionar um conjunto de linhas e manipular o resultado desta consulta linha a linha, dentro de um cdigo PL/SQL (Program Language SQL), como stored procedures, triggers e cdigo escritos dentro de ferramentas Oracle como o Developer, Designer ou Discoverer. O cursor deve ser declarado na clusula DECLARE de um cdigo PL/SQL: CURSOR nome_do_cursor SELECT [FOR UPDATE OF colunas] (Relao_de_Parmetros) IS ... formato:

Relao_de_Parmetros pode ter o seguinte Nome_do_Parametro tipo_de_dado {:= / DEFAULT} valor_inicial

Aps sua declarao, os cursores podem ser manipulados de forma extensa ou de forma resumida. Quando se utiliza a forma extensa, que menos recomendada, os seguintes comandos so utilizados em combinao com uma estrutura de looping: OPEN abre o cursor, executando a consulta (comando SELECT) relacionada ao cursor,
preenchendo parte de uma rea de memria conhecida como private SQL area. Nesse momento, o ponteiro do cursor estar indicando o primeiro dos registros resultantes da consulta. A partir de ento, para acessar dados desse cursor, o banco no ser novamente acessado, pois todos os registros estaro disponveis em memria aps a execuo do comando OPEN. Caso o cursor receba parmetros neste momento que os mesmos sero repassados. FETCH disponibiliza a linha corrente do cursor para as variveis correspondentes e posiciona o ponteiro na prxima linha do cursor. As linhas armazenadas no cursor somente podero ser processadas quando seu contedo for transferido para variveis que possam ser manipuladas no PL/SQL. CLOSE fecha o cursor. Aps sua manipulao, o cursor deve ser fechado com o comando CLOSE, para que a rea de memria ocupada pelo resultado da consulta gerado por ele seja liberada.

Na forma reduzida, por sua vez, os comandos anteriores so substitudos pelo comando FOR unicamente:

FOR controla de modo completo a acesso ao cursor, substituindo os trs comandos


anteriores, executando, automaticamente as seguintes aes:

cria a varivel (do tipo registro) que ir receber os dados. Essa varivel no dever ser explicitamente declarada (DECLARE); abre o cursor; realiza a cpia das linhas uma a uma (FETCH), a cada iterao do comando; controla o final do cursor, e fecha o cursor.
A cada iterao do loop o ponteiro vai avanar pelos registros selecionados, comeando sempre pelo primeiro, no qual estar posicionado na primeira iterao do comando FOR. A seguir apresento um exemplo e a estrutura comparativa entre as duas formas de se trabalhar com cursores.

Exemplo Extenso

Exemplo Resumido

Declare Declare Cursor Cur_Cli Is Cursor Cur_Cli Is Select cd_cliente, nm_cliente Select cd_cliente, nm_cliente From Cliente; From Cliente; Reg_Cli Cur_Cli%Rowtype; Begin Begin For Reg_Cli in Cur_Cli Open Cur_Cli; Loop Loop Dbms_Output.Put_Line Fetch Cur_Cli (Reg_Cli.nm_cliente); Into Reg_Cli; End Loop; Exit When End; Cur_Cli%NotFound; Dbms_Output.Put_Line (Reg_Cli.nm_cliente); End Loop; Close Cur_Cli; End; Abaixo possvel ver a comparao entre o uso de uma estrutura expandida e uma simplificada. Repare na forma expandida, as linhas em vermelho que so suprimidas ao optarse pela forma simplificada utilizando o comando FOR.

Fonte: http://www.devmedia.com.br/formas-de-manipulacao-de-cursores-em-pl-sql/1713