Първо, обикновено не бихте използвали DBMS_OUTPUT
за дърводобив. Като цяло би имало много по-смислено да записвате данните в журнална таблица, особено ако вашата процедура за регистриране е дефинирана като автономна транзакция, така че да можете да наблюдавате данните от журнала, докато процедурата се изпълнява. DBMS_OUTPUT
ще се покаже едва след като цялата процедура приключи изпълнението, в който момент обикновено е донякъде безсмислено.
Свързано с тази първа точка, разчитайки на DBMS_OUTPUT
да се посочи на обаждащия се, че е имало някакво изключение, е много лоша практика. Като минимум бихте искали да повдигнете повторно изключението, което е било хвърлено, така че да получите стека за грешки, за да отстраните проблема.
Второ, когато активирате изхода, трябва да посочите размера на буфера, който DBMS_OUTPUT
може да пише на. Изглежда, че сте декларирали буфера да бъде 20 000 байта, което е по подразбиране, ако просто
SQL> set serveroutput on;
Можете да промените това, като посочите размер, но максималният размер е ограничен до 1 000 000 байта
SQL> set serveroutput on size 1000000;
Ако планирате да актуализирате 3 милиарда реда в 1000 части от редове, това ще бъде твърде малък буфер. Ще генерирате повече от 60 пъти това количество данни с текущия си код. Ако използвате 10.2 както на клиента, така и на сървъра, трябва да можете да разпределите неограничен буфер
SQL> set serveroutput on size unlimited;
но това не е опция в по-ранните версии.
И накрая, сигурни ли сте, че трябва да прибегнете до PL/SQL на първо място? Изглежда, че можете да направите това по-ефективно, като просто изпълните едно АКТУАЛИЗИРАНЕ
UPDATE table_
SET id = floor( seq/ 10000000000000 )
WHERE id is null;
Това е много по-малко код, много по-лесен за четене и ще бъде по-ефективен от PL/SQL алтернативата. Единственият недостатък е, че изисква вашето таблично пространство UNDO да е достатъчно голямо, за да поеме генерираното UNDO, но актуализирането на една колона от NULL до различна от NULL числова стойност не трябва да генерира толкова много UNDO.