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.