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

