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.