Plsql 修改PL/SQL过程的条件

Plsql 修改PL/SQL过程的条件,plsql,oracle11g,Plsql,Oracle11g,我有一个PL/SQL过程,用于删除与具有空值的字段对应的记录。我可以通过下面的查询来实现这一点 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

我有一个PL/SQL过程,用于删除与具有空值的字段对应的记录。我可以通过下面的查询来实现这一点

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\u output.put\u行(“没有要删除的记录”)


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

您可以使用
sql%rowcount
查看有多少行受到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,但这似乎是一个练习…

您可以使用
SQL%rowcount
查看有多少行受到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,但这似乎是一个练习