Oracle: ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк - PullRequest
1 голос
/ 13 июля 2020

У меня есть две таблицы COURSES и COURSE_PRICELIST, и я создал эту функцию, чтобы взять значение и поместить это значение в переменную:

create or replace function "GET_PUBLIC_COURSE_AMMOUNT" (course_id in number)
  return number
is
  TC_Ammount number;
begin
  select COURSE_PRICELIST.PRICE
    into TC_Ammount
    from COURSES
    join COURSE_PRICELIST 
      on COURSES.ID = COURSE_PRICELIST.COURSE_ID
   where COURSE_PRICELIST.ACTIVE = 1
     and COURSES.ID = course_id;
  return TC_Ammount;
end;

Проблема в том, что когда я запускаю это Оператор select возвращает только одну строку (это именно то, что я хочу), но когда я пытаюсь использовать этот оператор как функцию:

DECLARE
    TCPL NUMBER;
BEGIN
    TCPL := GET_PUBLIC_COURSE_AMMOUNT(90);  
END;

У меня такая ошибка:

ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк

ORA-06512: в «PAADB.GET_PUBLIC_COURSE_AMMOUNT», строка 8

ORA-06512: в строке 4

ORA-06512: в «SYS.DBMS_ SQL», строка 1721

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

1 Ответ

2 голосов
/ 15 июля 2020

Ваша проблема - параметр функции course_id, имя которого совпадает с именем столбца в таблице COURSE_PRICELIST. Поэтому в select он ведет себя как 1 = 1 и возвращает все строки.

Рекомендуется использовать префикс переменных и параметров в PL / SQL, чтобы таких ошибок не происходило, некоторые примеры:

  • Переменные: v_
  • Константы: c_
  • Курсоры: cur_
  • Параметры: p_
  • Типы: t_ (или добавить _tabt / _rect)
  • и многие другие ..

Попробуйте:

create or replace function GET_PUBLIC_COURSE_AMMOUNT (p_course_id in number)
  return number
is
  v_TC_Ammount number;
begin
  select COURSE_PRICELIST.PRICE
    into v_TC_Ammount
    from COURSES
    join COURSE_PRICELIST 
      on COURSES.ID = COURSE_PRICELIST.COURSE_ID
   where COURSE_PRICELIST.ACTIVE = 1
     and COURSES.ID = p_course_id;
  return v_TC_Ammount;
end;
...