Masalah yang Anda miliki (dengan asumsi bahwa Anda memanggil prosedur/fungsi dengan nama yang benar dengan cara yang benar) adalah bahwa Anda mencoba memanggil panggilan ke fungsi yang belum dideklarasikan. Ada dua cara untuk mengatasinya, dengan asumsi Anda ingin merahasiakan fungsi tersebut:
- Deklarasikan fungsi ADD_STUDENT sebelum prosedur/fungsi apa pun yang menjalankannya.
- Gunakan pernyataan penerusan untuk mendeklarasikan fungsi sebelum dipanggil.
Jadi, untuk opsi 1, kode contoh Anda akan terlihat seperti:
PACKAGE BODY SCHOOL AS
FUNCTION ADD_STUDENT(...)
...
END ADD_STUDENT;
PROCEDURE ADD_PEOPLE(...)
...
some_var := ADD_STUDENT();
END ADD_PEOPLE;
END SCHOOL;
/
Dan untuk opsi 2 kode Anda akan terlihat seperti:
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;
/
Secara pribadi, saya menyukai opsi 1, karena itu berarti lebih sedikit hal yang mengacaukan isi paket, tetapi opsi 2 mungkin diperlukan jika Anda memiliki dua modul yang saling merujuk.