2012-06-14 37 views
9

Có cách nào trong Oracle để xác định xem gói có trạng thái hay không trạng thái không? Tôi không biết bất kỳ chế độ xem nào trong từ điển dữ liệu chứa thông tin đó.Có cách nào để xác định xem một gói có trạng thái trong Oracle không?

Lỗi "ORA-04068: hiện trạng của gói chuỗi đã bị hủy" là khá khó chịu. Nó có thể được loại bỏ bằng cách loại bỏ các biến gói từ gói. 11g giới thiệu tính năng là một gói với các biến được tất cả các hằng số biên dịch thời gian sẽ được coi là không trạng thái.

Tôi có thể có hai phiên và biên dịch gói trong một và gọi nó trong khác và xem nếu nó ném một ngoại lệ, nhưng điều đó đòi hỏi phải gọi một thủ tục trong gói, có thể không được mong muốn.

+1

Trước khi tôi trả lời, bạn có thể giải thích lý do tại sao bạn muốn biết? Không cố gắng để là một nỗi đau, chỉ cần cố gắng để hiểu chính xác những gì bạn muốn làm. Tại sao điều quan trọng là bạn phải biết liệu gói có trạng thái không? Ngoài ra, bạn chỉ quan tâm đến việc biết nếu một gói có nhà nước, và do đó có thể, tại một số điểm gặp phải ORA-4068? Hoặc, đối với một gói trạng thái, bạn có muốn biết liệu trạng thái hiện tại của gói có hợp lệ, không hợp lệ hoặc không được khởi tạo không? –

+3

Gói trạng thái có thể gây phiền toái vì nếu có thay đổi trong khi có phiên mở, điều này có thể khiến người dùng gặp lỗi. Tôi có vấn đề này với một gói, mà tôi đã tái cấu trúc để làm cho không trạng thái và gặp một số rắc rối (đó sẽ là chủ đề của một câu hỏi SO tương lai), vì vậy sẽ rất dễ dàng để biết liệu gói đó là không trạng thái hay không phải. Ngoài ra, các gói khác trong cơ sở dữ liệu là stateful và cũng có thể có khả năng gây ra vấn đề này. – eaolson

Trả lời

11

Có vẻ như những gì bạn muốn là có thể liệt kê tất cả các gói có khả năng có trạng thái.

Điều bạn đang tìm kiếm chỉ là các gói có bất kỳ biến hoặc hằng số chung nào. Đối với một gói duy nhất, điều này khá đơn giản bằng cách kiểm tra. Để tìm kiếm trên tất cả các gói trong một lược đồ, tuy nhiên, bạn có thể sử dụng PL/Phạm vi:

Đầu tiên, đăng nhập là chủ sở hữu lược đồ, bật PL/Phạm vi trong phiên của bạn:

alter session set plscope_settings='IDENTIFIERS:ALL'; 

Sau đó, biên dịch lại tất cả các cơ quan gói của bạn.

Sau đó, chạy truy vấn này để tìm tất cả các biến và hằng số tuyên bố ở cấp gói:

select object_name AS package, 
     type, 
     name AS variable_name 
from user_identifiers 
where object_type IN ('PACKAGE','PACKAGE BODY') 
and usage = 'DECLARATION' 
and type in ('VARIABLE','CONSTANT') 
and usage_context_id in (
    select usage_id 
    from user_identifiers 
    where type = 'PACKAGE' 
); 

tôi muốn đề nghị danh sách kết quả của gói sẽ là mục tiêu của bạn.

Nếu bạn đang ở trên 11gR2, hằng không còn gây ra vấn đề này, vì vậy bạn muốn sử dụng truy vấn này để thay thế:

select object_name AS package, 
     type, 
     name AS variable_name 
from user_identifiers 
where object_type IN ('PACKAGE','PACKAGE BODY') 
and usage = 'DECLARATION' 
and type = 'VARIABLE' 
and usage_context_id in (
    select usage_id 
    from user_identifiers 
    where type = 'PACKAGE' 
); 
+0

Đó không phải là những gì tôi đang tìm kiếm. Trong 11g, các gói có tất cả các biến gói 'CONSTANT' được coi là không trạng thái, nhưng truy vấn của bạn sẽ trả lại chúng. – eaolson

+0

eaolson, điều đó không hoàn toàn chính xác. Trong 11gR1, hằng số * làm * làm cho gói có trạng thái; điều này đã được sửa trong 11gR2. Tôi đã chỉnh sửa câu hỏi để lưu ý điều này. –

+0

Yup, tính năng này hoạt động! – eaolson

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