Trước hết, bạn thường không sử dụng DBMS_OUTPUT
để ghi nhật ký. Nói chung sẽ có ý nghĩa hơn nhiều khi ghi dữ liệu vào bảng nhật ký, đặc biệt nếu quy trình ghi nhật ký của bạn được xác định là một giao dịch tự trị để bạn có thể theo dõi dữ liệu nhật ký trong khi thủ tục đang chạy. DBMS_OUTPUT
sẽ chỉ được hiển thị sau khi toàn bộ quy trình đã hoàn tất thực thi, tại thời điểm đó, nó thường hơi vô nghĩa.
Liên quan đến điểm đầu tiên đó, dựa vào DBMS_OUTPUT
để cho người gọi biết rằng đã có một số loại ngoại lệ là một thực hành rất kém. Ở mức tối thiểu, bạn muốn nâng cao lại ngoại lệ đã được ném để bạn có được ngăn xếp lỗi nhằm gỡ lỗi sự cố.
Thứ hai, khi bạn bật đầu ra, bạn phải chỉ định kích thước của bộ đệm DBMS_OUTPUT
có thể viết thư cho. Có vẻ như bạn đã khai báo bộ đệm là 20.000 byte, đây là giá trị mặc định nếu bạn chỉ
SQL> set serveroutput on;
Bạn có thể thay đổi điều đó bằng cách chỉ định kích thước nhưng kích thước tối đa được giới hạn ở 1.000.000 byte
SQL> set serveroutput on size 1000000;
Nếu bạn có kế hoạch cập nhật 3 tỷ hàng trong khối 1000 hàng, đó sẽ là bộ đệm quá nhỏ. Bạn sẽ tạo ra hơn 60 lần lượng dữ liệu đó với mã hiện tại của mình. Nếu bạn đang sử dụng 10.2 cả trên máy khách và máy chủ, bạn sẽ có thể cấp phát bộ đệm không giới hạn
SQL> set serveroutput on size unlimited;
nhưng đó không phải là một tùy chọn trong các bản phát hành trước đó.
Cuối cùng, bạn có chắc chắn rằng bạn cần sử dụng PL / SQL ngay từ đầu không? Có vẻ như bạn có thể làm điều này hiệu quả hơn bằng cách thực hiện một CẬP NHẬT duy nhất
UPDATE table_
SET id = floor( seq/ 10000000000000 )
WHERE id is null;
Đó là mã ít hơn nhiều, dễ đọc hơn nhiều và sẽ hiệu quả hơn so với giải pháp thay thế PL / SQL. Nhược điểm duy nhất là nó yêu cầu không gian bảng UNDO của bạn đủ lớn để chứa UNDO được tạo nhưng việc cập nhật một cột đơn từ NULL thành giá trị số không phải NULL sẽ không tạo ra nhiều UNDO như vậy.