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

Procedura Przepełnienie bufora

Po pierwsze, normalnie nie używałbyś DBMS_OUTPUT do logowania. Ogólnie rzecz biorąc, znacznie bardziej sensowne byłoby zapisywanie danych w tabeli dziennika, szczególnie jeśli procedura rejestrowania została zdefiniowana jako transakcja autonomiczna, dzięki czemu można monitorować dane dziennika podczas działania procedury. DBMS_OUTPUT zostanie wyświetlony dopiero po zakończeniu wykonywania całej procedury, w którym to momencie jest to ogólnie trochę bezcelowe.

Powiązane z tym pierwszym punktem, opierając się na DBMS_OUTPUT wskazanie dzwoniącemu, że zaistniał jakiś wyjątek, jest bardzo kiepską praktyką. Co najmniej chcesz ponownie zgłosić wyjątek, który został zgłoszony, aby uzyskać stos błędów w celu debugowania problemu.

Po drugie, kiedy włączasz wyjście, musisz określić rozmiar bufora, który DBMS_OUTPUT może pisać. Wygląda na to, że zadeklarowałeś bufor na 20 000 bajtów, co jest wartością domyślną, jeśli po prostu

SQL> set serveroutput on;

Możesz to zmienić, określając rozmiar, ale maksymalny rozmiar jest ograniczony do 1 000 000 bajtów

SQL> set serveroutput on size 1000000;

Jeśli planujesz aktualizować 3 miliardy wierszy w kawałkach 1000 wierszy, będzie to zbyt mały bufor. Za pomocą obecnego kodu wygenerujesz ponad 60 razy więcej danych. Jeśli używasz 10.2 zarówno na kliencie, jak i na serwerze, powinieneś być w stanie przydzielić nieograniczony bufor

SQL> set serveroutput on size unlimited;

ale to nie jest opcja we wcześniejszych wersjach.

Wreszcie, czy jesteś pewien, że w pierwszej kolejności musisz uciec się do PL/SQL? Wygląda na to, że możesz to zrobić wydajniej, po prostu wykonując pojedynczą AKTUALIZACJĘ

UPDATE table_
   SET id = floor( seq/ 10000000000000 )
 WHERE id is null;

To znacznie mniej kodu, dużo łatwiejsze do odczytania i będzie wydajniejsze niż alternatywa PL/SQL. Jedyną wadą jest to, że wymaga to, aby obszar tabel UNDO był wystarczająco duży, aby pomieścić generowane polecenie UNDO, ale aktualizacja pojedynczej kolumny z wartości NULL do wartości liczbowej innej niż NULL nie powinna generować tak dużej liczby operacji UNDO.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaka jest różnica między ROWNUM a ROW_NUMBER w bazie danych Oracle?

  2. Mieszanie instrukcji DDL i DML w jednym skrypcie

  3. Zapytanie SQL do rozwiązania przechodnich zależności w bazie danych

  4. Jakie role i uprawnienia należy nadać użytkownikowi w celu wykonania CRUD(na Oracle 12)

  5. Anonimowy typ TABLE lub VARRAY w Oracle