Cursores dinâmicos com PL/SQL

[ad#texto]
Se você ainda é iniciante em PL/SQL provavelmente ainda não precisou utilizar, mas tenha certeza, em algum momento a sua aplicação irá precisar que o cursor seja montado em tempo de execução e quando esse momento chegar você terá que montar um cursor dinâmico.

Para os iniciantes que ainda não entenderam o que é, suponha que você tenha um cursor fixo no código:

cursor c_teste is
select * from sua_tabela where seu_campo = 22

Mas e se em algum determinado momento esse cursor devesse ser alterado, montar dezenas de cursor e ir empilhando tudo dentro de um monte de if com certeza não será a melhor opção, embora também funcione. É aí que entra o cursor dinâmico no PL/SQL.

Vamos lá:

-- Declarando a variável que irá armazenar a string com o comando SQL montado para execução
var_cursor                          varchar2(4000);

var_cur                              number;
var_exec                            number;
var_retor                            number;
var_1                                 varchar2(30);
var_2                                 number;

begin

var_cursor := ‘select * from sua_tabela ’;

if var_controle = 1 then
 var_cursor := var_cursor || ‘where seu_campo = 22’;
else
 var_cursor := var_cursor || ‘where seu_campo = 25’;
end if;

-- Executar cursor dinamico
-- Cria cursor dinâmico para execução
var_cur := dbms_sql.open_cursor;

-- Comando Parse do SQL gerado
dbms_sql.parse(var_cur,  var_cursor, 1);

-- Colunas de retorno
dbms_sql.define_column(var_cur, 1, var_1);
dbms_sql.define_column(var_cur, 2, var_2);

-- Executa o cursor
var_exec := dbms_sql.execute(var_cur);

loop
 -- Retorna os resultados
 -- Verifica se há alguma linha de retorno do cursor
 var_retor := dbms_sql.fetch_rows(var_cur);
 EXIT WHEN var_retor = 0;

 -- Carrega variável com o retorno do cursor
 dbms_sql.column_value(var_cur, 1, var_1);
 dbms_sql.column_value(var_cur, 2, var_2);
end loop;
end;

É isso, o código PL/SQL ficou um pouco longo, mas dá para entender a lógica de utilização e adapta-lo a sua necessidade.

Depois de adquirir prática na utilização de cursores dinâmicos no PL/SQL verá que ele poupa bastante tempo em desenvolvimento, deixando a sua aplicação mais robusta e performática com o SQL sendo montado em tempo de execução.

Petter Rafael

Desenvolvedor Web atua com as tecnologias Java e PHP apoiadas pelos bancos de dados Oracle e MySQL. Além dos ambientes de desenvolvimento acima possuiu amplo conhecimento em servidores Apache/Tomcat, Photoshop, Arte & Foto, Flash e mais uma dezena de ferramentas e tecnologias emergentes. Atualmente colabora com o Viablog escrevendo sobre programação e tecnologia.
ViamaisBLOG
Privacy Overview

This website uses cookies so that we can provide you with the best user experience possible. Cookie information is stored in your browser and performs functions such as recognising you when you return to our website and helping our team to understand which sections of the website you find most interesting and useful.