2016-05-19 32 views
0
CREATE DEFINER=`root`@`localhost` PROCEDURE `GenerateCharges2`() 
BEGIN 
Declare sumFunding LONG; 
Declare done INT DEFAULT FALSE; 
Declare invoiceCharge LONG; 
Declare agencyID INT; 
declare invoiceID int; 
Declare fundingID INT; 
Declare amountOfFunding LONG; 
Declare getInvoiceData CURSOR For select invoices.idInvoices, invoices.idAgencies, invoices.InvoiceAmount, fundings.FundingBalance, fundings.idfundings from invoices 
inner join agencies on invoices.idAgencies = agencies.idAgencies 
inner join fundings on agencies.idAgencies = fundings.IdAgencies 
where processed =0 
group by invoices.idInvoices; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 


open getInvoicedata; 
ze_loop: Loop 
Fetch getInvoiceData into invoiceID, agencyID, invoiceCharge, amountOfFunding, fundingID; 
if done then leave ze_loop; 
end if; 
if amountOfFunding > invoiceCharge then 
insert into charges VALUES (invoiceCharge, invoiceID, fundingID); 
end if; 
end loop; 
close getInvoiceData; 
END 

我的问题是,如果你要插入一个select语句,它会运行一个适当的时间。但是,插入语句仅对示例数据插入一次。在任何情况下,amnountOfFunding总是比invoiceCharge大。期望的结果是所有插入都发生在获取的行上。MySQL:程序循环,但只能插入一次

+0

您考虑过['INSERT ... SELECT'](https://dev.mysql.com/doc/en/insert-select.html)吗? – eggyal

+0

我对你最后两句话感到困惑,为什么不去掉两个值之间的比较呢? – Uueerdo

+0

从来没有听说过。 MySQL/SQL新手。我会在哪里发表这个声明? – DefaultDefault

回答

0

我有这个循环,并插入我需要的每个记录!也许你可以修改或更新你的循环!

DECLARE done INT DEFAULT FALSE ; 
    DECLARE l_local_formato_retail_codigo, 
    l_producto_sku, 
    l_producto_descripcion_sra, 
    l_producto_marca, 
    l_producto_categoria VARCHAR (100) ; 
    DECLARE l_precio DECIMAL (20, 7) DEFAULT 0 ; 
    DECLARE l_un_1 INT (20) DEFAULT 0 ; 
    DECLARE l_un_2 INT (20) DEFAULT 0 ; 
    DECLARE l_clp_1 DECIMAL (20, 7) DEFAULT 0 ; 
    DECLARE l_clp_2 DECIMAL (20, 7) DEFAULT 0 ; 
    DECLARE contador INT DEFAULT 0 ; 
    DECLARE valores CURSOR FOR 
    SELECT 
    local_formato_retail_codigo, 
    producto_sku, 
    producto_descripcion_sra, 
    producto_marca, 
    producto_categoria 
    FROM 
    base_comercial 
    WHERE mes_fecha = fecha 
    GROUP BY producto_sku, 
    local_formato_retail_codigo 
    ORDER BY local_formato_retail_codigo ASC, 
    producto_sku ASC ; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE ; 
    TRUNCATE precio_cd ; 
    OPEN valores ; 
    read_loop : 
    LOOP 
    FETCH valores INTO l_local_formato_retail_codigo, 
    l_producto_sku, 
    l_producto_descripcion_sra, 
    l_producto_marca, 
    l_producto_categoria ; 
    IF done 
    THEN LEAVE read_loop ; 
    END IF ; 
    SET l_clp_1 = 
    (SELECT 
     ROUND(SUM(sellout_clp), 7) 
    FROM 
     base_comercial 
    WHERE anno = DATE_FORMAT(fecha, '%Y') 
     AND mes = DATE_FORMAT(fecha, '%c') 
     AND local_formato_retail_codigo = l_local_formato_retail_codigo 
     AND producto_sku = l_producto_sku) ; 
    SET l_clp_2 = 
    (SELECT 
     ROUND(SUM(sellout_clp), 7) 
    FROM 
     base_comercial 
    WHERE anno = DATE_FORMAT(
     DATE_ADD(fecha, INTERVAL - 1 MONTH), 
     '%Y' 
    ) 
     AND mes = DATE_FORMAT(
     DATE_ADD(fecha, INTERVAL - 1 MONTH), 
     '%c' 
    ) 
     AND local_formato_retail_codigo = l_local_formato_retail_codigo 
     AND producto_sku = l_producto_sku) ; 
    SET l_un_1 = 
    (SELECT 
     SUM(sellout_un) 
    FROM 
     base_comercial 
    WHERE anno = DATE_FORMAT(fecha, '%Y') 
     AND mes = DATE_FORMAT(fecha, '%c') 
     AND local_formato_retail_codigo = l_local_formato_retail_codigo 
     AND producto_sku = l_producto_sku) ; 
    SET l_un_2 = 
    (SELECT 
     SUM(sellout_un) 
    FROM 
     base_comercial 
    WHERE anno = DATE_FORMAT(
     DATE_ADD(fecha, INTERVAL - 1 MONTH), 
     '%Y' 
    ) 
     AND mes = DATE_FORMAT(
     DATE_ADD(fecha, INTERVAL - 1 MONTH), 
     '%c' 
    ) 
     AND local_formato_retail_codigo = l_local_formato_retail_codigo 
     AND producto_sku = l_producto_sku) ; 
    IF (ISNULL(l_clp_1)) 
    THEN SET l_clp_1 = 0 ; 
    END IF ; 
    IF (ISNULL(l_clp_2)) 
    THEN SET l_clp_2 = 0 ; 
    END IF ; 
    IF (ISNULL(l_un_1)) 
    THEN SET l_un_1 = 0 ; 
    END IF ; 
    IF (ISNULL(l_un_2)) 
    THEN SET l_un_2 = 0 ; 
    END IF ; 
    SET l_precio = ((l_clp_1 + l_clp_2)/(l_un_1 + l_un_2)) ; 
    IF (ISNULL(l_precio)) 
    THEN SET l_precio = 0 ; 
    END IF ; 
    INSERT INTO precio_cd 
    VALUES 
     (
     l_local_formato_retail_codigo, 
     l_producto_sku, 
     l_producto_descripcion_sra, 
     l_producto_marca, 
     l_producto_categoria, 
     l_precio 
    ) ; 
    END LOOP read_loop ; 
    CLOSE valores ; 
    SELECT 
    * 
    FROM 
    precio_cd ; 
+0

我试过了,它仍然给我一个问题。我想说我的代码有问题。不过谢谢你! – DefaultDefault

+0

我认为你需要关闭你的循环。 END LOOP ze_loop; –

+0

仍然没有做到。我认为别的东西是关闭的。虽然谢谢! – DefaultDefault