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

PL/SQL删除记录后展示已删除nr_br值的IF条件构造问题

问题根因

你写的代码拿不到被删除记录编号,核心问题有三个:

  • DELETE执行完成后,所有nr_br > 2的记录已经从branch表中移除,后续再查询branch表不可能拿到已经被删掉的记录
  • 只要删除记录数超过1条,SELECT nr_br INTO nr_branch就会触发ORA-01422报错:单行查询最多返回1条记录,单个NUMBER变量存不下多行结果
  • 隐式游标的SQL%FOUND、SQL%ROWCOUNT属性只能判断DELETE是否生效、统计被影响的总行数,根本存不了被删行的具体字段值
正确写法

Oracle的DML语句自带RETURNING子句,可以在删除操作执行的同时直接返回被删行的指定字段,配合BULK COLLECT批量存入PL/SQL集合,遍历就能输出所有被删的编号,所有逻辑都在同一个DELETE执行上下文里,不需要二次查表:

DECLARE
  -- 定义和branch表nr_br字段类型匹配的嵌套表类型,用来存批量返回的编号
  TYPE t_br_nr_list IS TABLE OF branch.nr_br%TYPE;
  v_deleted_nrs t_br_nr_list;
BEGIN
  DELETE FROM branch WHERE nr_br > 2
  -- 把所有被删行的nr_br批量收集到集合变量中
  RETURNING nr_br BULK COLLECT INTO v_deleted_nrs;

  DBMS_OUTPUT.PUT_LINE('共删除记录数:' || SQL%ROWCOUNT);

  -- 集合count大于0说明确实有记录被删,再遍历输出
  IF v_deleted_nrs.COUNT > 0 THEN
    DBMS_OUTPUT.PUT_LINE('被删除的记录编号如下:');
    FOR idx IN 1..v_deleted_nrs.LAST LOOP
      DBMS_OUTPUT.PUT_LINE(v_deleted_nrs(idx));
    END LOOP;
  END IF;
END;
/

写法说明

  • 用%TYPE定义变量类型,会自动匹配表字段的实际类型,后续表字段改类型也不需要改这段代码
  • BULK COLLECT会一次性把所有被删行的nr_br存入集合,不管删1条还是上万条都不会报错
  • 不需要额外写冗余的判断逻辑,直接通过集合的COUNT属性就能确认是否有数据被删,比SQL%FOUND更可靠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.20 16:15:48