修改PL / SQL过程的条件

时间:2018-11-09 16:16:06

标签: plsql oracle11g

我有一个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');

有没有一种舒适的方法来实现它?

1 个答案:

答案 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,但无论如何这似乎是一个练习...