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

我写的PLSQL异常处理代码无法通过HackerRank测试用例,该如何调整?

代码问题排查及修复方案

核心问题点

  • 未对查询的部门ID排序:你通过select distinct e.dept_id from EMP e获取的部门ID顺序是随机的,HackerRank测试用例默认要求按部门ID升序输出,顺序不匹配会直接判定错误
  • 异常处理覆盖不全:仅处理了NO_DATA_FOUND异常,题目明确说明未遵循SQL完整性约束,DEPT表可能存在同DEPT_ID重复记录,此时单行SELECT INTO会触发TOO_MANY_ROWS异常,未处理该异常会导致程序中断
  • 多余的EXIT指令:部分自动化测试环境执行完PLSQL块后不需要执行EXIT退出命令,该指令可能会导致脚本执行状态异常
  • 未兼容DEPT_ID为NULL的场景:EMP表中DEPT_ID可能为NULL,若测试用例要求明确标识NULL值,现有代码直接输出会出现空白内容不符合要求

修复后代码

SET SERVEROUTPUT ON
DECLARE
    l_dept_name dept.dept_name%type;
BEGIN
    -- 增加ORDER BY保证输出顺序和测试用例一致
    FOR cur_r IN (SELECT DISTINCT e.dept_id FROM EMP e ORDER BY e.dept_id)
    LOOP
        BEGIN
            -- 使用聚合函数避免DEPT表重复DEPT_ID触发TOO_MANY_ROWS异常
            SELECT MAX(d.dept_name) INTO l_dept_name 
            FROM DEPT d 
            WHERE d.dept_id = cur_r.dept_id;
            
            IF l_dept_name IS NOT NULL THEN
                DBMS_OUTPUT.PUT_LINE('Dept ID: '|| NVL(TO_CHAR(cur_r.dept_id), 'NULL') ||' is '|| l_dept_name);
            ELSE
                DBMS_OUTPUT.PUT_LINE('Dept ID: '|| NVL(TO_CHAR(cur_r.dept_id), 'NULL') ||' is not a valid ID');
            END IF;
        -- 仍保留异常兜底兼容极端场景
        EXCEPTION
            WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE('Dept ID: '|| NVL(TO_CHAR(cur_r.dept_id), 'NULL') ||' is not a valid ID');
        END;
    END LOOP;
END;
/

内容的提问来源于stack exchange,提问作者Abhijit Biswas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 03:15:10