Das Problem ist eines der Namensauflösung.
Wenn Sie einen Parameter hostname
haben und einen hostname
Spalte in der Tabelle, auf die Sie verweisen, führen die Bereichsauflösungsregeln bei den meisten Menschen zu Verwirrung. Aus diesem Grund empfehlen viele Leute, eine Namenskonvention für Parameter und lokale Variablen zu verwenden, die sie von Tabellennamen unterscheidet. In meinem Code verwende ich zum Beispiel p_
um Parameternamen und l_
voranzustellen um lokalen Variablen voranzustellen.
In Ihrem Code, wenn Sie
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;
hostname
wird als Spalte in der Tabelle aufgelöst, nicht als Parameter. Dadurch gibt die Abfrage jede Zeile in der Tabelle zurück, in der hostname
nicht null ist, was den Fehler verursacht. Sie können dem Parameternamen explizit den Funktionsnamen voranstellen, um hostname
zu erzwingen zum Parameter auflösen
SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;
Das funktioniert. Aber das Hinzufügen des Funktionsnamenpräfixes wird im Allgemeinen lästig. Wenn Sie die Konvention übernehmen, Parameternamen und lokalen Variablennamen voranzustellen, erhalten Sie so etwas wie
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;
Das funktioniert auch und ist (in meinen Augen) tendenziell klarer, als überall explizite Funktionsnamen-Präfixe hinzuzufügen.