【问题标题】:Calculating a Cost Using a Stored Procedure in MYSQL在 MYSQL 中使用存储过程计算成本
【发布时间】:2014-07-10 21:33:06
【问题描述】:

我的数据库中有两个表:Package 和 Shipment。一个货件中可以有多个包裹。 (因此每个包裹都有一个唯一的 shipping_track_no)

Package(package_number, type, content, weight, shipment_track_no)

Shipment(tracking_number, sender_id, receiver_name, receiver_phone_number, method, is_delivered, shipment_date)

我想在 MYSQL 中创建一个存储过程,用于计算运输成本,并遍历运输中的包裹。

计算有几个步骤:

  • 首先,根据包的类型(1-5 枚举)对包进行估值。
  • 如果包有特殊内容(1-3 枚举),则添加额外内容。
  • 在计算每包货件的成本后,我将其添加到 共同的金额。根据发送的发送方法额外 也可以添加总和。


我使用我能找到的所有可用资源提出的代码如下。我想我弄乱了语法,但主要流程应该没问题。如果有人帮助我使用正确的语法,我将不胜感激。

DROP PROCEDURE IF EXISTS cost_of_shipment;

DELIMITER $$
CREATE PROCEDURE cost_of_shipment(IN shipment_id_fed int(11),
                                    OUT total decimal(12,2))  
BEGIN 
DROP TEMPORARY TABLE IF EXISTS temporaryTable;
CREATE TEMPORARY TABLE temporaryTable engine=memory SELECT package_number, Package.`type`, content, weight FROM Package WHERE shipment_track_no = shipment_id_fed;

DECLARE i INT(11) DEFAULT 1;

DECLARE rowCount INT(11) DEFAULT 0;
SET rowCount = (SELECT COUNT(package_number) FROM temporaryTable); 



DECLARE shipment_cost DECIMAL (12,2) DEFAULT = 0.00;


WHILE (i <= rowCount)
BEGIN

        DECLARE ipackage_number INT(11), ipackage_type INT(11), icontent INT(11), iweight DECIMAL(12,2), package_cost DECIMAL(12,2);

        SELECT ipackage_number = package_number, ipackage_type = package_type, icontent = content , iweight = weight FROM temporaryTable LIMIT 1;
        IF ipackage_type = 1 OR ipackage_type = 2 OR  ipackage_type = 3
        THEN
        SET package_cost = 10;
        END IF;

        IF ipackage_type = 4
        THEN
        SET package_cost = 15;
        END IF;

        IF ipackage_type = 5 AND iweight<20
        THEN
        SET package_cost = 20;
        END IF;

        IF ipackage_type = 5 AND iweight>20
        THEN
        SET package_cost = 20 + (iweight-20)*1;
        END IF;

        IF icontent = 2
        THEN
        SET package_cost = package_cost + 10;
        END IF;

        IF icontent = 3
        THEN
        SET package_cost = package_cost * 1.1;
        END IF;

        shipment_cost = shipment_cost + package_cost; 

        DELETE FROM temporaryTable WHERE package_number = ipackage_number;
        SET i = i  + 1
END

        IF (SELECT method FROM Shipment WHERE tracking_number = shipment_id_fed) = 2
        THEN
        SET shipment_cost = shipment_cost +10; 
        END IF;

        IF (SELECT method FROM Shipment WHERE tracking_number = shipment_id_fed) = 3
        THEN
        SET shipment_cost = shipment_cost +25; 
        END IF;

    SELECT shipment_cost INTO total FROM Shipment;
END $$
DELIMITER ;

【问题讨论】:

  • 如果您使用的是 MySQL,为什么要使用特定于 SQL Server 的构造,例如 TOP
  • 我是 SQL 的初学者,我同时使用了 SQL Server 和 MySQL,这就是为什么我真的很困惑。对于 TOP 构造: SELECT ipackage_number = package_number, ipackage_type = package_type, icontent = content , iweight = weight FROM temporaryTable LIMIT 1;我猜应该这样做。

标签: mysql loops stored-procedures syntax


【解决方案1】:

我重新设计了包裹和运输表格;为它们添加了成本属性。我处理了创建用于插入和更新包的触发器的问题。

