update transaction example begin oracle plsql sql-update

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;