Dúvida com Operador IN

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
leandrolinof
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 33
Registrado em: Qua, 17 Fev 2010 6:30 am
Localização: Americana

Boa tarde pessoal!

Tenho uma dúvida com relação a um uso do operador in numa proc que fiz...

Tenho uma variavel X varchar2(20);

Nela faço vários IFs que vão inserindo os produtos que um usuário digita pra gerar um relatório. Que no fim pode ficar assim: Ex:00001, 00002
X=00001, 00002

Depois verifico com outro If (produto1 IN X) then ....

Minha dúvida é se tem como eu verificar o X com o operador IN ele busca o produto 00001 dentro dela por exemplo.
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

Se entendi, seria para pesquisar na string se há ocorrência do parâmetro dentro de uma lista separada por vírgulas, certo?

Um jeito seria assim:

Selecionar tudo

Connected to Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 
Connected as fsitja
 
SQL> 
SQL> set serveroutput on
SQL> declare
  2    x varchar2(4000);
  3    busca varchar2(10);
  4  begin
  5    x := '00001, 00002, 00003, 00005';
  6    busca := '00002';
  7    if regexp_like(ltrim(rtrim(x)), '(^|,) *' || busca || '(,|$) *')
  8    then
  9      dbms_output.put_line('Achou!');
 10    else
 11      dbms_output.put_line('Não Achou!');
 12    end if;
 13  end;
 14  /
 
Achou!
 
PL/SQL procedure successfully completed
Já é feita validação da lista para que não pegue substrings que não estejam entre duas vírgulas (a menos que esteja no início ou final da string).
ballboas
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 99
Registrado em: Qui, 02 Ago 2007 3:06 pm
Localização: sp
Érico Balboa

A pergunta mais cretina é aquela que não é feita

Fiz um código pra testar, pelo teste dá certo sim, confere ai:

Criação da Tabela

Selecionar tudo

CREATE GLOBAL TEMPORARY TABLE TABELA_GENERICA
(
  CHAR01 VARCHAR2(4000),
  CHAR02 VARCHAR2(4000)
)
ON COMMIT PRESERVE ROWS;
Teste Prático

Selecionar tudo

DECLARE
  X  VARCHAR2(30);
  X2 VARCHAR2(30);
  
BEGIN
    
  DELETE TABELA_GENERICA WHERE CHAR02 = 'TESTE';
  
  INSERT INTO TABELA_GENERICA (CHAR01,CHAR02) VALUES (1,'TESTE');
  INSERT INTO TABELA_GENERICA (CHAR01,CHAR02) VALUES (2,'TESTE');
  INSERT INTO TABELA_GENERICA (CHAR01,CHAR02) VALUES (3,'TESTE');
  
  FOR V IN (SELECT CHAR01 FROM TABELA_GENERICA WHERE CHAR02 = 'TESTE') LOOP    
    X := X||V.CHAR01||',';    
  END LOOP;  
  
  X := SUBSTR(X,1,LENGTH(X)-1);
  
  FOR V IN (SELECT CHAR01 FROM TABELA_GENERICA WHERE CHAR01 IN (X)) LOOP    
    X2 := X2||V.CHAR01||',';    
  END LOOP;    
  
  DBMS_OUTPUT.PUT_LINE(X);
  DBMS_OUTPUT.PUT_LINE(X2);
END;
Se for bem isso q você quer, hehehehe.....abs
leandrolinof
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 33
Registrado em: Qua, 17 Fev 2010 6:30 am
Localização: Americana

Ok pessoal vou testar o código sim....

Obrigado...
Responder
  • Informação
  • Quem está online

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