Oracle PL/SQL如何检查表行数、设置if条件并执行行删除操作
PL/SQL 代码修正方案
原代码存在的问题
- 变量赋值逻辑错误:你声明的
l_temp是数值类型变量,无法使用INSERT INTO语法赋值,需要通过SELECT COUNT(*) INTO语法获取toys表的行数写入该变量 - 游标字段引用错误:FOR循环内调用游标的toy_id字段,需要使用
rw.toy_id的格式,不能直接写toy_id - 删除语句语法错误:删除条件的匹配逻辑写法错误,需要明确指定字段与游标值的等值关系
修正后的可运行代码
declare l_temp number; begin -- 获取toys表当前行数赋值给l_temp select count(*) into l_temp from toys; if l_temp > 0 then for rw in (select toy_id from( select toy_id from toys order by dbms_random.value) where rownum =1 ) loop dbms_output.put_line(rw.toy_id); delete from toys where toy_id = rw.toy_id; -- 若需要持久化修改可根据业务需求在此处添加commit语句 end loop; else dbms_output.put_line('no more toys'); end if; end; /
可选优化方案
如果你需要循环删除所有行直到表为空,可以直接简化逻辑,不需要提前计数,空游标会自动不进入循环:
declare begin for rw in (select toy_id from( select toy_id from toys order by dbms_random.value)) loop dbms_output.put_line(rw.toy_id); delete from toys where toy_id = rw.toy_id; end loop; if sql%rowcount = 0 then dbms_output.put_line('no more toys'); end if; end; /
内容的提问来源于stack exchange,提问作者GEO
相关产品推荐
相关产品推荐

