Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

ORA-04061:trạng thái hiện tại của nội dung gói PACKAGE.NAME đã bị vô hiệu hóa vẫn còn

Oracle thực hiện điều này vì việc biên dịch lại gói PL / SQL làm mất hiệu lực của bất kỳ biến phiên nào đang được sử dụng.

Chúng tôi không thể làm gì nhiều để tránh điều này, ngoại trừ bằng cách sử dụng các phương pháp triển khai tốt. Không triển khai các thay đổi trong khi cơ sở dữ liệu đang được sử dụng, hãy đảm bảo tất cả các kết nối được ngắt kết nối đúng cách, v.v. Nói thì dễ hơn làm trong thời đại CI / CD này, không có thời gian chết và các đổi mới thú vị khác.

Vì vậy, có một thứ ở phía sau tủ:pragma serially_reusable; . Hướng dẫn này có nghĩa là trạng thái của gói được duy trì trong khoảng thời gian một lệnh gọi máy chủ duy nhất . Ví dụ:nếu chúng ta có một khối PL / SQL gọi một thủ tục SR ba lần bất kỳ biến nào được thay đổi bởi thủ tục đó sẽ chính giá trị trong ba lần gọi. Nhưng vào lần tiếp theo chúng tôi chạy khối - trong cùng một phiên - các biến sẽ được đặt lại về giá trị ban đầu của chúng.

Có một số hạn chế đối với PL / SQL có thể tái sử dụng hàng loạt - ví dụ, nó không thể được sử dụng trong các truy vấn SQL. Nhưng điểm thu hút lớn từ góc nhìn của bạn là không còn lỗi ORA-04068 hoặc ORA-04061 nữa. Không có trạng thái phiên, không có gì để làm mất hiệu lực.

pragma serially_reusable phải được khai báo ở cấp độ gói, và trong nội dung cũng như thông số kỹ thuật. Vì vậy, bạn phải chắc chắn rằng không có thủ tục đóng gói nào cần duy trì trạng thái trên các lệnh gọi máy chủ.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Phát hiện chu kỳ với tính toán truy vấn con đệ quy

  2. Sử dụng chế độ xem không có khóa chính với Thực thể

  3. Cố gắng tải các thư viện máy khách Oracle đã ném BadImageFormatException

  4. Oracle - sử dụng biến ràng buộc trong mệnh đề LIKE của con trỏ động

  5. Oracle SQL - Chuyển đổi hàng thành cột động