Islara 1 Denunciar post Postado Junho 28, 2016 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
Islara 1 Denunciar post Postado Junho 29, 2016 Consegui solucionar o problema com a utilização de Select FOUND_ROWS() e while ... Compartilhar este post Link para o post Compartilhar em outros sites