我有一个PL / SQL过程,用于删除与具有NULL值的字段相对应的记录。可以通过以下查询来实现。
set serveroutput on;
begin
dbms_output.put_line('Execution started');
for rec in (
select name from employee where emp_id is null
and location = 'SITE_A'
)
loop
delete from employeedetails@sitea where name = rec.name;
dbms_output.put_line('name '|| rec.name ||' deleted');
end loop;
dbms_output.put_line('Execution completed');
end;
/
set serveroutput off;
我正在从一个数据库运行for循环查询,并使用数据库链接删除另一个数据库( sitea )中的记录。
我需要添加一个条件,例如,如果name=rec.name
不返回任何要删除的记录,那么dbms_output.put_line('No records to be deleted');
有没有一种舒适的方法来实现它?
答案 0 :(得分:3)
您可以使用sql%rowcount
implicit cursor attribute来查看DML语句影响了多少行;跨数据库链接以及本地均可使用:
if sql%rowcount = 0 then
dbms_output.put_line('No records to be deleted');
else
dbms_output.put_line('name '|| rec.name ||' deleted');
end if;
您也可以将其包括在消息中:
if sql%rowcount = 0 then
dbms_output.put_line('name '|| rec.name ||': no records to be deleted');
else
dbms_output.put_line('name '|| rec.name ||': '|| sql%rowcount ||' record(s) deleted');
end if;
然后您会看到类似的内容:
Execution started
name B: 1 record(s) deleted
name C: no records to be deleted
Execution completed
PL/SQL procedure successfully completed.
由于name
可能不是唯一的,因此在循环中您可能会遇到两次相同的值;在这种情况下,第一个删除将找到多个行,第二个删除将找不到任何行。您可以通过在光标查询中添加distinct
来避免第二个问题。
如果您不想看到删除和删除了哪些名称,则可以使用更简单的单次删除,没有循环或PL / SQL,但无论如何这似乎是一个练习...