You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写关联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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 10:15:07