Número de filas afectadas por un UPDATE en PL / SQL
-
21-08-2019 - |
Pregunta
Tengo una función PL / SQL (que se ejecuta en Oracle 10g) en la que puedo actualizar algunas filas. ¿Hay una manera de saber cuántas filas se vieron afectados por la actualización? Al ejecutar la consulta manualmente me dice cómo se vieron afectadas muchas filas, quiero llegar a ese número en PL / SQL.
Solución
Se utiliza el sql%rowcount
variable.
Es necesario llamar directamente después de la declaración que se necesita para encontrar la fila afectada por contar.
Por ejemplo:
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;
Otros consejos
Para los que quieren los resultados de un comando sencillo, 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 PL / SQL (o función), y no se puede acceder directamente desde un comando SQL. Mediante el uso de un PL bloque noname / SQL, esto se puede lograr.
... Si alguien tiene una solución para usarlo en un comando SELECT, yo estaría interesado.
alternativamente, SQL%ROWCOUNT
puede utilizar esta dentro del procedimiento sin necesidad de declarar una variable
SQL%ROWCOUNT
también se puede utilizar sin ser asignado (al menos desde Oracle 11g ).
Mientras no operación (actualizaciones, elimina o inserciones) se ha realizado dentro del bloque actual, <=> se establece en NULL. A continuación, se queda con el número de la línea afectada por la última operación DML:
decir que tenemos la tabla CLIENTE
create table client (
val_cli integer
,status varchar2(10)
)
/
nos gustaría probar 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;
El resultado es:
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
Por favor, intente éste ..
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 cliente actualiza para 1 |
ningún cliente con 2 val_cli.
ningún cliente con 3 val_cli.
1 cliente actualiza para 4
ningún cliente con 5 val_cli.
1 cliente actualiza 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 actualiza durante 10
Número total de líneas afectadas operación de actualización: 5
Utilice la cuenta (*) función analítica MÁS DE REPARTO POR NULL Este contará el # total de filas