Eilių, paveiktų UPDATE, skaičius PL / SQL

Turiu PL / SQL funkciją (veikia „Oracle 10g“), kurioje atnaujinu kai kurias eilutes. Ar yra būdas sužinoti, kiek eilučių paveikė UPDATE? Vykdydamas užklausą rankiniu būdu, jis man pasakoja, kiek eilučių buvo paveikta, noriu gauti šį numerį PL / SQL.

123
14 мая '09 в 10:21 2009-05-14 10:21 Thomas Lötzer paklausė gegužės 14 d., 09:21, 2009-05-14 10:21
@ 5 atsakymai

Jūs naudojate kintamąjį sql%rowcount .

Jūs turite jį skambinti iškart po pareiškimo, kad reikia surasti eilių skaičių.

Pavyzdžiui:

 DECLARE i number; BEGIN UPDATE employees SET status = 'fired' WHERE name like '%Bloggs'; i := sql%rowcount; END; 
191
14 мая '09 в 10:33 2009-05-14 10:33 Atsakymą pateikė Clive , gegužės 14 d., 09:33, 2009-05-14 10:33

Tiems, kurie nori gauti rezultatus iš paprastos komandos, sprendimas gali būti:

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

Pagrindinė problema yra ta, kad SQL% ROWCOUNT yra PL / SQL kintamasis (arba funkcija) ir negali būti tiesiogiai pasiekiamas iš SQL komandos. Naudojant noname PL / SQL bloką, tai galima pasiekti.

... Jei kas nors nuspręstų jį naudoti komandoje SELECT, man būtų įdomu.

18
03 сент. Atsakymas suteiktas CLS 03 Sep. 2014-09-03 10:55 '14 at 10:55 2014-09-03 10:55

SQL%ROWCOUNT galite jį naudoti procedūroje, nereikalaudami kintamojo

6
06 авг. atsakymas pateikiamas Ali H 06 rug. 2012-08-06 17:03 '12, 17:03, 2012-08-06 17:03

SQL%ROWCOUNT taip pat gali būti naudojamas be priskyrimo (bent jau iš Oracle 11g).

Tol, kol dabartiniame bloke nebuvo atlikta (atnaujinta, ištrinta ar įterpta) operacija, SQL%ROWCOUNT yra nulinis. Tada jis lieka su eilėmis, kurias paveikė paskutinė DML operacija:

Tarkime, mes turime stalą KLIENTAS

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

Mes jį patikrinsime taip:

 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; 

Rezultatas:

 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
15 сент. atsakymą pateikė J. Chomel 15 sep . 2016-09-15 18:18 '16 at 18:18 2016-09-15 18:18

Naudokite analitinę funkciją Count (*) OVER PARTITION pagal NULL Tai skaičiuoja bendrą eilių skaičių.

-3
03 мая '15 в 3:50 2015-05-03 03:50 svečio atsakymas 03 gegužės 15 d. 3:50 2015-05-03 03:50

Kiti klausimai apie „ žymes arba Užduoti klausimą