sql >> Databáze >  >> RDS >> Oracle

chyba rozlišení názvu funkce oracle pl/sql

Problém je v překladu názvů.

Když máte parametr hostname a hostname v tabulce, na kterou odkazujete, způsobí pravidla rozlišení rozsahu většinu lidí zmatek. Proto mnoho lidí doporučuje používat pro parametry a lokální proměnné konvenci pojmenování, která je odlišuje od názvů tabulek. Ve svém kódu například používám p_ pro předponu jmen parametrů a l_ pro předponu lokálních proměnných.

Ve vašem kódu, když máte

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

hostname je vyřešen jako sloupec v tabulce, nikoli jako parametr. To způsobí, že dotaz vrátí každý řádek v tabulce, kde je hostname není null, což způsobuje chybu. Název parametru můžete explicitně uvést před název funkce a vynutit tak hostname pro vyřešení parametru

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

To funguje. Ale přidávání předpony názvu funkce je obecně otravné. Pokud přijmete konvenci předpony názvů parametrů a názvů místních proměnných, dostanete něco jako

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;

To také funguje a má tendenci být (podle mého názoru) jasnější než přidávání explicitních předpon názvu funkce všude.




  1. Rails &Postgres:Migrace na change_colomn způsobuje chybu, kterou nelze přetypovat do typu timestamp bez časového pásma

  2. F# Propojte SQLProvider s Postgres

  3. Varování linkeru při sestavování aplikace proti mysql-connector-c/libmysqlclient/mysql C API

  4. Jak používat spojení na třech stolech