Vấn đề bạn gặp phải (giả sử rằng bạn đang gọi thủ tục / hàm được đặt tên chính xác theo cách chính xác) là bạn đang cố gọi một hàm chưa được khai báo. Có hai cách để giải quyết vấn đề này, giả sử bạn muốn giữ hàm ở chế độ riêng tư:
- Khai báo hàm ADD_STUDENT trước bất kỳ thủ tục / hàm nào gọi nó.
- Sử dụng khai báo chuyển tiếp để khai báo hàm trước khi nó được gọi.
Vì vậy, đối với tùy chọn 1, mã mẫu của bạn sẽ giống như sau:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
Và đối với tùy chọn 2, mã của bạn sẽ giống như sau:
PACKAGE BODY SCHOOL AS
-- forward declared function
FUNCTION ADD_STUDENT(...);
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
END SCHOOL;
/
Cá nhân, tôi thích tùy chọn 1, vì nó có nghĩa là có ít thứ lộn xộn hơn trong phần thân gói, nhưng tùy chọn 2 có thể cần thiết nếu bạn có hai mô-đun tham chiếu lẫn nhau.