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

SELECT INSTR(LISCONTEST , chr(10), 1) FROM TGFPRO WHERE CODPROD = 35288
Ulysses Ribeiro

Ulysses Ribeiro

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

Luiz Santos

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


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
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar