Fórum Dúvida: PL/SQL - Fazer a leitura de um campo com quebra de linhas #563331
29/09/2016
0
Eu tenho um produto X que está cadastrado na tabela de PRODUTOS que tem o campo SUPERFICIE que é uma lista de cores .
Exemplo da informação contida nesse campo:
NU
NU + AM
NU + AZ CL
NU + AZ ESC
NU + BR
NU + CZ
NU + MR
NU + VD
NU + VL
NU + VM
NU + PT
FLASH PRATA
FP + AM
FP + AZ CL
FP + AZ ESC
FP + BR
FP + CZ
FP + MR
FP + VD
FP + VL
FP + VM
FP + PT
Agora eu tenho que fazer um INSERT desse produto X na tabela de CUSTO onde para cada linha do campo SUPERFICIE ele deve inserir o valor do produto, exemplo
ID | CODPROD | SUPERFICIE | VALOR
1 | X | NU | 10,00
2 | X | NU + AM | 10,00
3 | X | NU + AZ CL | 10,00
4 | X | NU + AZ ESC | 10,00
5 | X | NU + BR | 10,00
6 | X | FP + CZ | 10,00
7 | X | FP + MR | 10,00
8 | X | FP + VD | 10,00
Não sei como vou fazer a leitura desse campo SUPERFICIE e pegar cada linha dele e alimentar a tabela de custo como vários registro do mesmo produto.
Eu fiz alguns teste usando o INSTR, mas não consegui progredir
SELECT INSTR(LISCONTEST , chr(10), 1) FROM TGFPRO WHERE CODPROD = 35288
Ulysses Ribeiro
Curtir tópico
+ 0Post mais votado
29/09/2016
Da uma olhada nessa função aqui, regexp_substr .
Ela só funciona em versões 10G ou superiores, talvez te atenda.
Grande abraço
Luiz Fernando
Luiz Santos
Gostei + 2
Mais Posts
04/10/2016
Ulysses Ribeiro
Da uma olhada nessa função aqui, regexp_substr .
Ela só funciona em versões 10G ou superiores, talvez te atenda.
Grande abraço
Luiz Fernando
Obrigado Luiz, foi de grande ajuda, depois de algum tempo pesquisando, estudando e tentando cheguei ao resultado esperado com a seguinte solução:
--Loop para pegar a lista de cores do produto
FOR C IN 1..70 LOOP
SELECT REGEXP_SUBSTR(LISCONTEST || CHR(10), '(\\S*)(\\s)', 1, C), --SELECIONA A PALAVRA DE ACORDO COM A POSIÇÃO EX.: 1º PALAVRA
LENGTH (REGEXP_SUBSTR(LISCONTEST || CHR(10), '(\\S*)(\\s)', 1, C)) --RETORNA A QUANTIDADE DE CARACTERES NA PALAVRA SELECIONADA ACIMA
INTO P_SUPERFICIE, P_QTD
FROM TGFPRO
WHERE CODPROD = R.CODPROD;
--Obs.: Como a última cor não estava sendo inserida devido não ter quebra de linha, fiz essa contatenação acrescentand no final a quebra de linha.
--Se palavra selecionada não for vazia
IF P_SUPERFICIE IS NOT NULL THEN
--Verifica se o último caractere é quebra de linha
IF SUBSTR(P_SUPERFICIE, P_QTD,1) = chr(10) THEN
--Controle recebe ele mesmo + superficie
P_CONTROLE := P_CONTROLE || P_SUPERFICIE;
--Busca o último registro na tabela
SELECT NVL(MAX(ID), 0) + 1 INTO P_ID FROM AD_TESTECUSTO;
--Inseri na tabela teste
INSERT INTO AD_TESTECUSTO
(ID,
CODPROD,
CONTROLE,
CUSTO)
VALUES
(P_ID,
R.CODPROD,
P_CONTROLE,
5.75);
--Limpo o parametro controle
P_CONTROLE := NULL;
ELSE
--controle recebe ele mesmo + superficie
P_CONTROLE := P_CONTROLE || P_SUPERFICIE;
END IF;
END IF;
END LOOP;Gostei + 0
04/10/2016
Luiz Santos
Fico feliz que tenha conseguido ajudar.
E parabéns por publicar seu código aqui.
Tenho certeza que vai ajudar muita gente com o mesmo problema.
Grande abraço
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)