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ủ.