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.

Tags:,
Petter Rafael
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.

Assinar blog por e-mail

Digite seu endereço de e-mail para assinar este blog e receber notificações de novas publicações por e-mail.

Junte-se a 321 outros assinantes

Busca

outubro 2020
DSTQQSS
 123
45678910
11121314151617
18192021222324
25262728293031

Categorias