Oracle
 sql >> Base de données >  >> RDS >> Oracle

erreur de résolution de nom de fonction oracle pl/sql

Le problème en est un de résolution de noms.

Lorsque vous avez un paramètre hostname et un hostname colonne dans le tableau auquel vous faites référence, les règles de résolution de portée causent la confusion à la plupart des gens. C'est pourquoi de nombreuses personnes recommandent d'utiliser une convention de dénomination pour les paramètres et les variables locales qui les différencie des noms de table. Dans mon code, par exemple, j'utilise p_ pour préfixer les noms de paramètres et l_ pour préfixer les variables locales.

Dans votre code, lorsque vous avez

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

hostname est résolu en tant que colonne de la table, et non en tant que paramètre. Ainsi, la requête renvoie chaque ligne de la table où hostname n'est pas nul, ce qui provoque l'erreur. Vous pouvez explicitement préfixer le nom du paramètre avec le nom de la fonction pour forcer hostname pour résoudre le paramètre

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

Ça marche. Mais ajouter le préfixe du nom de la fonction devient généralement ennuyeux. Si vous adoptez la convention de préfixer les noms de paramètres et les noms de variables locales, vous obtiendrez quelque chose comme

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;

Cela fonctionne également et a tendance (dans mon esprit) à être plus clair que d'ajouter des préfixes de nom de fonction explicites partout.