Problém je v překladu názvů.
Když máte parametr hostname
a hostname
v tabulce, na kterou odkazujete, způsobí pravidla rozlišení rozsahu většinu lidí zmatek. Proto mnoho lidí doporučuje používat pro parametry a lokální proměnné konvenci pojmenování, která je odlišuje od názvů tabulek. Ve svém kódu například používám p_
pro předponu jmen parametrů a l_
pro předponu lokálních proměnných.
Ve vašem kódu, když máte
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
je vyřešen jako sloupec v tabulce, nikoli jako parametr. To způsobí, že dotaz vrátí každý řádek v tabulce, kde je hostname
není null, což způsobuje chybu. Název parametru můžete explicitně uvést před název funkce a vynutit tak hostname
pro vyřešení parametru
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
To funguje. Ale přidávání předpony názvu funkce je obecně otravné. Pokud přijmete konvenci předpony názvů parametrů a názvů místních proměnných, dostanete něco jako
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;
To také funguje a má tendenci být (podle mého názoru) jasnější než přidávání explicitních předpon názvu funkce všude.