oracle - transaction - Número de filas afectadas por una ACTUALIZACIÓN en PL/SQL
sql server rowcount (6)
Por favor, pruebe este..
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;
--------------------------------------------------------
El resultado será como a continuación:
2 clientes actualizados por 1
ningún cliente con 2 val_cli.
ningún cliente con 3 val_cli.
1 cliente actualizado para 4
ningún cliente con 5 val_cli.
1 cliente actualizado para 6
ningún cliente con 7 val_cli.
ningún cliente con 8 val_cli.
ningún cliente con 9 val_cli.
1 cliente actualizado para 10
Número de líneas totales afectadas operación de actualización: 5
Tengo una función PL / SQL (ejecutándose en Oracle 10g) en la que actualizo algunas filas. ¿Hay alguna manera de averiguar cuántas filas se vieron afectadas por la ACTUALIZACIÓN? Al ejecutar la consulta manualmente, me dice cuántas filas se vieron afectadas, quiero obtener ese número en PL / SQL.
Para aquellos que quieren los resultados de un comando simple, la solución podría ser:
begin
DBMS_OUTPUT.PUT_LINE(TO_Char(SQL%ROWCOUNT)||'' rows affected.'');
end;
El problema básico es que SQL% ROWCOUNT es una variable (o función) PL / SQL y no se puede acceder directamente desde un comando SQL. Al usar un bloque PL / SQL noname, esto se puede lograr.
... Si alguien tiene una solución para usarlo en un comando SELECCIONAR, estaría interesado.
Use la función analítica Count (*) OVER PARTITION BY NULL Esto contará el número total de filas
alternativamente, SQL%ROWCOUNT
puede usar esto dentro del procedimiento sin necesidad de declarar una variable
SQL%ROWCOUNT
también se puede usar sin estar asignado (al menos desde Oracle 11g ).
Mientras no se haya realizado ninguna operación (actualizaciones, eliminaciones o inserciones) dentro del bloque actual, SQL%ROWCOUNT
se establece en nulo. Luego se queda con el número de líneas afectadas por la última operación DML:
decir que tenemos mesa CLIENTE
create table client (
val_cli integer
,status varchar2(10)
)
/
Lo probaríamos de esta manera:
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;
Resultando en:
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
sql%rowcount
variable sql%rowcount
.
Debe llamarlo directamente después de la declaración para la que necesita encontrar el recuento de filas afectadas.
Por ejemplo:
DECLARE
i number;
BEGIN
UPDATE employees
SET status = ''fired''
WHERE name like ''%Bloggs'';
i := sql%rowcount;
END;