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

errore di risoluzione del nome della funzione oracle pl/sql

Il problema è di risoluzione dei nomi.

Quando hai un parametro hostname e un hostname colonna nella tabella a cui si fa riferimento, le regole di risoluzione dell'ambito creano confusione nella maggior parte delle persone. Ecco perché molte persone consigliano di utilizzare una convenzione di denominazione per i parametri e le variabili locali che li differenzia dai nomi delle tabelle. Nel mio codice, ad esempio, utilizzo p_ per anteporre i nomi dei parametri e l_ per anteporre variabili locali.

Nel tuo codice, quando hai

SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = Hostname;

hostname viene risolto come la colonna nella tabella, non il parametro. Ciò fa sì che la query restituisca ogni riga nella tabella in cui hostname non è null che causa l'errore. È possibile prefissare esplicitamente il nome del parametro con il nome della funzione per forzare hostname per risolvere il parametro

SELECT mySystems.SYSTEMID
INTO SysID
FROM mySystems
where mySystems.HOSTNAME = GET_SYSTEMID.Hostname;

Che funzioni. Ma l'aggiunta del prefisso del nome della funzione generalmente diventa fastidiosa. Se adotti la convenzione di anteporre i nomi dei parametri e i nomi delle variabili locali, otterresti qualcosa del tipo

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;

Anche questo funziona e tende (nella mia mente) ad essere più chiaro dell'aggiunta di prefissi espliciti dei nomi delle funzioni dappertutto.