web-dev-qa-db-fra.com

Nombre de lignes affectées par un UPDATE en PL / SQL

J'ai une fonction PL/SQL (s'exécutant sur Oracle 10g) dans laquelle je mets à jour certaines lignes. Existe-t-il un moyen de savoir combien de lignes ont été affectées par UPDATE? Lors de l'exécution manuelle de la requête, il me dit combien de lignes ont été affectées. Je souhaite obtenir ce nombre en PL/SQL.

151
Thomas Lötzer

Vous utilisez la variable sql%rowcount.

Vous devez l'appeler directement après l'instruction pour laquelle vous devez rechercher le nombre de lignes affectées.

Par exemple:

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; 
228
Clive

Pour ceux qui veulent les résultats d'une commande en clair, la solution pourrait être:

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

Le problème de base est que SQL% ROWCOUNT est une variable PL/SQL (ou une fonction), et qu’on ne peut y accéder directement à partir d’une commande SQL. En utilisant un bloc noname PL/SQL, cela peut être réalisé.

... Si quelqu'un a une solution pour l'utiliser dans une commande SELECT, je serais intéressé.

23
CLS

vous pouvez également utiliser SQL%ROWCOUNT dans la procédure sans avoir à déclarer une variable

6
Ali H

SQL%ROWCOUNT peut également être utilisé sans être affecté (au moins à partir de Oracle 11g).

Tant qu'aucune opération (mise à jour, suppression ou insertion) n'a été effectuée dans le bloc en cours, SQL%ROWCOUNT est défini sur null. Il reste ensuite le nombre de lignes affectées par la dernière opération DML:

disons que nous avons la table CLIENT

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

Nous le testerions de cette façon:

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;

résultant 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
1
J. Chomel

S'il vous plaît, essayez celui-la..


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;

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

Le résultat sera comme ci-dessous:


2 clients mis à jour pour 1
aucun client avec 2 val_cli.
aucun client avec 3 val_cli.
1 client mis à jour pour 4
aucun client avec 5 val_cli.
1 client mis à jour pour 6
aucun client avec 7 val_cli.
aucun client avec 8 val_cli.
aucun client avec 9 val_cli.
1 client mis à jour pour 10
Nombre total de lignes concernées par l'opération de mise à jour: 5


0
Arun Sundriyal