Oracle Execute Immediate SQL Dinâmico
Fala pessoAll,
Vamos nós novamente.
A pedido do amigo Marcos Castro dessa vez estaremos falando sobre SQL Dinâmicos, um recurso muito interessante no PL/SQL que em diversas vezes não é utilizado por nossos excelentíssimos desenvolvedores, fazendo com que nossos códigos sejam bem maiores, bem mais complexos e bem mais chatos de dar manutenção. Mas… o lado B dessa história é: Se você complicar muito no uso de SQL Dinâmico, não tenha dúvida de que seu código vai ficar muito complexo e todo mundo que for dar manutenção vai te xingar um bocado! Rsrs.
Vamos lá, ao exemplo prático e simples, que é o que interessa.
Suponha que você tem uma função para ser feita, que deve retornar o nome de uma determinada pessoa… essa pesquisa pode ser pelo seu RG, CPF ou Habilitação. Como podemos fazer isso?
Exemplo 1 (sem SQL Dinâmico):
create or replace function pesquisa_pessoa(pcodigo number, pfiltro varchar2) return varchar2 is
v_nome_pessoa pessoas.nome%type;
begin
if(pfiltro = ‘RG’) then
select nome
into v_nome_pessoa
from pessoas
where rg = pcodigo;
elsif(pfiltro = ‘CPF’) then
select nome
into v_nome_pessoa
from pessoas
where cpf = pcodigo;
elsif(pfiltro = ‘CNH’) then
select nome
into v_nome_pessoa
from pessoas
where cnh = pcodigo;
end if;
return v_nome_pessoa;
end;
Notemos que o SQL é o mesmo sempre (select nome into v_nome_pessoa from pessoas where … = pcodigo ), o que muda é apenas o nome do campo que será utilizado para filtrar a pessoa, portanto, podemos utilizar o recurso de SQL Dinâmico para otimizar este código, e como ele ficaria? Assim:
create or replace function pesquisa_pessoa(pcodigo number, pfiltro varchar2) return varchar2 is
v_nome_pessoa pessoas.nome%type;
v_where varchar2(50);
begin
if(pfiltro = ‘RG’) then
v_where := ‘rg’;
elsif(pfiltro = ‘CPF’) then
v_where := ‘cpf’;
elsif(pfiltro = ‘CNH’) then
v_where := ‘cnh’;
end if;
dbms_output.put_line(’select nome into v_nome_pessoa from pessoas where ‘||v_where||’ = ‘||pcodigo||’;');
execute immediate ’select nome from pessoas where ‘||v_where||’ = ‘||pcodigo
into v_nome_pessoa;
return v_nome_pessoa;
end;
Bem mais simples, e não precisamos ficar repetindo o mesmo comando várias vezes.
Bom, isso é só um exemplo bem simples, mas… o Execute Immediate pode ser usado de diversas outras maneiras.
Achei um site bem interessante, que mostra as diversas usabilidades deste recurso com exemplos que podem ser utilizados para um melhor entendimento. O site é o DBA Support.
É isso aí, espero que este recurso seja útil e bem utilizado nas suas aplicações.
Atc.
Gerson Júnior
(gerson.vasconcelos@gmail.com)
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
Oi Gerson,
Post ótimo e objetivo. Realmente o que eu precisava. Obrigada,
Obrigado Celeste, esta é a intenção, simplicidade e clareza. Grande abraço e obrigado pelo acesso. Volte sempre!
Atc.
Gerson Júnior
gerson.vasconcelos@gmail.com
Ola Gerson,
Você teria um exemplo da execução de um select dinamico que gera um arquivo com seu resultado?
Anônimo, fiz um novo post com o que você pediu, usando SQL Dinâmico e com o resultado é gerado um arquivo. Dá uma olhada que deve te ajudar. O link para o post é SQL Dinâmico gerando arquivo.
Espero que te ajude.