2009-05-14 13 views
124

Ich habe eine PL/SQL-Funktion (läuft auf Oracle 10g), in der ich einige Zeilen aktualisiere. Gibt es eine Möglichkeit herauszufinden, wie viele Zeilen vom UPDATE betroffen waren? Wenn ich die Abfrage manuell ausführe, sagt sie mir, wie viele Zeilen betroffen waren, möchte ich diese Nummer in PL/SQL bekommen.Anzahl der von einem UPDATE in PL/SQL betroffenen Zeilen

Antwort

194

Sie verwenden die Variable sql%rowcount.

Sie müssen es direkt nach der Anweisung aufrufen, für die Sie die betroffene Zeilenanzahl suchen müssen.

Zum Beispiel:

DECLARE 
    i number; 
BEGIN 
    UPDATE employees 
    SET status = 'fired' 
    WHERE name like '%Bloggs'; 
    i := sql%rowcount; 
END; 
6

alternativ SQL%ROWCOUNT Sie können dies, ohne dass innerhalb der Prozedur eine Variable

+3

SQL% ROWCOUNT ist eine Funktion, können Sie nicht nur „sie verwenden“ - Sie müssen * bis * etwas mit ihm - ob in einer Variablen gespeichert oder als Eingabe an eine andere Prozedur gesendet oder zu etwas anderem hinzugefügt wird. –

+7

Ich denke, dass Ali H's Punkt ist, dass es nicht notwendig ist, es einer Variablen zuzuweisen, bis Sie eine andere SQL-Anweisung haben, die die Zeilenanzahl beeinflussen würde. Abgesehen davon stimme ich zu, dass es einer Variablen zugewiesen werden sollte, um zu vermeiden, dass später ein Fehler auftritt, falls jemand eine andere SQL-Anweisung hinzufügt, bevor er aufgerufen wird. Und diese Antwort von Ali H sollte ein Kommentar zu Clives Antwort sein und nicht als separate Antwort gepostet werden. – Kirby

18

Für diejenigen, die die Ergebnisse aus einem einfachen Befehl wollen erklären, die Lösung könnte sein:

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

Das Grundproblem besteht darin, dass SQL% ROWCOUNT ist eine PL/SQL-Variable (oder Funktion), und kann nicht sein, dir direkt von einem SQL-Befehl zugegriffen. Dies kann erreicht werden, indem ein nicht-gleicher PL/SQL-Block verwendet wird.

... Wenn jemand eine Lösung hat, um es in einem SELECT-Befehl zu verwenden, würde mich das interessieren.

-3

Mit dem Count (*) analytische Funktion OVER PARTITION BY NULL Dies wird die Gesamtanzahl der Zeilen

+0

Nach dem Ausführen der update-Anweisung, wenn Sie die Anzahl der tatsächlich aktualisierten Daten überprüfen - Dies gibt keine generische Lösung. Zum Beispiel, wenn meine Tabelle T eine Spalte c1 hat, die "1" als Wert für alle enthält und jetzt alle Zeilen für diese Spalte auf "2" aktualisiere, wie hilft die Partitionierung durch null? – nanosoft

1

SQL%ROWCOUNT kann auch ohne zugeordnet ist (zumindest aus 11g Oracle) verwendet werden, zählen.

Solange keine Operation (Aktualisierungen, Löschungen oder Einfügungen) innerhalb des aktuellen Blocks ausgeführt wurde, wird SQL%ROWCOUNT auf Null gesetzt. Dann bleibt es mit der Anzahl der Linie durch die letzte DML Operation betroffen:

sagen, wir haben Tabelle CLIENT

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

Wir testen es auf diese Weise:

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; 

Resultierend in:

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 
0

Bitte versuchen Sie diese ein ..


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; 

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

Ergebnis wie unten sein wird:


2 Client aktualisiert 1
kein Client mit 2 val_cli.
kein Client mit 3 val_cli.
1 Client aktualisiert für 4
kein Client mit 5 val_cli.
1 Client aktualisiert für 6
kein Client mit 7 val_cli.
kein Client mit 8 val_cli.
kein Client mit 9 val_cli.
1-Client für 10
Anzahl der Gesamtzeilen betroffenen Aktualisierungsvorgang aktualisiert: 5


+0

Können Sie Ihre Nachricht richtig formatieren? –

Verwandte Themen