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.