Oracle
 sql >> Datenbank >  >> RDS >> Oracle

oracle pl/sql funktionsnamen auflösungsfehler

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.