【发布时间】: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