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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top