Você tem que fazer uma procedure que retorna um cursor, porem no momento do desenvolvimento você não consegue definir os campos de retorno?
Você tem que executar um comando DDL em tempo de execução de uma procedure?
Você tem que fazer uma procedure que faça um insert, mas a tabela só sera conhecida em tempo de execução?
O usuário quer poder gerar qualquer relatório, olhando qualquer tabela do sistema filtrando por qualquer campo sem ter que fazer uma solicitação para TI e a empresa não quer investir na ferramenta adequada? Ou isso tem que ser feito pra ontem?
Se você esta lendo este post para tentar sair de uma dessas situações ou uma parecida o SQLDinâmico pode ser sua solução. Antes optar pelo uso do SQL Dinâmico avalie sua real necessidade com cautela pois este recurso pode gerar uma lentidão no processo.
Neste post vou explicar apenas o básico sobre o uso de SQL Dinâmico pois esse recurso é muito complexo para explicar em uma unica postagem.
Para executar o SQL Dinâmico deve-se usar o comando Execute Imediate:
O exemplo a baixo mostra a sintaxe basica para a uso do SQL Dinâmico a partir do comando EXECUTE IMMEDIATE, para esse comando podemos passar qualquer string que ele vai executar:
BEGIN
EXECUTE IMMEDIATE 'SELECT * FROM DUAL';
END;
No comando acima a string foi passada diretamente, porem o mais indicado é atribuir o texto a uma string e passar a string no comando EXECUTE IMMEDIATE, como no exemplo abaixo:
DECLARE
V_SQL VARCHAR2;
BEGIN
V_SQL := 'SELECT * FROM DUAL'-- atribuindo valor na string
EXECUTE IMMEDIATE V_SQL; -- execução do script contido na string
END;
O segundo exemplo é o mais utilizado no desenvolvimento de procedures pois você pode não saber antecipadamente quais as colunas você deve retornar ou em qual tabela você vai buscar ou até mesmo você pode não saber em qual tabela a busca será realizada, veja a procedure abaixo:
-- Criação da Procedure para receber como
parâmetro nome do campo e nome da tabela onde a consulta será realizada
CREATE OR REPLACE PROCEDURE P_SQL_DINAMICO ( V_TABELA VARCHAR2, V_CAMPO VARCHAR2)AS
V_SQL VARCHAR2(100);
BEGIN
V_SQL := 'SELECT ' || V_CAMPO || ' FROM ' || V_TABELA;--Concatenação do texto a ser executado
EXECUTE IMMEDIATE V_SQL; -- execução do script contido na string
END;
Cada vez que for executada a procedure vai realizar uma consulta diferente dependendo dos parâmetros informados no momento em que ela for chamada.
É importante lembrar que não podemos usar ";" dentro da string que será executada pelo SQL Dinâmico.