Masalahnya adalah salah satu resolusi nama.
Bila Anda memiliki parameter hostname
dan hostname
kolom di tabel yang Anda rujuk, aturan resolusi cakupan menyebabkan kebingungan bagi kebanyakan orang. Itu sebabnya banyak orang merekomendasikan menggunakan konvensi penamaan untuk parameter dan variabel lokal yang membedakannya dari nama tabel. Dalam kode saya, misalnya, saya menggunakan p_
untuk mengawali nama parameter dan l_
untuk mengawali variabel lokal.
Dalam kode Anda, bila Anda memiliki
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
diselesaikan sebagai kolom dalam tabel, bukan parameter. Ini menyebabkan kueri mengembalikan setiap baris dalam tabel di mana hostname
bukan nol yang menyebabkan kesalahan. Anda dapat secara eksplisit mengawali nama parameter dengan nama fungsi untuk memaksa hostname
untuk menyelesaikan ke parameter
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
Itu bekerja. Tetapi menambahkan awalan nama fungsi umumnya mengganggu. Jika Anda mengadopsi konvensi awalan nama parameter dan nama variabel lokal, Anda akan mendapatkan sesuatu seperti
FUNCTION GET_SYSTEMID(p_hostname varchar2)
RETURN NUMBER
IS
l_sysID number;
BEGIN
SELECT mySystems.SYSTEMID
INTO l_sysID
FROM mySystems
where mySystems.HOSTNAME = p_hostname;
return l_sysID;
END GET_SYSTEMID;
Itu juga berfungsi dan cenderung (dalam pikiran saya) lebih jelas daripada menambahkan awalan nama fungsi eksplisit di semua tempat.