2011-10-27 36 views
10

Vì vậy, tôi đã chạy một thủ tục PLSQL tốt và không biên dịch. Tôi đã thực hiện một thay đổi đối với quy trình của mình và nó vẫn biên dịch tốt, nhưng bây giờ khi tôi chạy nó, tôi nhận được lỗi này:Hiện trạng các gói đã bị hủy bỏ

ERROR at line 1: 
ORA-04068: existing state of packages has been discarded 
ORA-04061: existing state of package body "SCHEMA.XP_COVER_PAGEP" has been invalidated 
ORA-04065: not executed, altered or dropped package body "SCHEMA.XP_COVER_PAGEP" 
ORA-06508: PL/SQL: could not find program unit being called: "SCHEMA.XP_COVER_PAGEP" 
ORA-06512: at "SCHEMA.XP_ST_002180", line 141 
ORA-06512: at line 1 

Bất kỳ ý tưởng nào có thể là gì? Sự thay đổi tôi tạo ra không đáng kể đến mức tôi nghi ngờ nó có thể đã gây ra lỗi này. Cảm ơn rất nhiều về sự trợ giúp của bạn!

Trả lời

23

Khi phiên sử dụng gói có phiên giữ lại trạng thái của gói. Nếu gói đó được biên dịch lại vào lần tiếp theo cùng một phiên tham chiếu đến gói bạn sẽ nhận được lỗi đó.

Để tránh điều này, hãy đảm bảo bạn ngắt kết nối mỗi phiên có thể đã sử dụng gói hoặc yêu cầu phiên làm DBMS_SESSION.RESET_PACKAGE để đặt lại trạng thái gói.

+1

Cảm ơn darreljnz, giải pháp đã làm việc tốt cho tôi. Nhưng lúc đầu tôi không hiểu bạn đang nói gì. Vì vậy, tôi sẽ chỉ làm rõ giải pháp của bạn một chút cho người khác. Mở một cửa sổ thử nghiệm mới trong pl/sql và dán "Begin sys.dbms_session.reset_package; end;" và nhấn F9 để thực hiện nó và sau đó thực hiện thay đổi cho gói của bạn hoặc biên dịch lại gói và bây giờ chúng tôi sẽ không nhận được bất kỳ lỗi nào trong các ứng dụng của chúng tôi –

+1

Bắt đầu tốt nhất câu trả lời cho vấn đề này. Nó sẽ là tốt để xem điều này mang thêm một chút để giải thích vấn đề cốt lõi và tại sao lỗi xảy ra. –

+0

@YogeshJindal có vẻ như bạn đang nói điều gì đó khác với darrelinjz. Anh ấy viết rằng bạn cần chạy RESET_PACKAGE, trên mỗi phiên, sau khi thay đổi gói để tránh lỗi. – pauloya

4

Nếu bạn biên dịch lại thông số gói, tất cả các đối tượng phụ thuộc sẽ bị vô hiệu. Một đối tượng phụ thuộc là bất kỳ dạng xem, đặc tả gói, thân gói, hàm hoặc thủ tục nào tham khảo bất kỳ khai báo nào trong đặc tả gói được biên dịch lại.

Ngoài ra, như được chỉ ra bởi darreljnz, các phiên thường giữ lại các tham chiếu đến trạng thái của các gói mà chúng đã truy cập, gây ra ORA-04068: existing state of packages has been discarded vào lần tiếp theo phiên tìm cách tham chiếu gói.

Hành vi sau này là một sự phiền toái thực sự và cần viết mã để thử lại các hoạt động hoặc đóng tất cả các phiên hoạt động sau khi cài đặt phiên bản mới của gói (khởi động lại ứng dụng/dịch vụ một cách hiệu quả). Bottom line: Nó làm cho nó khó khăn hơn để cài đặt hotfix.

3

Sử dụng pragma serially_reusable trong gói của bạn và phần thân của gói.

+1

nó làm gì, tại sao đây là một giải pháp? xin hãy giải thích – TecHunter

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