- Este tópico contém 1 resposta, 2 vozes e foi atualizado pela última vez 10 anos, 7 meses atrás por rman.
-
AutorPosts
-
17 de abril de 2014 às 8:56 pm #106550EdineiParticipante
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:22 de abril de 2014 às 5:26 pm #106556rmanParticipante@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);
-
AutorPosts
- Você deve fazer login para responder a este tópico.