2011-02-10 39 views
9

Trong khi soạn thảo một gói, tôi chạy vào một thông báo lỗi:PLS-00123: Chương trình quá lớn (Diana nút) trong khi cố gắng để biên dịch một gói

Error: PLS-00123: program too large (Diana nodes) 
Line: 1 

Các gói phần mềm trong câu hỏi có khoảng 1k dòng (spec) + 13k dòng trong cơ thể. Trong khi nghiên cứu về điều này, tôi đã xem qua this Ask Tom question

Khi biên dịch một đơn vị PL/SQL, trình biên dịch xây dựng một cây phân tích cú pháp. Kích thước tối đa của đơn vị PL/SQL là được xác định bởi kích thước của phân tích cú pháp cây. Số lượng tối đa các nút diana tồn tại trong cây này.

Lên đến 7.3, bạn có thể có 2**14 (16K) nút diana, và từ 8,0 đến 8.1.3, nút 2**15 (32K) diana được phép. Với 8.1.3, giới hạn này đã được thư giãn để bây giờ bạn có thể có các nút diana 2**26 (tức là 64M) trong số này cây cho các thân thể gói và loại.

Trong khi không có cách nào dễ dàng để dịch các giới hạn về dòng mã nguồn, nó đã được quan sát của chúng tôi rằng đã có khoảng 5 đến 10 nút trên mỗi dòng của mã nguồn. Trước 8.1.3, trình biên dịch có thể biên dịch một cách rõ ràng tới khoảng 3.000 dòng mã.
Bắt đầu với 8.1.3, giới hạn là thoải mái cho thân gói và loại các vật thể hiện có thể có khoảng xấp xỉ 6.000.000 mã vạch .

Đây là ước tính sơ bộ. Nếu mã của bạn có nhiều khoảng trắng, dài số nhận dạng, v.v., bạn có thể kết thúc với mã nguồn lớn hơn mã này.

Bây giờ ngay cả khi bạn đi vào xem xét danh sách cuối cùng về nhiều không gian & định danh lớn, tôi nghĩ rằng đó là hợp lý để kết luận rằng nó không có nơi đóng hạn quy trên.

Hơn nữa,

Làm thế nào để kiểm tra kích thước hiện tại của một gói:

Để kiểm tra kích thước của một gói, các số liên quan gần nhất bạn có thể sử dụng là PARSED_SIZE trong từ điển dữ liệu xem USER_OBJECT_SIZE. Giá trị này cung cấp kích thước của DIANA theo số byte như được lưu trữ trong các bảng SYS.IDL_xxx$ và KHÔNG phải là kích thước trong hồ bơi được chia sẻ .

[...]

Ví dụ, bạn có thể bắt đầu vấn đề trải qua với một giới hạn 64K khi PARSED_SIZE trong USER_OBJECT_SIZE là không quá 50K.

Truy vấn chế độ xem này là kết quả của 48929 - vì vậy tôi cho rằng kích thước của nó là 47k?

Phần lạ là tìm nạp cùng một đối tượng từ lược đồ khác và chạy nó trong khu vực tôi đang gặp phải các kết quả về sự cố trong quá trình biên dịch thành công.

Vậy tại sao khu vực cụ thể này lại gây ra sự cố?

+1

Tôi biết đó là một cảnh quay dài, nhưng đối mặt với vấn đề này, tôi cần hỏi: các dòng của bạn rất, rất lớn? –

+1

Chúng, không có nghĩa là rất, rất lớn – Sathya

Trả lời

5

Chương trình bạn biên dịch mã của bạn có thêm thông tin gỡ lỗi không? Rõ ràng nó làm cho sự khác biệt minh họa trên this forum post.

Sự cố khi thực hiện biên dịch cho gỡ lỗi là mã bổ sung được thêm để gỡ lỗi.

Bạn có thể thử các truy vấn này để xem:

ALTER PACKAGE debug COMPILE; 
SELECT type, source_size, parsed_size, code_size 
FROM user_object_size 
WHERE name = 'DEBUG'; 

ALTER PACKAGE debug COMPILE DEBUG; 
SELECT type, source_size, parsed_size, code_size 
FROM user_object_size 
WHERE name = 'DEBUG'; 

Quan sát sự khác biệt trong code_size khi bạn biên dịch cho debug.

Nếu bạn đang biên dịch bằng DEBUG, hãy cố gắng biên dịch bình thường để không tạo thêm mã có thể gây ra lỗi của bạn.

+0

+1 Cảm ơn bạn đã hướng tôi đến liên kết này. – Sathya

Các vấn đề liên quan