Problemet är ett namnupplösning.
När du har en parameter hostname
och ett hostname
kolumnen i tabellen som du hänvisar till orsakar reglerna för omfattningsupplösning de flesta människor förvirring. Det är därför många rekommenderar att man använder en namnkonvention för parametrar och lokala variabler som skiljer dem från tabellnamn. I min kod använder jag till exempel p_
för att prefixa parameternamn och l_
för att prefixa lokala variabler.
I din kod, när du har
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
löses som kolumnen i tabellen, inte parametern. Detta gör att frågan returnerar varje rad i tabellen där hostname
är inte null vilket orsakar felet. Du kan uttryckligen prefixa parameternamnet med funktionsnamnet för att tvinga fram hostname
för att lösa till parametern
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
Det fungerar. Men att lägga till funktionsnamnsprefixet blir i allmänhet irriterande. Om du använder konventionen att prefixera parameternamn och lokala variabelnamn, skulle du få något liknande
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 fungerar också och tenderar (i mina ögon) att vara tydligare än att lägga till explicita funktionsnamnprefix överallt.