编写关联vehicles、distances外键表的存储过程查询容量字段求助
现有代码问题汇总
- 参数设计不符合需求:你的需求仅需要传入
source_town、source_state、dest_town、dest_state4个入参,现有代码额外多定义了l_capacity、s_capacity两个参数,且未区分参数的IN/OUT模式,Oracle存储过程参数默认是IN类型,无法用于返回查询结果。 - 查询逻辑缺少过滤条件:WHERE子句仅关联了两张表的主键外键,没有加入入参匹配行程出发地、目的地的过滤规则,会返回全量的车辆+行程组合,不符合查询要求。
- 单行返回逻辑不适用场景:
SELECT INTO语法仅支持返回单行查询结果,符合条件的车辆大概率存在多条,该写法遇到多行结果时会直接抛出TOO_MANY_ROWS异常,无匹配结果时会抛出NO_DATA_FOUND异常。 - 语法不完整:现有存储过程缺少
END关键字闭合,且隐式表连接写法可读性差,推荐替换为显式JOIN语法。
修正后可运行方案
以下存储过程通过SYS_REFCURSOR游标返回所有符合条件的车辆的行李容量、载客容量,支持多行结果返回:
create or replace procedure availabe_ride ( -- 4个入参:出发城镇、出发州、目的城镇、目的州 p_source_town IN varchar2, p_source_state IN varchar2, p_dest_town IN varchar2, p_dest_state IN varchar2, -- 出参:返回查询结果集的游标 p_result OUT SYS_REFCURSOR ) IS BEGIN OPEN p_result FOR SELECT v.luggage_capacity, v.seating_capacity FROM vehicles v INNER JOIN distances d ON v.vehicles_id = d.vehicles_id WHERE d.source_town = p_source_town AND d.source_state = p_source_state AND d.dest_town = p_dest_town AND d.dest_state = p_dest_state; EXCEPTION -- 可按需扩展异常处理逻辑 WHEN OTHERS THEN RAISE; END availabe_ride; /
调用示例
-- 声明变量接收结果 DECLARE v_result SYS_REFCURSOR; v_luggage_capacity NUMBER; v_seating_capacity NUMBER; BEGIN -- 传入你的查询条件,示例为查询从北京 北京到上海 上海的可用车辆 availabe_ride('北京','北京','上海','上海', v_result); -- 循环遍历结果 LOOP FETCH v_result INTO v_luggage_capacity, v_seating_capacity; EXIT WHEN v_result%NOTFOUND; DBMS_OUTPUT.PUT_LINE('行李容量:'||v_luggage_capacity||',载客容量:'||v_seating_capacity); END LOOP; CLOSE v_result; END; /
内容的提问来源于stack exchange,提问作者byungho lee
相关产品推荐
相关产品推荐

