如何基于指定SQL在Oracle中创建getShipmentDays存储过程?
创建getShipmentDays存储过程的解决方案
我来帮你搞定这个存储过程!其实逻辑一点都不复杂,核心就是把你传入的三个参数用在查询里,其中dateSend直接返回你传入的时间值(毕竟数据库里没这个字段,用参数填充就行)。
下面先给你MySQL的实现代码,如果你用的是SQL Server,我也会附上对应的写法:
MySQL版本存储过程
DELIMITER // CREATE PROCEDURE getShipmentDays( IN p_senderPostindex VARCHAR(10), -- 发件邮编参数 IN p_recipientPostindex VARCHAR(10), -- 收件邮编参数 IN p_dateSend DATETIME -- 传入的dateSend时间参数 ) BEGIN -- 查询并返回指定字段,p_dateSend直接作为dateSend列的值返回 SELECT p_dateSend AS dateSend, t.senderPostindex, t.recipientPostindex, d.shipment_days FROM TABLE t INNER JOIN shipment_days d ON d.first_index = t.senderPostindex -- 这里我修正了你原SQL里的笔误,原写的是t.senderIndex,应该是senderPostindex吧? AND d.second_index = t.recipientPostindex WHERE t.senderPostindex = p_senderPostindex AND t.recipientPostindex = p_recipientPostindex; END // DELIMITER ;
关键细节说明
- 参数名加
p_前缀是为了和表字段区分,避免混淆; p_dateSend AS dateSend就是直接把传入的时间参数作为返回结果里的dateSend字段,完美解决你说的“数据库无该字段”的问题;DELIMITER //是MySQL的特殊语法,用来临时改变语句分隔符,避免存储过程里的分号提前结束定义。
调用存储过程
完全按照你要求的格式调用就行:
CALL getShipmentDays('01001', '02031', '2020/05/09 15:40:00');
调用后会返回你需要的结果集,和示例一致:
| dateSend | senderPostindex | recipientPostindex | shipment_days |
|---|---|---|---|
| 2020-05-09 15:40:00 | 01001 | 02031 | 5 |
SQL Server版本写法
如果用的是SQL Server,语法稍有不同,不需要修改分隔符:
CREATE PROCEDURE getShipmentDays @senderPostindex VARCHAR(10), @recipientPostindex VARCHAR(10), @dateSend DATETIME AS BEGIN SELECT @dateSend AS dateSend, t.senderPostindex, t.recipientPostindex, d.shipment_days FROM TABLE t INNER JOIN shipment_days d ON d.first_index = t.senderPostindex AND d.second_index = t.recipientPostindex WHERE t.senderPostindex = @senderPostindex AND t.recipientPostindex = @recipientPostindex; END
调用时用:
EXEC getShipmentDays '01001', '02031', '2020/05/09 15:40:00';
小提示
如果调用后没返回结果,检查这几点:
- 确认你的
TABLE表(这个表名太通用了,记得改成实际表名)里有匹配的邮编记录; - 核对
shipment_days表的关联字段first_index、second_index确实和主表的邮编字段对应; - 参数类型要和表字段一致,比如邮编如果是数字类型,就把参数改成
INT。
内容的提问来源于stack exchange,提问作者German Varanytsya
相关产品推荐
相关产品推荐