用于计算包裹成本的插入触发器

    DELIMITER $$
    CREATE TRIGGER package_cost_insert BEFORE INSERT ON Package
    FOR EACH ROW
    BEGIN
        IF new.type = 1 OR new.type = 2 OR new.type = 3  THEN
             SET new.cost = new.cost + 10.00;
        END IF;

        IF new.type = 4  THEN
             SET new.cost = new.cost + 15.00;
        END IF;

        IF new.type = 5 AND new.weight< 20.00 THEN
             SET new.cost = new.cost + 20.00;
        END IF;

        IF new.type = 5 AND new.weight> 20.00  THEN
             SET new.cost = new.cost + 20.00 + ROUND((new.weight -20.00),0);
        END IF;

        IF new.content = 1 THEN
             SET new.cost = new.cost + 0.00;
        END IF;

        IF new.content = 2  THEN
             SET new.cost = new.cost + 10.00;
        END IF;

        IF new.content = 3  THEN
             SET new.cost = new.cost *1.1;
        END IF;
    END;
    $$

    DELIMITER ;

在更新触发器上计算包的成本

    DELIMITER $$
    CREATE TRIGGER package_cost_update BEFORE UPDATE ON Package
    FOR EACH ROW
    BEGIN
        SET new.cost = 0;
        IF new.type = 1 OR new.type = 2 OR new.type = 3  THEN
             SET new.cost = new.cost + 10.00;
        END IF;

        IF new.type = 4  THEN
             SET new.cost = new.cost + 15.00;
        END IF;

        IF new.type = 5 AND new.weight< 20.00 THEN
             SET new.cost = new.cost + 20.00;
        END IF;

        IF new.type = 5 AND new.weight> 20  THEN
             SET new.cost = new.cost + 20.00 + ROUND((new.weight -20.00),0);
        END IF;

        IF new.content = 1 THEN
             SET new.cost = new.cost + 0.00;
        END IF;

        IF new.content = 2  THEN
             SET new.cost = new.cost + 10.00;
        END IF;

        IF new.content = 3  THEN
             SET new.cost = new.cost *1.1;
        END IF;
    END;
    $$

    DELIMITER ;

在插入触发器以计算货件成本

DELIMITER $$
CREATE TRIGGER shipment_cost_insert AFTER INSERT ON Package
FOR EACH ROW
BEGIN
    UPDATE Shipment SET Shipment.`shipment_cost` = (SELECT SUM(cost) FROM Package WHERE Package.`shipment_track_no` = Shipment.`tracking_number`);
        IF (SELECT method FROM Shipment WHERE new.`shipment_track_no` = Shipment.`tracking_number`) = 1 THEN
        UPDATE Shipment SET Shipment.`shipment_cost` = Shipment.`shipment_cost` + 0.00;
    END IF;

    IF (SELECT method FROM Shipment WHERE new.`shipment_track_no` = Shipment.`tracking_number`) = 2 THEN
        UPDATE Shipment SET Shipment.`shipment_cost` = Shipment.`shipment_cost` + 10.00;
    END IF;

    IF (SELECT method FROM Shipment WHERE new.`shipment_track_no` = Shipment.`tracking_number`) = 3 THEN
        UPDATE Shipment SET Shipment.`shipment_cost` = Shipment.`shipment_cost` + 25.00;
    END IF;
END;
$$

DELIMITER ;

用于计算货件成本的更新触发器

DELIMITER $$
CREATE TRIGGER shipment_cost_update AFTER UPDATE ON Package
FOR EACH ROW
BEGIN
    UPDATE Shipment SET Shipment.`shipment_cost` = (SELECT SUM(cost) FROM Package WHERE Package.`shipment_track_no` = Shipment.`tracking_number`);

    IF (SELECT method FROM Shipment WHERE new.`shipment_track_no` = Shipment.`tracking_number`) = 1 THEN
        UPDATE Shipment SET Shipment.`shipment_cost` = Shipment.`shipment_cost` + 0.00;
    END IF;

    IF (SELECT method FROM Shipment WHERE new.`shipment_track_no` = Shipment.`tracking_number`) = 2 THEN
        UPDATE Shipment SET Shipment.`shipment_cost` = Shipment.`shipment_cost` + 10.00;
    END IF;

    IF (SELECT method FROM Shipment WHERE new.`shipment_track_no` = Shipment.`tracking_number`) = 3 THEN
        UPDATE Shipment SET Shipment.`shipment_cost` = Shipment.`shipment_cost` + 25.00;
    END IF;

END;
$$

DELIMITER ;

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多