Không liên quan gì đến khai báo chuyển tiếp.
Điều này đề cập đến thực tế là bạn đang sử dụng truy vấn SQL để gọi hàm . Có vẻ như khi sử dụng một câu lệnh để gọi một hàm, bạn không còn ở trong phạm vi của gói PL / SQL, do đó bạn chỉ có thể gọi các hàm có sẵn công khai.
Đối với lý do tại sao , Tôi chỉ có thể đoán, vì vậy đừng coi đó là điều hiển nhiên, nhưng PL / SQL và SQL có các công cụ khác nhau . Vì vậy, khi thực hiện một truy vấn sql, ngay cả bên trong gói pl / sql của bạn, bạn đi đến cấp độ SQL nơi nó sẽ kiểm tra lại các quyền theo công cụ SQL. Vì vậy, nó không có ý tưởng rằng nó được thực thi từ bên trong gói PL / SQL và bạn nên được phép gọi hàm private.
Tôi nghĩ rằng sự khác biệt của các động cơ có thể được kiểm tra dễ dàng, hãy thử sử dụng varchar2 là 32000, nó sẽ hoạt động trong hàm pl / sql của bạn. Bây giờ, nếu bạn gọi hàm pl / sql của mình trả về varchar2(32000)
, nó sẽ thất bại. Thi là một vấn đề tôi gặp phải, nhưng tôi không có bất kỳ cơ sở dữ liệu nào để cung cấp cho bạn một đoạn mã.