PL/SQL 中受 UPDATE 影响的行数

我有一个 PL/SQL 函数(运行在 Oracle 10g 上) ,其中我更新了一些行。有没有办法查明有多少行受到了更新的影响?当手动执行查询时,它会告诉我有多少行受到影响,我希望在 PL/SQL 中得到这个数字。

395908 次浏览

使用 sql%rowcount变量。

您需要在需要查找受影响的行数的语句之后直接调用它。

例如:

set serveroutput ON;
DECLARE
i NUMBER;
BEGIN
UPDATE employees
SET    status = 'fired'
WHERE  name LIKE '%Bloggs';
i := SQL%rowcount;
--note that assignment has to precede COMMIT
COMMIT;
dbms_output.Put_line(i);
END;

或者 SQL%ROWCOUNT 您可以在过程中使用它,而不需要声明变量

对于那些希望从普通命令得到结果的人来说,解决方案可以是:

begin
DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||' rows affected.');
end;

基本问题是 SQL% ROWCOUNT 是一个 PL/SQL 变量(或函数) ,不能从 SQL 命令直接访问。通过使用非名称 PL/SQL 块,可以实现这一点。

... 如果有人有在 SELECT 命令中使用它的解决方案,我会很感兴趣。

在分区上使用 Count (*)解析函数 这将计算行的总数 #

也可以使用 SQL%ROWCOUNT而不被分配(至少从 神谕11g)。

只要当前块中没有执行任何操作(更新、删除或插入) ,SQL%ROWCOUNT就被设置为 null。然后,它与受最后一个 DML 操作影响的行数保持一致:

假设我们有桌子客户

create table client (
val_cli integer
,status varchar2(10)
)
/

我们可以这样测试:

begin
dbms_output.put_line('Value when entering the block:'||sql%rowcount);


insert into client
select 1, 'void' from dual
union all select 4, 'void' from dual
union all select 1, 'void' from dual
union all select 6, 'void' from dual
union all select 10, 'void' from dual;
dbms_output.put_line('Number of lines affected by previous DML operation:'||sql%rowcount);


for val in 1..10
loop
update client set status = 'updated' where val_cli = val;
if sql%rowcount = 0 then
dbms_output.put_line('no client with '||val||' val_cli.');
elsif sql%rowcount = 1 then
dbms_output.put_line(sql%rowcount||' client updated for '||val);
else -- >1
dbms_output.put_line(sql%rowcount||' clients updated for '||val);
end if;
end loop;
end;

结果:

Value when entering the block:
Number of lines affected by previous DML operation:5
2 clients updated for 1
no client with 2 val_cli.
no client with 3 val_cli.
1 client updated for 4
no client with 5 val_cli.
1 client updated for 6
no client with 7 val_cli.
no client with 8 val_cli.
no client with 9 val_cli.
1 client updated for 10

请试试这个。


create table client (
val_cli integer
,status varchar2(10)
);


---------------------
begin
insert into client
select 1, 'void' from dual
union all
select 4, 'void' from dual
union all
select 1, 'void' from dual
union all
select 6, 'void' from dual
union all
select 10, 'void' from dual;
end;


---------------------
select * from client;


---------------------
declare
counter integer := 0;
begin
for val in 1..10
loop
update client set status = 'updated' where val_cli = val;
if sql%rowcount = 0 then
dbms_output.put_line('no client with '||val||' val_cli.');
else
dbms_output.put_line(sql%rowcount||' client updated for '||val);
counter := counter + sql%rowcount;
end if;
end loop;
dbms_output.put_line('Number of total lines affected update operation: '||counter);
end;


---------------------
select * from client;


--------------------------------------------------------

结果如下:


2个客户端更新为1
没有具有2 val _ cli 的客户端。
没有具有3 val _ cli 的客户端。
1个客户端更新为4个
没有具有5 val _ cli 的客户端。
1个客户端更新为6个
没有具有7 val _ cli 的客户端。
没有具有8 val _ cli 的客户端。
没有具有9 val _ cli 的客户端。
1个客户端更新为10个
受影响的更新操作总行数: 5