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