Pular para o conteúdo
Visualizando 2 posts - 1 até 2 (de 2 do total)
  • Autor
    Posts
  • #106550
    Avatar de EdineiEdinei
    Participante

      Tenho um campo que são inseridos cores de produtos e o separador é o ENTER. Na tabela estas cores são gravadas da seguinte forma “VR/LEAT/MRVRD MILI/VRPTO/VERMPRETO/VERDEPRETO/CINZAPRETO/AZULCINZA/VERMCINZA/CINZACINZA/AZULBCO/PRETOBCO/CINZABCO/BRANCOAZUL/PRETOAZUL/AZULAZ RBK/BCOAZ RBK/AZULPRETOPRETO/PRETO”(FIGURA 1). Gostaria de saber uma forma ou alguma função do oracle 11 de consultar estes dados e armazenar em colunas separadas.

      Attachments:
      #106556
      Avatar de rmanrman
      Participante

        @Edinei

        A solução é em PL/SQL


        CREATE OR REPLACE TYPE NT_VARCHAR2 IS TABLE OF VARCHAR2(1024);

        -- FUNCTION FLIST_VALUES_TO_NT_VARCHAR2

        CREATE OR REPLACE FUNCTION FLIST_VALUES_TO_NT_VARCHAR2(PLIST_VALUES IN VARCHAR2
        ,PSEPARATOR VARCHAR2) RETURN NT_VARCHAR2 IS
        VNT_VARCHAR2 NT_VARCHAR2 := NT_VARCHAR2();
        VLIST_VALUES VARCHAR2(4000) := PLIST_VALUES;
        VVALUE VARCHAR2(4000);
        VTOTAL_SEPARATOR NUMBER := 0;
        VTOTAL_SEPARATOR_TEMP NUMBER := 0;
        BEGIN
        IF VLIST_VALUES IS NOT NULL
        THEN
        -- conta a qtde. de caracteres "," existentes na var VLIST_VALUES
        FOR I IN 1 .. LENGTH(VLIST_VALUES)
        LOOP
        IF SUBSTR(VLIST_VALUES
        ,I
        ,1) = PSEPARATOR
        THEN
        VTOTAL_SEPARATOR := VTOTAL_SEPARATOR + 1;
        END IF;
        END LOOP;

            -- verifica se existe apenas 1 valor em VLIST_VALUES e grava o valor no array VNT_VARCHAR2
            --IF REGEXP_COUNT(VLIST_VALUES,PSEPARATOR) = 0 THEN
            IF VTOTAL_SEPARATOR = 0
            THEN
                VNT_VARCHAR2.EXTEND;
                VNT_VARCHAR2(1) := TRIM(V => VLIST_VALUES);
            ELSE
                -- percorre todos os valores contidos na string VLIST_VALUES
                --FOR i IN 1..REGEXP_COUNT(VLIST_VALUES,PSEPARATOR)
                FOR I IN 1 .. VTOTAL_SEPARATOR
                LOOP
                    -- recupera primeiro valor do array
                    VVALUE := SUBSTR(VLIST_VALUES
                                         ,1
                                         ,INSTR(VLIST_VALUES
                                                 ,PSEPARATOR) - 1);
        
                    -- atualiza array excluindo valor recuperado anteriormente
                    VLIST_VALUES := SUBSTR(VLIST_VALUES
                                                 ,INSTR(VLIST_VALUES
                                                         ,PSEPARATOR) + 1);
        
                    -- Grava valor no objeto array VNT_VARCHAR2
                    VNT_VARCHAR2.EXTEND;
                    VNT_VARCHAR2(I) := TRIM(V => VVALUE);
        
                    -- conta a qtde. de caracteres "," existentes na var VLIST_VALUES
                    VTOTAL_SEPARATOR_TEMP := 0;
                    FOR I IN 1 .. LENGTH(VLIST_VALUES)
                    LOOP
                        IF SUBSTR(VLIST_VALUES
                                    ,I
                                    ,1) = PSEPARATOR
                        THEN
                            VTOTAL_SEPARATOR_TEMP := VTOTAL_SEPARATOR_TEMP + 1;
                        END IF;
                    END LOOP;
        
                    -- Grava último valor existente em VLIST_VALUES no objeto array VNT_VARCHAR2
                    IF VTOTAL_SEPARATOR_TEMP = 0
                    THEN
                        VNT_VARCHAR2.EXTEND;
                        VNT_VARCHAR2(I + 1) := TRIM(V => VLIST_VALUES);
                    END IF;
                END LOOP;
            END IF;
        END IF;
        
        RETURN VNT_VARCHAR2;
        

        END FLIST_VALUES_TO_NT_VARCHAR2;

        Exemplo de uso:


        DECLARE
        VCOLORS VARCHAR2(1024);
        VNT_EMAIL_TO NT_VARCHAR2;
        VSEPARATOR VARCHAR2(1);
        BEGIN
        VCOLORS := 'red,yellow,blue,black,white';
        VSEPARATOR := ',';
        VNT_COLOR := PKG_GUARD_UTIL.FLIST_VALUES_TO_NT_VARCHAR2(PLIST_VALUES => VCOLORS ,PSEPARATOR => VSEPARATOR);

        IF VNT_COLOR.COUNT > 0 THEN
            FOR I IN VNT_COLOR.FIRST .. VNT_COLOR.LAST
            LOOP
                INSERT INTO COLORS(ID,COLOR) VALUES(I,VNT_COLOR(I));
            END LOOP;                                                                                
            COMMIT;
        END IF;     
        

        END;

        Basicamente é isso talvez você terá que utilizar um cursor para fazer em massa.

        Verifique como está codificado o ENTER, pode estar dessas 2 formas:


        VSEPARATOR := CHR(13) || CHR(10);


        VSEPARATOR := CHR(10) || CHR(13);

      Visualizando 2 posts - 1 até 2 (de 2 do total)
      • Você deve fazer login para responder a este tópico.
      plugins premium WordPress