Mam funkcję PL / SQL (działającą na Oracle 10g), w której aktualizuję niektóre wiersze. Czy istnieje sposób, aby dowiedzieć się, na ile wierszy wpłynęła aktualizacja? Podczas ręcznego wykonywania zapytania informuje mnie, ile wierszy zostało dotkniętych, chcę uzyskać tę liczbę w PL / SQL.
oracle
plsql
sql-update
Thomas Lötzer
źródło
źródło
INSERT INTO
...COMMIT
a także w tej samej procedurze po wstawieniuUPDATE SET WHERE EXISTS..COMMIT
, ale mojai := SQL%rowcount;
zwraca wszystkie wiersze zamiast tylko zaktualizowanych wierszy. Co może być?Dla tych, którzy chcą wyników z prostego polecenia, rozwiązaniem może być:
Podstawowym problemem jest to, że SQL% ROWCOUNT jest zmienną (lub funkcją) PL / SQL i nie można uzyskać do niej bezpośredniego dostępu z polecenia SQL. Można to osiągnąć używając bloku noname PL / SQL.
... Jeśli ktoś ma rozwiązanie, aby użyć go w poleceniu SELECT, byłbym zainteresowany.
źródło
alternatywnie
SQL%ROWCOUNT
możesz użyć tego w procedurze bez konieczności deklarowania zmiennejźródło
SQL%ROWCOUNT
może być również używany bez przypisania (przynajmniej z Oracle 11g ).Dopóki żadna operacja (aktualizacje, usuwanie lub wstawianie) nie została wykonana w bieżącym bloku,
SQL%ROWCOUNT
ma wartość null. Następnie pozostaje z liczbą linii, na które wpłynęła ostatnia operacja DML:powiedz, że mamy tabeli KLIENTA
Testowalibyśmy to w ten sposób:
Wynik:
źródło
2 klient zaktualizowany dla 1
brak klienta z 2 val_cli.
brak klienta z 3 val_cli.
1 klient zaktualizowany dla 4
bez klienta z 5 val_cli.
1 klient zaktualizowany dla 6
bez klienta z 7 val_cli.
brak klienta z 8 val_cli.
brak klienta z 9 val_cli.
1 klient zaktualizowany dla 10
Liczba wszystkich linii, których dotyczy operacja aktualizacji: 5
źródło
Użyj funkcji analitycznej Count (*) OVER PARTITION BY NULL Spowoduje to policzenie łącznej liczby wierszy
źródło