select de STRING não retorna dados formatados

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
carladias
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 23 Set 2010 7:54 am
Localização: Lisboa

Estou com problemas num select que deveria retornar dados, mas não funciona exemplo:

Selecionar tudo

SELECT to_char(''''|| concat (replace (s_sparam,'#',''','''),'''')) 
FROM SERVICE 
WHERE contract_id=25 
AND sncode=4 
o campo s_sparam tem a informação original 1#2#5#8#25

Com a formatação a informação fica: '1','2','5','8','25'

Pretendo verificar a descrição de cada um dos parâmetros acima, numa tabela que tem ID e descrições, sendo que o campo ID é do tipo varchar, mas se fizer este select:

Selecionar tudo

 SELECT  id, description  
FROM  parameters WHERE id IN (SELECT to_char(''''|| concat (replace  (s_sparam,'#',''','''),'''')) 
FROM SERVICE 
WHERE contract_id=25 AND sncode=4) 
Não é devolvida nenhuma informação, mas se fizer a substituição do que é retornado já dá tipo:

Selecionar tudo

 SELECT  id, description  
FROM  parameters 
WHERE id IN ('1','2','5','8','25') 
Resultado:

Selecionar tudo

ID	Description
1	Internet
2	WAP
5	UMTS
8	MMS
25	Portal
Não entendo isto, já fiz inclusivamente um PLSQL e não resultou. Podem ajudar-me? Precisava mesmo pôr isto a funcionar.

Obrigado
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
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 só vai funcionar dessa forma se você fizer um EXECUTE IMMEDIATE. (select dinamico)

Da forma que você está fazendo, o banco está procurando um ID que seja IGUAL a ('1','2','5','8','25').


Esse tópico é parecido com o seu:
http://glufke.net/oracle/viewtopic.php?t=5469

Dá uma olhada nos links que tem la, tokenizer, etc... :-o
Diego_Mello
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 229
Registrado em: Sex, 05 Set 2008 2:59 pm
Localização: Igrejinha - RS
Diego Mello
Igrejinha - RS
www.twitter.com/diegolmello

Opa..
Um tempo atrás eu criei uma função que pega uma string separada por vírgulas e retorna como registros, ou seja, um PIPELINED bem simples...

Selecionar tudo

CREATE OR REPLACE FUNCTION fct_comma_to_table_pipelined(p_string VARCHAR2) RETURN varchar_list_type
  PIPELINED IS
  RESULT varchar_list_type;
  v_string VARCHAR2(32000);
  v_next NUMBER;
  v_start NUMBER;
  v_count NUMBER;

  --/ Busca o índice da próxima vírgula
  FUNCTION NEXT(p_last_index NUMBER) RETURN NUMBER IS
  BEGIN
    IF (p_last_index IS NOT NULL)
    THEN
      RETURN(INSTR(v_string, ',', p_last_index));
    END IF;
    RETURN(INSTR(v_string, ','));
  END NEXT;
  --/
BEGIN
  --/
  v_string := p_string;

  --/
  IF v_string IS NOT NULL
  THEN
    IF INSTR(v_string, ',', -1) <> LENGTH(v_string)
    THEN
      v_string := v_string || ',';
    END IF;
  
    WHILE NVL(v_next, 0) <> LENGTH(v_string)
    LOOP
      v_start := NVL(v_next, 0) + 1;
      v_next := NEXT(v_next + 1);
      v_count := v_next - v_start;
      PIPE ROW(SUBSTR(v_string, v_start, v_count));
    END LOOP;
  END IF;

  RETURN;
END fct_comma_to_table_pipelined;
O uso dela seria algo assim...

Selecionar tudo

SQL> SELECT *
  2    FROM TABLE(fct_comma_to_table_pipelined('1,2,3'));
 
COLUMN_VALUE
--------------------------------------------------------------------------------
1
2
3
Bueno, tendo entendido a função vamos ao teu problema :D
O problema do teu código é que tu estas comparando uma string com um campo number.

Selecionar tudo

'1','2','5','8','25' é uma só string!
Usando a "minha" função tu podes usar a tua mesma query no IN.

Selecionar tudo

SQL> SELECT *
  2    FROM (SELECT LEVEL nivel
  3            FROM dual
  4          CONNECT BY LEVEL <= 30)
  5   WHERE TO_CHAR(nivel) IN (SELECT *
  6                              FROM TABLE(fct_comma_to_table_pipelined((SELECT REPLACE(s_sparam, '#', ',')
  7                                                                        FROM (SELECT '1#2#5#8#25' s_sparam
  8                                                                                FROM dual)))));
 
    NIVEL
---------
        1
        2
       25
        5
        8
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
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

Mandou bem ! Vai pros favoritos :-)
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

No tópico abaixo tem uma solução com nested table types, bem elegante, proposta pelo Tom Kyte no site dele:
http://glufke.net/oracle/viewtopic.php?t=6821
carladias
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 23 Set 2010 7:54 am
Localização: Lisboa

Obrigado Diego Valeu, já está funcionando. Sem suas dicas seria dificil. Mesmo muito Obrigada :lol:
carladias
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Qui, 23 Set 2010 7:54 am
Localização: Lisboa

Muito Obrigado, também pelas restantes ajudas. Aprendi mais umas coisas. :-o
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante