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.