sql >> Databasteknik >  >> RDS >> Oracle

oracle pl/sql-funktionsnamnupplösningsfel

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.




  1. Hur hittar man e-post med fler än 2 punkter med REGEXP MySQL-funktionen?

  2. Utlösa i Oracle för att automatiskt öka ett fält och infoga i associationstabellen

  3. Rätt sätt att lagra en tidszon i en databas?

  4. Yttre välj kolumnvärde i sammanfogad delfråga?