sql >> Database teknologi >  >> RDS >> Oracle

oracle pl/sql funktion navn opløsning fejl

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.




  1. PHP MySQL SQL-parser (INSERT og OPDATERING)

  2. MySQL-databasedesign med internationalisering

  3. MySQL-syntaksfejl på DELIMITER før CREATE TRIGGER

  4. Bedste måde at gemme et kategorinavn fra php i en mysql-tabel