Проблемът е в разрешаването на имена.
Когато имате параметър hostname
и hostname
колона в таблицата, към която се позовавате, правилата за разрешаване на обхват предизвикват объркване на повечето хора. Ето защо много хора препоръчват използването на конвенция за именуване на параметри и локални променливи, която ги различава от имената на таблици. В моя код, например, използвам p_
за префикс имена на параметри и l_
за префикс на локални променливи.
Във вашия код, когато имате
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
се разрешава като колона в таблицата, а не като параметър. Това кара заявката да върне всеки ред в таблицата, където hostname
не е нула, което причинява грешката. Можете изрично да префиксирате името на параметъра с името на функцията, за да принудите hostname
за разрешаване на параметъра
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
Това работи. Но добавянето на префикса на името на функцията обикновено става досадно. Ако възприемете конвенцията за префиксиране на имената на параметрите и имената на локалните променливи, ще получите нещо като
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;
Това също работи и има тенденция (според мен) да бъде по-ясно от добавянето на изрични префикси на имена на функции навсякъде.