Converter Varchar em uma "sequencia" numeric PL/SQL

7 respostas
F

Olá pessoal pode parecer mto boba a pergunta mais sinceramente ainda n tive a visão de como resolver o problema. A dificuldade é a seguinte eu tenho uma variavel empresas do tipo varchar que guarda os id da minhas empresas por exemplo empresas = ‘1,2,3’, eu preciso usar essa variavel dentro de uma condicaço IN em um select…
por exemplo: SELECT * FROM EMPRESAS WHERE id_empresa IN (empresas). E como é de se esperar ta dando number invalid, alguem sabe uma maneira simples de como posso converter esse meu varchar em um sequencia de number?

desde já grato

7 Respostas

F

Você poderia me dizer como você monta a consulta?
Posta o trecho do código ai por favor.

F

seria algo desse tipo amigo

empresas = ‘1,2,3’ <== a string q recebo como parametro
a consulta seria algo do tipo:

SELECT * FROM EMPRESAS WHERE id_empresa IN (empresas) <<< aki VAI DAR number invalid como resolver? T_T

F

Caso id_empresa seja um number

String empresas = "1,2,3"; String sql = "SELECT * FROM EMPRESAS WHERE id_empresa IN (" + empresas + ")";
Caso id_empresa seja um varchar

String empresas = "1,2,3"; String sql = "SELECT * FROM EMPRESAS WHERE id_empresa IN ("; String[] ids= empresas.split(","); for (int i = 0; i < ids.length; i++) { sql += "'" + ids[i] + "'"; if(i < ids.length - 1){ sql += ","; } } sql += ")";

F

obrigado por responder amigo… mais isso tem q ser tratado no banco em pl/sql não a priori não posso mexer no java

F

Desculpa cara, não tinha reparado que era em pl/sql, dê uma olhada aqui: http://www.dbforums.com/oracle/998642-pl-sql-splitting-string-into-array.html

F

Opa vlw pela dica bro... mas um outro amigo me passou um funçao legal pra retorna uma table com os valores, o delimitador eh uma virgula... mas pra setar pra qqr outro delimitador na funçao, segue o codigo

create or replace function par_split(p_list varchar2,
                                     p_del  varchar2 := ',',
                                     p_qtde integer := 0)
  return par_split_tbl
  pipelined is
  l_idx   pls_integer;
  l_list  varchar2(32767) := p_list;
  l_value varchar2(32767);
  l_qtde  integer;
begin
  l_qtde := 0;
  loop
    l_idx := instr(l_list, p_del);
    if l_idx > 0 then
      l_qtde := l_qtde + 1;
      pipe row(substr(l_list, 1, l_idx - 1));
      l_list := substr(l_list, l_idx + length(p_del));
    else
      l_qtde := l_qtde + 1;
      pipe row(l_list);
      exit;
    end if;
          if p_qtde > 0 and l_qtde = p_qtde then
        exit;
      end if;

  end loop;
  return;
end par_split;
F
Fernando Trindade:
Opa vlw pela dica bro... mas um outro amigo me passou um funçao legal pra retorna uma table com os valores, o delimitador eh uma virgula... mas pra setar pra qqr outro delimitador na funçao, segue o codigo
create or replace function par_split(p_list varchar2,
                                     p_del  varchar2 := ',',
                                     p_qtde integer := 0)
  return par_split_tbl
  pipelined is
  l_idx   pls_integer;
  l_list  varchar2(32767) := p_list;
  l_value varchar2(32767);
  l_qtde  integer;
begin
  l_qtde := 0;
  loop
    l_idx := instr(l_list, p_del);
    if l_idx > 0 then
      l_qtde := l_qtde + 1;
      pipe row(substr(l_list, 1, l_idx - 1));
      l_list := substr(l_list, l_idx + length(p_del));
    else
      l_qtde := l_qtde + 1;
      pipe row(l_list);
      exit;
    end if;
          if p_qtde > 0 and l_qtde = p_qtde then
        exit;
      end if;

  end loop;
  return;
end par_split;

Legal cara, então altera o titulo do tópico para "[Resolvido]"

Criado 22 de dezembro de 2011
Ultima resposta 22 de dez. de 2011
Respostas 7
Participantes 2