Colega, pelo que entendi a sua questão deriva do que é explicado em 
http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:227413938857#tom2399952100346619006
 , ie : vc só pode bindar os VALORES normalmente INFORMADOS PELO USUÀRIO, itens 
como colunas, elementos de sintaxe (como as palavras-chave WHERE, ORDER, etc) 
Não São 'valores' , na sintaxe SQL normal isso é considerado um elemento fixo 
... Imagine que vc tem um SQL tipo :

SELECT CODIGO, NOME FROM TABELA WHERE CODIGO = valordesejado;

Esse 'valordesejado' é alguma coisa que o database RECEBE DE FORA , 
absolutamete não faz parte da sintaxe, e não pode ser validado dentro do banco, 
é informação recebida, então esse cara PODE ser bindado, o resto em MAIUSC não 
pode, OU é palavra-chave OU é informação a ser validada dentro do banco... 
 Para se tentar evitar SQL dinâmico (que como se sabe tem Overhead, SEMPRE 
implica num parse, é Extraordinariamente mais difícil de debugar em muitos 
casos, etc, etc) , uma opção muitas vezes pode ser um truque como :
 
 SELECT COLUNAS FROM TABELA
 WHERE COLUNA1 = NVL(:PARAM1, COLUNA1)
   AND COLUNA2 = NVL(:PARAM2, COLUNA2)... etc ...
   
Ou ter CONTEXTS representando os valores a bindar (procure no asktom mesmo por 
DYNAMIC e CONTEXT que vc acha várias refs.... 

E obs final : caso REALMENTE vc tenha mesmo que usar SQL dinâmico, 2 
recomendações :

 a) veja a opção de EXECUTE IMMEDIATE, se vc sabe a qtdade/relação de colunas 
via de regra a sintaxe dele é um pouco mais amigável
 
 e
 
 b) vc TEM QUE TER um filtro, uma VALIDAÇÃO para os elementos que vc vai 
concatenar, sob pena de possibilitar SQL INJECTION, no mesmo site pesquise pra 
saber mais se não estava ciente da questão
 
 []s
 
   Chiappa
   

--- Em oracle_br@yahoogrupos.com.br, "Fernando Franquini 'capin'" 
<fernando.franqu...@...> escreveu
>
> Senhores,
> 
> eu tenho um problema em um SQL Dinamico.
> Vou montar o exemplo:
> 
> Tenho o SQL abaixo que FUNCIONA (sei que não é a melhor forma, por isso
> estou procurando outra):
> 
>     vsql || '        Select CD_A, NM_A, NM_B, NM_C, UF, NM_D';
>     vsql := vsql || '  From TABELA Where ';
>     vsql := vsql || coluna_Sql || ' = ''' || filtro_Sql || '''';
>     vsql := vsql || ' order  by ' || campo_Ordenacao || ' ' ||
> tipo_Ordenacao;
> 
> Tentei utilizar bind variables (mas nao consegui fazer funcionar o parametro
> de COLUNA)
> Bind como parte da estrutura de tabela do SQL (parametro coluna_sql) NÃO
> FUNCIONA.
> 
>     vsql || '        Select CD_A, NM_A, NM_B, NM_C, UF, NM_D';
>     vsql := vsql || '  From TABELA Where ';
>     vsql := vsql || :1 || ' = ''' || :2 || '''';
>     vsql := vsql || ' order  by ' || :3 || ' ' || :4;
> USING coluna_Sql, filtro_Sql, campo_Ordenacao, tipo_Ordenacao
> 
> coluna_Sql : parametro que o usuario passa escolhendo quais colunas da
> tabela ele vai usar para comparar
> filtro_Sql : parametro que o usuario passa para ser comparado
> campo_Ordenacao : parametro que o usuario quer ordenar a pesquisa
> tipo_Ordenacao : parametro desc ou asc
> 
> exemplo de parametros:
> coluna_Sql : UF
> filtro_Sql : SC
> campo_Ordenacao : NM_A
> tipo_Ordenacao : DESC
> 
> coluna_Sql : NM_C
> filtro_Sql : 'Capinzal'
> campo_Ordenacao : NM_B
> tipo_Ordenacao : ASC
> 
> Sei que teria como fazer algo como:
> dbms_sql.parse(retorna_cursor, vsql , dbms_sql.NATIVE);
> 
> Minha pergunta é se eu executar da forma acima (dbms_sql.NATIVE) o sql vai
> ser sempre recompilar?? Seria a mesma coisa que executar direto o vsql no
> OPNE retorna_cursor FOR....??
> 
> Caso nao tenha sido bem claro e puderem me ajudar eu agradeço.
> 
> Att,
> -- 
> Fernando Franquini - Capin
> Bacharel em Ciencias da Computacao - UFSC
> Analista de Sistemas / DBA
> emails: ferna...@... / fernando.franqu...@...
> Celular: (48) 99024047
> Florianópolis - SC - Brasil
> www.wf5.com.br
> 
> 
> [As partes desta mensagem que não continham texto foram removidas]
>


Responder a