Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Islara

Problema em procedure.

Recommended Posts

Executando a consulta dos cursores, cada cursor retorna dois registros, mas somente um registro de cada cursor está sendo incluído na tabela final.

 

Abaixo segue o código da procedure;

 

DROP PROCEDURE IF EXISTS prcProcessTeste;
DELIMITER $$
CREATE PROCEDURE prcProcessTeste(OUT ptsProcesso INT)
LANGUAGE SQL
DETERMINISTIC
READS SQL DATA
SQL SECURITY INVOKER
COMMENT ''
BEGIN
DECLARE vstsProcess INT DEFAULT 0;
DECLARE vctrlProcess BIGINT(16) DEFAULT 0;
DECLARE vidOperadora BIGINT(16) DEFAULT 0;
DECLARE vfimArquivo INT DEFAULT 0;
DECLARE vidProduto INT(6) DEFAULT 0;
DECLARE vcnpj VARCHAR(14);
DECLARE vdataOperacao DATE;
DECLARE vdtaProcess DATE;
DECLARE vvalor DECIMAL(12,2);
DECLARE vFound INT DEFAULT 0;
DECLARE vContaVenda INT DEFAULT 0;
DECLARE vContaPrevisao INT DEFAULT 0;
/* Declaracao do cursor de previsao de recebimento */
/* Obtem: cnpj */
/* codigo da operadora (parametro) */
/* codigo do produto (parametro) */
/* data da operacao (dataTransOriginal) */
/* data de processamento (CURRENT_DATE()) */
/* somatorio das vendas (SUM(valorBruto)) */
/* Condicao: registro nao processado (statusProcessamento = 'N') */
DECLARE curVdas CURSOR FOR SELECT SUBSTRING(a.cnpj,2,14) cnpj,
a.dataTransOriginal AS dataOperacao,
CURRENT_DATE() AS dataProcessamento,
SUM(valorBruto) AS valor
FROM Sdx_Carga a
WHERE a.statusProcessamento = 'N'
GROUP BY
a.cnpj,
a.dataTransOriginal;
/* Declaracao do cursor de previsao de recebimento */
/* Obtem: cnpj */
/* codigo da operadora (parametro) */
/* codigo do produto (parametro) */
/* data da operacao (dataTransOriginal) */
/* data de processamento (CURRENT_DATE()) */
/* somatorio das vendas (SUM(valorOperacao)) */
/* Condicao: registro nao processado (statusProcessamento = 'N') */
DECLARE curPrev CURSOR FOR SELECT SUBSTRING(a.cnpj,2,14) cnpj,
a.dataOperacao,
CURRENT_DATE() AS dataProcessamento,
SUM(valorOperacao) AS valor
FROM Sdx_Carga a
WHERE a.statusProcessamento = 'N'
GROUP BY
a.cnpj,
a.dataOperacao;
/* tratamento de erro */
DECLARE EXIT HANDLER FOR SQLEXCEPTION SET vstsProcess = 1;
BEGIN
START TRANSACTION;
/* Obtendo o código da Operadora */
BEGIN
SELECT id
INTO vidOperadora
FROM corporativo.Operadora
WHERE UPPER(nome) LIKE 'TESTE';
END;
/* obtendo o codigo do produto */
BEGIN
SELECT idProduto
INTO vidProduto
FROM ProdutoOperadora
WHERE idOperadora = vidOperadora
AND codProdOperadora = 'TESTE';
END;
BEGIN
/* Variavel para identificar que o cursor chegou ao fim */
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vfimArquivo=1;
/* Abrindo o cursor de vendas */
OPEN curVdas;
/* executando o loop vendas */
c1_loop: LOOP
FETCH curVdas INTO vcnpj,
vdataOperacao,
vdtaProcess,
vvalor;
/* Verificando se o cursor chegou ao fim */
IF (vfimArquivo = 1) THEN
LEAVE c1_loop;
END IF;
SET vFound = 0;
/* verificando se o registro ja existe */
BEGIN
SELECT 1
INTO vFound
FROM VendasRealizadas
WHERE cnpj = vcnpj
AND idOperadora = vidOperadora
AND produto = vidProduto
AND dataOperacao = vdataOperacao;
END;
/* executando o insert */
IF vFound = 1 THEN
UPDATE VendasRealizadas
SET valor = vvalor
AND dataProcessamento = vdtaProcess
WHERE cnpj = vcnpj
AND idOperadora = vidOperadora
AND produto = vidProduto
AND dataOperacao = vdataOperacao;
ELSE
INSERT INTO VendasRealizadas (cnpj,
idOperadora,
produto,
dataOperacao,
valor,
dataProcessamento)
VALUES (vcnpj,
vidOperadora,
vidProduto,
vdataOperacao,
vvalor,
vdtaProcess);
END IF;
SET vContaVenda = vContaVenda +1;
END LOOP c1_loop;
/* Fechando o cursor curVdas */
CLOSE curVdas;
END;
SET vfimArquivo = 0;
BEGIN
/* Variavel para identificar que o cursor chegou ao fim */
DECLARE CONTINUE HANDLER FOR NOT FOUND SET vfimArquivo=1;
/* Abrindo o cursor de vendas */
OPEN curPrev;
/* executando o loop vendas */
c2_loop: LOOP
FETCH curPrev INTO vcnpj,
vdataOperacao,
vdtaProcess,
vvalor;
/* Verificando se o cursor chegou ao fim */
IF (vfimArquivo = 1) THEN
LEAVE c2_loop;
END IF;
SET vFound = 0;
/* verificando se o registro ja existe */
BEGIN
SELECT 1
INTO vFound
FROM VendasRealizadas
WHERE cnpj = vcnpj
AND idOperadora = vidOperadora
AND produto = vidProduto
AND dataOperacao = vdataOperacao;
END;
/* executando o insert */
IF vFound = 1 THEN
UPDATE PrevisaoRecebimento
SET valor = vvalor
AND dataProcessamento = vdtaProcess
WHERE cnpj = vcnpj
AND idOperadora = vidOperadora
AND produto = vidProduto
AND dataOperacao = vdataOperacao;
ELSE
INSERT INTO PrevisaoRecebimento (cnpj,
idOperadora,
produto,
dataOperacao,
valor,
dataProcessamento)
VALUES (vcnpj,
vidOperadora,
vidProduto,
vdataOperacao,
vvalor,
vdtaProcess);
END IF;
SET vContaPrevisao = vContaPrevisao + 1;
END LOOP c2_loop;
/* Fechando o cursor curVdas */
CLOSE curPrev;
END;
IF vstsProcess = 0 THEN
UPDATE Sdx_Carga
SET statusProcessamento = 'S'
WHERE statusProcessamento = 'N';
COMMIT;
ELSE
ROLLBACK;
END IF;
END;
SET ptsProcesso = vstsProcess;
END$$
DELIMITER ;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.