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] >