Liczba wierszy, których dotyczy aktualizacja w PL / SQL

Mam funkcję PL / SQL (działającą na Oracle 10g) w której aktualizuję kilka wierszy. Czy istnieje sposób, aby dowiedzieć się, ile wierszy zostało dotkniętych aktualizacją? Podczas wykonywania zapytania ręcznie mówi mi, ile wierszy zostało dotkniętych, chcę uzyskać ten numer w PL / SQL.

Author: linuxbuild, 2009-05-14

6 answers

Używasz zmiennej sql%rowcount.

Musisz wywołać go bezpośrednio po instrukcji, dla której musisz znaleźć liczbę wierszy.

Na przykład:

DECLARE
    i number;
BEGIN
    UPDATE employees
    SET status = 'fired'
    WHERE name like '%Bloggs';
    i := sql%rowcount;
END;
 209
Author: Clive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-08 22:22:32

Dla tych, którzy chcą uzyskać wyniki ze zwykłego polecenia, rozwiązaniem może być:

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

Podstawowy problem polega na tym, że SQL%ROWCOUNT jest zmienną PL / SQL( lub funkcją) i nie można uzyskać dostępu bezpośrednio z polecenia SQL. Używając bloku noname PL / SQL można to osiągnąć.

... Jeśli ktoś ma rozwiązanie, aby użyć go w poleceniu SELECT, byłbym zainteresowany.

 20
Author: CLS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-03 07:55:20

Alternatywnie, SQL%ROWCOUNT można tego użyć w ramach procedury bez potrzeby deklarowania zmiennej

 6
Author: Ali H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 14:03:38

SQL%ROWCOUNT może być również używany bez przypisania (przynajmniej z Oracle 11g).

Tak długo, jak żadna operacja (aktualizacje, usuwanie lub wstawianie) nie została wykonana w bieżącym bloku, SQL%ROWCOUNT jest ustawiona na null. Następnie pozostaje z numerem linii, na którą wpłynęła ostatnia operacja DML:

powiedzmy, że mamy klienta tabeli

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

testowalibyśmy to w ten sposób:

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;

w wyniku:

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
Author: J. Chomel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-15 15:18:28
Proszę spróbować tego..

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;

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

Wynik będzie taki jak poniżej:


2 klient zaktualizowany dla 1
brak klienta z 2 val_cli.
brak klienta z 3 val_cli.
1 klient zaktualizowany dla 4
brak klienta z 5 val_cli.
1 klient zaktualizowany dla 6
brak klienta z 7 val_cli.
brak klienta z 8 val_cli.
no client with 9 val_cli.
1 klient zaktualizowany dla 10
Liczba wszystkich linii, których dotyczy operacja aktualizacji: 5


 -1
Author: Arun Sundriyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-23 16:17:18

Użyj funkcji analitycznej Count (*) nad partycją przez NULL To zliczy całkowitą liczbę # wierszy

 -3
Author: guest,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-03 00:50:55