Bom dia senhores,

   Sei que aqui tem alguns camaradas feras em pl/sql, que não é muito a
minha praia, mas todo DBA que tem que saber pelo menos o básico para se
virar.

   Bom a questão é o seguinte:

   Tenho o código abaixo que está funcionando, porém achei que é uma
maneira meia cretina de se varrer uma string e derepente estou
escrevendo código demais e não performático.

Atenciosamente,

Rodrigo Mufalani
OCP10g

==================================================================================================

SET SERVEROUT ON

DECLARE
 TYPE TTEXTO IS TABLE OF PRODTUR_PRT.PRT_DSPRODUTO%TYPE;
 TYPE TTIPO  IS TABLE OF PRODTUR_PRT.PRT_CDTIPOPROD%TYPE;
 TYPE TCODI  IS TABLE OF PRODTUR_PRT.PRT_CDPRODUTO%TYPE;

 TEXTO TTEXTO;
 TIPO  TTIPO;
 CODI  TCODI;

 VPOSICAOFRASE   INTEGER;
 VRESULTADO      INTEGER;
 NOITE           VARCHAR2(100);
 LINHAS          NUMBER;
 BEGIN
    -- INCIALIZACAO DAS VARIAVEIS
    DBMS_OUTPUT.ENABLE(2000000);
    VPOSICAOFRASE  := 1;
    NOITE := '';

  SELECT PRT_DSPRODUTO
         ,PRT_CDTIPOPROD
         ,PRT_CDPRODUTO
  BULK COLLECT INTO TEXTO, TIPO , CODI
  FROM PRODTUR_PRT
  WHERE PRT_CDTIPOPROD IN ('07','57') AND
        PRT_LIBERADO = 'S';

        FOR I IN TEXTO.FIRST..TEXTO.LAST LOOP

        WHILE VPOSICAOFRASE <= LENGTH(TEXTO(I)) LOOP
                  IF SUBSTR(TEXTO(I),VPOSICAOFRASE,1) BETWEEN '0' AND '9' THEN
                          -- VERIFICA SE EXISTE CARACTER NUMERICO EM TEXTO(I)
        NOITE := SUBSTR(TEXTO(I),VPOSICAOFRASE,2);
                          VPOSICAOFRASE := LENGTH(TEXTO(I)) +100;
                  ELSE
          -- VAI PARA A PROXIMA POSICAO NA STRING TEXTO(I)
                      VPOSICAOFRASE := VPOSICAOFRASE + 1;
                  END IF;

        END LOOP;

    BEGIN
       -- FAZER O UPDATE DO CAMPO DE NOITES AQUI
        UPDATE PRODTUR_PRT SET PRT_NUMERONOITE = TO_NUMBER(NOITE)
        WHERE PRT_CDTIPOPROD = TIPO(I) AND PRT_CDPRODUTO = CODI(I);

                    -- LIMPANDO AS VARIAVEIS
                    NOITE := '';
                    VPOSICAOFRASE := 1;

    EXCEPTION WHEN INVALID_NUMBER THEN
        -- UPDATE COM O PRIMEIRO VALOR POIS O SEGUNDO É LIXO
        NOITE := SUBSTR(NOITE,1,1);

        UPDATE PRODTUR_PRT SET PRT_NUMERONOITE = TO_NUMBER(NOITE)
        WHERE PRT_CDTIPOPROD = TIPO(I) AND PRT_CDPRODUTO = CODI(I);

        NOITE := '';
                    VPOSICAOFRASE := 1;

     WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE ('NAO FOI POSSIVEL ALTERAR PRODUTO
==>'||TEXTO(I));
    END;

  END LOOP;
 END;
 /


--------------------------------------------------------------------------------
Na Oi Internet você ganha ou ganha. Além de acesso grátis com
qualidade, você pode ter contas ilimitadas de email com 1 giga cada uma,
suporte grátis e muito mais. Baixe grátis o Discador Oi em
http://www.oi.com.br/discador e comece a ganhar.

Agora, se o seu negócio é voar alto na internet,
assine Oi Internet Banda Larga e ganhe o modem grátis. Clique em
http://www.oi.com.br/bandalarga e aproveite essa moleza!


Responder a