Oracle
 sql >> база данни >  >> RDS >> Oracle

грешка в разрешаването на името на функцията на oracle pl/sql

Проблемът е в разрешаването на имена.

Когато имате параметър hostname и hostname колона в таблицата, към която се позовавате, правилата за разрешаване на обхват предизвикват объркване на повечето хора. Ето защо много хора препоръчват използването на конвенция за именуване на параметри и локални променливи, която ги различава от имената на таблици. В моя код, например, използвам p_ за префикс имена на параметри и l_ за префикс на локални променливи.

Във вашия код, когато имате

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

hostname се разрешава като колона в таблицата, а не като параметър. Това кара заявката да върне всеки ред в таблицата, където hostname не е нула, което причинява грешката. Можете изрично да префиксирате името на параметъра с името на функцията, за да принудите hostname за разрешаване на параметъра

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

Това работи. Но добавянето на префикса на името на функцията обикновено става досадно. Ако възприемете конвенцията за префиксиране на имената на параметрите и имената на локалните променливи, ще получите нещо като

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;

Това също работи и има тенденция (според мен) да бъде по-ясно от добавянето на изрични префикси на имена на функции навсякъде.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Вмъкване на данни в базата данни на Oracle с помощта на php

  2. Замяна на функция в Oracle SQL

  3. Как да използвате асоциативен масив на Oracle в SQL заявка

  4. Oracle - форматиране на текущата дата

  5. Има ли по-добър оператор на Oracle, който да направи нулева безопасна проверка на равенството?