Dúvida: PL/SQL - Fazer a leitura de um campo com quebra de linhas
29/09/2016
0
Olá pessoal!
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
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
+ 0
Responder
Post mais votado
29/09/2016
Boa noite Ulysses.
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
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
Responder
Mais Posts
04/10/2016
Ulysses Ribeiro
Boa noite Ulysses.
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
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;
Responder
04/10/2016
Luiz Santos
Bom dia Ulysses.
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
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
Responder
Clique aqui para fazer login e interagir na Comunidade :)