Passar dois códigos para select em procedure

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Pessoal tenho um select que recebe um campo com in () para gerar esse select com vários números, eu passo esses valores via parametro na procedure, tipo (cod1, cod2, cod3), contudo está dando o erro

Selecionar tudo

ORA-01722: número inválido
Minha dúvida é quanto a sintaxe para que a procedure recebe os valores e passe para o select corretamente. A variável da procedure é do tipo string para receber todos os números, se eu passo somente 1 código funciona, porém mais acusa o erro.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Isso que você está tendando fazer só vai funcionar com SQL dinâmico.
Você está fazendo o IN desas forma:

Selecionar tudo

where campo IN (5, 2, var) 
Sendo a var um VARCHAR com todas opções separadas por vírgula.

O Oracle vai substituir da seguinte forma:

Selecionar tudo

where campo IN (5, 2, '5, 10, 20') 
Ou seja, está misturando Número com uma STRING.
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Hum, então não existe uma forma de ser feito usando o in() ?
Se realmente não tiver terei que alterar várias coisas aqui.
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Somente por curiosidade, será que tem como eu dar um replace para remover esse ' ?
Se fosse possível fazer isso como usar um caracter de escape para isso dentro do replace?
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Bom, teu caso realmente creio ser de select dinâmico (DBMS_SQL ou REF_CURSOR).
Mas, fica aqui a dica do replace:

Selecionar tudo

SELECT REPLACE('paulo&','&',null) FROM dual;
 
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

Cara eu acho que não me expressei direito, mas quanto ao select tranquilo, mas se eu tentar remover o ' da seguinte maneira:

Selecionar tudo

replace(var, ''', null);
Para remover o ' vai dar erro, pois o ' é um comando. O que eu preciso saber qual é o caracter de escape que faça que o ' central seja interpretado como uma string e não como parte do comando.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5018
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Não vai funcionar.
Você quer fazer assim:

Selecionar tudo

replace(var, '''', null); ]
replace(var, chr(39), null);
Pro oracle quando tem duas '' ele trata sendo apenas uma. OU, usando chr(39).

O fato é que você não vai conseguir "enganar" ele dessa forma. O SQL não trabalha concatenando coisas como em outras linguagens. Como eu disse antes: Só vai conseguir fazer dessa forma se for um SQL Dinâmico! Daí pode fazer esses "rolos" que funciona numa boa.

:-o
pyro
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 323
Registrado em: Qui, 21 Set 2006 10:21 am
Localização: Barala - TT

É realmente não funciona. Agora tenho que repensar tudo novamente.
Mas valeu pela força.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 7 visitantes