Plsql 修改PL/SQL过程的条件
我有一个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
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,但这似乎是一个练习