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
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;
alternativ SQL%ROWCOUNT
Sie können dies, ohne dass innerhalb der Prozedur eine Variable
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.
Mit dem Count (*) analytische Funktion OVER PARTITION BY NULL Dies wird die Gesamtanzahl der Zeilen
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
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
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
Können Sie Ihre Nachricht richtig formatieren? –
- 1. Gibt die Anzahl der von UPDATE-Anweisungen betroffenen Zeilen zurück
- 2. prüft Anzahl der betroffenen Zeilen in CodeIgniter
- 3. KSH-Update: Get betroffenen Zeilen
- 4. Überprüfen, ob Update-Abfrage betroffenen Zeilen perl
- 5. Warum ist die Anzahl der betroffenen Zeilen falsch?
- 6. Wie bekomme ich die Anzahl der betroffenen Zeilen in sqlalchemy?
- 7. Anzahl der betroffenen Zeilen der SQL-Tabelle abrufen
- 8. C# - SELECT-Abfrage Anzahl der betroffenen Zeilen ist immer -1
- 9. Berechnung Anzahl der Wörter in einem String in plsql
- 10. Gibt die Anzahl der Zeilen zurück, die von der SQL UPDATE-Anweisung in Java betroffen sind
- 11. SQL Update-Befehl nicht funktioniert, betroffenen Zeilen 0 zurück
- 12. Variable, die die Anzahl der vom vorherigen DELETE betroffenen Zeilen enthält? (in einer Funktion)
- 13. Graf Anzahl der Zeilen in einem RDD
- 14. Wählen Sie die letzten betroffenen Zeilen
- 15. Anzahl der Zeilen, die von einem UPDATE in PostgreSQL betroffen sind
- 16. Update-Abfrage für n Anzahl oder Zeilen
- 17. ‚Ungültige Update: ungültige Anzahl von Zeilen in Abschnitt 0
- 18. Update Apex-Tabellenform mit PLSQL
- 19. Ermitteln der Anzahl der Zeilen in einem Textfeld in VBA
- 20. Oracle Wie Gesamtzahl der Zeilen in einem plsql Block eingefügt zählen
- 21. mehrere Zeilen einfügen in plsql ora 01427
- 22. Problem mit der Anzahl der Zeilen in einem Dataset
- 23. Anzahl der Zeilen in csv.DictReader
- 24. PHPMyAdmin CSV LOAD DATA betroffenen Zeilen zeigt nicht
- 25. Log betroffenen Zeilen in eine andere Tabelle in MySQL
- 26. DataFrames.jl Anzahl der Zeilen
- 27. vor INSERT oder Update-Trigger plsql
- 28. Anzahl der Zeilen im Code
- 29. Propel: Wie die aus DoUpdate zurückgegebenen "betroffenen Zeilen" definiert sind
- 30. Anzahl der von sqlite zurückgegebenen Zeilen begrenzen
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. –
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