Manipular um texto.

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
bsr
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 30 Dez 2008 8:56 am
Localização: Porto

Eu tenho uma string do genero '110-112-123'

A minha ideia é atraves de um select into variavel, colocar na variavel a string que eu pus em cima.

O que preciso de fazer é percorrer essa string ate encontrar por exemplo o 110 e usar esse valor para um inserte, depois tenho de o eliminar e voltar a percorrer essa string ate encontrar o 112, tenho de fazer isto até não haver esses codigos.

alguém tem alguma sugestão?
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

As vezes vale mais a pena inserir essas informações numa tabela temporária (GLOBAL TEMPORARY TABLE).
Daí fazer um JOIN normal.

É um pouco mais trabalhoso mas as consultas ficam bem rápidas. O banco usa os índices corretos, etc.
bsr
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 30 Dez 2008 8:56 am
Localização: Porto

Mas não da para fazer o que eu sugeri?
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

Dá pra fazer sim.
Basta você percorrer a string e ir "catando" ali o que você quer.

DESVANTAGENS:
* Seu código vai ficar com um monte de AND e OR desnecessário.
* Será LIMITADO o número de parâmetros que você insere.
* Provavelmente você terá que criar uma FUNÇÃO que retorne o elemento 1, 2, 3,..., n da sua string. (aqui no forum tem uma aqui --> http://glufke.net/oracle/viewtopic.php?t=1653

Seu select vai parecer +ou- assim:

Selecionar tudo

SELECT *
FROM TABELA
WHERE 
    ( fnc_elemento(vstring, 1) is null OR fnc_elemento(vstring,1)=CAMPO )
AND ( fnc_elemento(vstring, 2) is null OR fnc_elemento(vstring,2)=CAMPO )
AND ( fnc_elemento(vstring, 3) is null OR fnc_elemento(vstring,3)=CAMPO )
AND ( fnc_elemento(vstring, 4) is null OR fnc_elemento(vstring,4)=CAMPO )
AND ( fnc_elemento(vstring, 5) is null OR fnc_elemento(vstring,5)=CAMPO )
AND ( fnc_elemento(vstring, 6) is null OR fnc_elemento(vstring,6)=CAMPO )
Neste exemplo, sua string pode ter no máximo 6 valores...


Da forma que eu citei (criando uma tabela), pode haver quantos parâmetros você quiser e SEMPRE vai ser rapido e confiável.
bsr
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 30 Dez 2008 8:56 am
Localização: Porto

Supondo que eu ponho '110-112-123' numa tabela temporaria, como é que eu vou buscar à tabela temporaria o 110 e depois o elimino?

Sei que posso ir bucar usando um select com um like mas como é que eu removo depois o 110.
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

Leia sobre GLOBAL TEMPORARY TABLE.
Vocẽ não precisa eliminar. Todas informações são visíveis apenas pra sessão que incluiu. Após o COMMIT ou ao termino da sessão, as informações desaparecem.
bsr
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Ter, 30 Dez 2008 8:56 am
Localização: Porto

Quero desde já agradecer a vossa ajuda.

A minha duvida já esta quase resolvida, so me falta uma coisa, como é que eu posso contar as quantas vezes aparece o caracter x (por exemplo) numa string.
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

Pode usar a dica encontrada no site da ORACLE:
http://www.oracle.com/technology/oramag ... 21304.html

Selecionar tudo

Identify and Count Characters

Tip for Week of December 13, 2004
This tip comes from Aui de la Vega, DBA, in Makati, Philippines.

This function provides the number of times a pattern occurs in a string (VARCHAR2).


SQL> CREATE FUNCTION NUM_CHARS(INSTRING VARCHAR2, INPATTERN VARCHAR2)
RETURN NUMBER
IS
COUNTER NUMBER;
NEXT_INDEX NUMBER;
STRING VARCHAR2(2000);
PATTERN VARCHAR2(2000);
BEGIN
COUNTER := 0;
NEXT_INDEX := 1;
STRING := LOWER(INSTRING);
PATTERN := LOWER(INPATTERN);
FOR I IN 1 .. LENGTH(STRING) LOOP
IF (LENGTH(PATTERN) <= LENGTH(STRING)-NEXT_INDEX+1)
AND (SUBSTR(STRING,NEXT_INDEX,LENGTH(PATTERN)) = PATTERN) THEN
COUNTER := COUNTER+1;
END IF;
NEXT_INDEX := NEXT_INDEX+1;
END LOOP;
RETURN COUNTER;
END;

Function created.

*Note: Use CREATE to make sure you are not overwriting an existing function.

Try it out:


SQL> select num_chars('miSSissipPi','i') from dual
2 /

NUM_CHARS('MISSISSIPPI','I')
----------------------------
4

SQL> c/'i'/'ssi'
1* select num_chars('miSSissipPi','ssi') from dual
SQL> /

NUM_CHARS('MISSISSIPPI','SSI')
------------------------------
2

SQL> c/ssi'/ppi'
1* select num_chars('miSSissipPi','ppi') from dual
SQL> /

NUM_CHARS('MISSISSIPPI','PPI')
------------------------------
1
SQL> c/'ppi/'p
1* select num_chars('miSSissippi','p') from dual
SQL> /

NUM_CHARS('MISSISSIPPI','P')
----------------------------
2

SQL> c/p'/s'
1* select num_chars('miSSissippi','s') from dual
SQL> /

NUM_CHARS('MISSISSIPPI','S')
----------------------------
4
Responder
  • Informação
  • Quem está online

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