Проверка функциональной ошибки ORA-00923 - PullRequest
0 голосов
/ 17 мая 2018

Я пытаюсь создать FUNCTION, который получает местоположение введенного параметра, который является идентификатором, введенным, когда я проверяю функцию, которая не работает, она выдает ошибку ORA-00923

create or replace FUNCTION GET_LOCATION (l_con_id in NUMBER)
    RETURN VARCHAR2 
  AS 
    LOCATION VARCHAR2(30);
  BEGIN
    SELECT LOCATION 
      INTO LOCATION 
      FROM LDS_CONSULTANT 
      WHERE CONSULTANT_ID = l_con_id;

    RETURN LOCATION;
  END;

1 Ответ

0 голосов
/ 17 мая 2018

Вот мое предложение.

Сначала простой тестовый пример:

SQL> create table lds_consultant
  2  (consultant_id number,
  3   location      varchar2(30));

Table created.

SQL> insert into lds_consultant
  2    select 1, 'New York' from dual union
  3    select 2, 'London'   from dual;

2 rows created.

Функция:

  • имя параметра, так что его имя явно отличается от имени столбца. Пусть оно наследует тип столбца
  • то же самое относится и к возвращаемому значению. Например, перед его именем, например, "L_", указана локальная переменная
  • Использование функции MAX в операторе SELECT - это простой способ избежать ошибок TOO_MANY_ROWS или NO_DATA_FOUND. Тем не менее, я бы посоветовал вам правильно обращаться с ними при необходимости

SQL> create or replace function get_location
  2    (par_consultant_id in lds_consultant.consultant_id%type)
  3  return lds_consultant.location%type
  4  is
  5    l_location lds_consultant.location%type;
  6  begin
  7    select max(l.location)
  8      into l_location
  9      from lds_consultant l
 10      where l.consultant_id = par_consultant_id;
 11    return l_location;
 12  end;
 13  /

Function created.

Наконец, то, как вы это называете: стандарт , способ , выбор ... из двойного :

SQL> select get_location(2)  result_1,
  2         get_location(-1) result_2
  3  from dual;

RESULT_1                       RESULT_2
------------------------------ ------------------------------
London

SQL>

[EDIT]

Поскольку Apex использует PL / SQL, вам нужно объявить локальную переменную и поместить в нее результат этой функции. Примерно так:

declare
  l_result lds_consultant.location%type;
begin
  l_result := get_location(:P1_CONSULTANT_ID);
end;

Или, если бы это был отчет, вы бы включили его в оператор SELECT как

select l.consultant_id, 
       l.consultant_name,
       get_location(l.consultant_id) location
from lds_consultant l
order by l.consultant_name;

Кстати, выбор из двойного работает в любом месте Oracle (включая Apex).

...