Неизвестная ошибка компиляции функции PL/SQL

Полный новичок в PL/SQL

Предположим, у меня есть 2 таблицы,

Один REGION(R_KEY, R_NAME)

и еще один с именем NATION(N_KEY, N_NAME, N_REGIONKEY), где N_REGIONKEY соответствует значению в R_KEY

пример в REGION у нас есть

╔═══════╦════════════════╗
║ R_KEY ║     R_Name     ║
╠═══════╬════════════════╣
║     0 ║ AFRICA         ║
║     1 ║ SOUTHEAST ASIA ║
║     2 ║ EUROPE         ║
╚═══════╩════════════════╝

и в NATION

╔═══════╦═══════════╦═════════════╗
║ N_KEY ║  N_NAME   ║ N_REGIONKEY ║
╠═══════╬═══════════╬═════════════╣
║     0 ║ INDONESIA ║           1 ║
║     1 ║ LONDON    ║           2 ║
║     2 ║ FRANCE    ║           2 ║
║     3 ║ KENYA     ║           0 ║
╚═══════╩═══════════╩═════════════╝

Я хочу создать функцию, которая может принимать имя региона в качестве параметра, а затем перечислять все страны в этом регионе.

я пытался

create or replace function LISTNATION(regionName IN region.r_name%type)
return varchar2
IS
result varchar2(500)
begin
    for aRow IN (select r_key, r_name, n_name
                 from nation n, region r
                 where n_regionkey = r_Key
                 and r_key = regionKey)
    loop
        result := result || aRow.name || ', ';
    end loop;
    return result;
end LISTNATION;

но это вернуло ошибку компиляции

Почему возникает эта ошибка компиляции, и можем ли мы в любом случае получать уведомления о том, какая часть нашего кода вызывает эти ошибки?

Спасибо


person Yosua Martiansia    schedule 04.06.2020    source источник


Ответы (1)


Не хватает точки с запятой, здесь:

CREATE OR REPLACE FUNCTION LISTNATION (regionName IN region.r_name%TYPE)
   RETURN VARCHAR2
IS
   result  VARCHAR2 (500);                         --> here
BEGIN
   FOR aRow IN (SELECT r_key, r_name, n_name
                  FROM nation n, region r
                 WHERE     n_regionkey = r_Key
                       AND r_key = regionKey)
   LOOP
      result := result || aRow.name || ', ';
   END LOOP;

   RETURN result;
END LISTNATION;
/

Если вы получили сообщение об ошибке, запросите USER_ERROS, например.

SQL> create or replace function LISTNATION(regionName IN region.r_name%type)
  2  return varchar2
  3  IS
  4  result varchar2(500)
  5  begin
  6      for aRow IN (select r_key, r_name, n_name
  7                   from nation n, region r
  8                   where n_regionkey = r_Key
  9                   and r_key = regionKey)
 10      loop
 11          result := result || aRow.name || ', ';
 12      end loop;
 13      return result;
 14  end LISTNATION;
 15  /

Warning: Function created with compilation errors.

SQL> select * from user_errors where name = 'LISTNATION';

NAME                           TYPE           SEQUENCE       LINE   POSITION
------------------------------ ------------ ---------- ---------- ----------
TEXT
--------------------------------------------------------------------------------
ATTRIBUTE MESSAGE_NUMBER
--------- --------------
LISTNATION                     FUNCTION              1          5          1
PLS-00103: Encountered the symbol "BEGIN" when expecting one of the following:

   := ; not null default character
The symbol ";" was substituted for "BEGIN" to continue.
ERROR                103


SQL>

Или, если вы используете SQL*Plus, show errors делает то же самое (только красивее):

SQL> show err
Errors for FUNCTION LISTNATION:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/1      PLS-00103: Encountered the symbol "BEGIN" when expecting one of
         the following:
         := ; not null default character
         The symbol ";" was substituted for "BEGIN" to continue.

SQL>
person Littlefoot    schedule 04.06.2020