Problemet er et navneopløsning.
Når du har en parameter hostname og et hostname kolonne i tabellen, som du refererer til, forårsager reglerne for scope resolution de fleste mennesker forvirring. Det er derfor, mange mennesker anbefaler at bruge en navnekonvention for parametre og lokale variabler, der adskiller dem fra tabelnavne. I min kode bruger jeg for eksempel p_ for at præfikse parameternavne og l_ for at præfikse lokale variabler.
I din kode, når du har
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname løses som kolonnen i tabellen, ikke parameteren. Dette får forespørgslen til at returnere hver række i tabellen, hvor hostname er ikke null, hvilket forårsager fejlen. Du kan eksplicit præfikse parameternavnet med funktionsnavnet for at tvinge hostname for at løse til parameteren
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
Det virker. Men det bliver generelt irriterende at tilføje funktionsnavnets præfiks. Hvis du anvender konventionen om at sætte præfikser på parameternavne og lokale variabelnavne, vil du få noget lignende
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;
Det virker også og har en tendens (i mit sind) til at være klarere end at tilføje eksplicitte funktionsnavne-præfikser overalt.