PL/SQL DELETE_EMPLOYEE存储过程测试未全部通过,请求排查代码问题
PL/SQL存储过程测试用例未全过?帮你找出问题啦
首先先理清楚你的需求背景:你需要写一个名为DELETE_EMPLOYEE的PL/SQL存储过程,接收部门名称作为输入,删除该部门下所有员工记录,显示删除条数;如果没有找到对应部门,要抛出自定义的DeptNotFoundException异常,打印No Records found.。已知Employee表结构和测试数据,而且数据区分大小写,PL/SQL块要用/终止。
你写的代码思路没问题,但有两个细节没注意到,导致测试用例只通过了一个:
问题1:异常提示文本不符合要求
需求里明确要求抛出异常时打印**No Records found.**(注意末尾的found是小写开头),但你的代码里输出的是'No Records Found.'(Found大写开头)。很多测试用例会严格校验输出文本的大小写和拼写,这肯定会导致其中一个测试用例失败。
问题2:计数逻辑存在并发风险(也可能导致测试数据不一致)
你先执行select count(dept)获取该部门的员工数,然后再执行delete操作。这种写法在多用户同时操作表的场景下,两步之间可能有其他会话新增或删除了该部门的员工,导致你统计的temp值和实际删除的行数不一致。而且其实PL/SQL提供了更准确的方式——SQL%ROWCOUNT,它能直接返回上一条DML语句(这里就是delete)影响的行数,完全不需要额外的查询。
修正后的代码
set serveroutput on; create or replace PROCEDURE DELETE_EMPLOYEE(v_dept IN EMPLOYEE.dept%TYPE) is DEPTNOTFOUNDEXCEPTION Exception; begin -- 先执行删除操作 delete from EMPLOYEE where dept = v_dept; -- 用SQL%ROWCOUNT获取实际删除的行数 if SQL%ROWCOUNT >= 1 then dbms_output.put_line(SQL%ROWCOUNT || ' Employee record(s) got deleted.'); else raise DEPTNOTFOUNDEXCEPTION; end if; exception when DEPTNOTFOUNDEXCEPTION then -- 修正提示文本的大小写,和需求一致 dbms_output.put_line('No Records found.'); end; /
为啥这样改?
- 去掉了多余的
temp变量,用SQL%ROWCOUNT直接获取删除行数,既避免了并发场景下的计数错误,也让代码更简洁高效 - 修正了异常提示文本的大小写,完全符合需求要求
- 逻辑流程更合理:先执行删除,再判断是否有记录被删除,直接对应需求的业务逻辑
内容的提问来源于stack exchange,提问作者user16783803
相关产品推荐
相关产品推荐

