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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 09:32:36