Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zbieranie zbiorcze za pomocą aktualizacji

Problem polega na tym, że próbujesz pobrać po zatwierdzeniu.

Po otwarciu My_Data_Cur z for update klauzula, Oracle musi zablokować każdy wiersz w My_Data_1 tabeli, zanim zwróci jakiekolwiek wiersze. Kiedy commit , Oracle musi zwolnić wszystkie te blokady (blokady tworzone przez Oracle nie obejmują transakcji). Ponieważ kursor nie ma już żądanych blokad, Oracle musi zamknąć kursor, ponieważ nie może już spełniać wymagań for update klauzula. Dlatego drugie pobieranie musi zwrócić 0 wierszy.

Najbardziej logicznym podejściem byłoby prawie zawsze usunięcie commit i zrób wszystko w jednej transakcji. Jeśli naprawdę, naprawdę, naprawdę potrzebujesz oddzielnych transakcji, musiałbyś otwierać i zamykać kursor dla każdej iteracji pętli. Najprawdopodobniej chciałbyś zrobić coś, aby ograniczyć kursor do zwracania tylko 100 wierszy za każdym razem, gdy jest otwierany (tj. rownum <= 100 klauzuli), aby nie ponosić kosztów odwiedzania każdego wiersza w celu umieszczenia blokady, a następnie każdego wiersza innego niż 100, który został przetworzony i usunięty, aby zwolnić blokadę za każdym razem w pętli.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PLS-00201:należy zadeklarować identyfikator UTIL_FILE

  2. Testowanie funkcji Oracle to_date

  3. Odejmowanie 30 lat od bieżącej daty w Oracle SQL

  4. Obsługa wyjątków procedur zagnieżdżonych Pl/SQL

  5. Pokaż czas ostatniego dostępu do tabeli w Oracle DB