我写的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
相关产品推荐
相关产品推荐

