Ошибка - PLS-00103: обнаружен символ «ВЫБОР» - PullRequest
0 голосов
/ 20 октября 2019

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

CREATE OR REPLACE FUNCTION TOT_PURCH_SF 
    (p_shopper_ID IN number)
    RETURN NUMBER 
    AS 
    lv_sum NUMBER;
BEGIN
  SELECT SUM(TOTAL)
    into lv_sum
    from bb_basket;
  RETURN lv_sum;
END;


SELECT TOT_PURCH_SF(23) tot_purch
    FROM BB_SHOPPER
    WHERE idshopper = 23;

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

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Я думаю, что вы используете sql-developer или какой-то другой tool.

Прежде всего, каково требование использования оператора SELECT непосредственно после function кода?

Functions хранится код, и вы можете вызывать их из любого места.

Теперь, чтобы дать ответ на ваш вопрос.

  1. Просто выберите (курсор влево щелкните и перетащите)последние 3 строки (т.е. оператор select) и выполнить их. Он будет работать индивидуально.
  2. Используйте slash (/) после окончания кода function, чтобы сделать его конечной точкой кода pl / sql.

В вашем случае происходит то, что ваш tool не может определить, где заканчивается код function.

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

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

затем вы можете выполнить только оператор select в любом окне инструментов.

Cheers !!

0 голосов
/ 20 октября 2019

Возможно, вам нужна была встроенная функция в предложении WITH , а не объявленная отдельно.

Настройка:

create table bb_shopper
( idshopper integer primary key );

create table bb_basket
( idshopper references bb_shopper
, total     number );

insert all
    into bb_shopper values (23)
    into bb_basket values (23, 1)
    into bb_basket values (23, 2)
    into bb_basket values (23, 3)
select null from dual;

Демонстрация:

with function tot_purch_sf 
        ( p_shopper_id in bb_shopper.idshopper%type )
        return number 
    as 
        lv_sum number;
    begin
        select sum(total) into lv_sum
        from   bb_basket
        where  idshopper = p_shopper_id;

        return lv_sum;
    end;
select tot_purch_sf(23) tot_purch
from   bb_shopper
where  idshopper = 23
/

 TOT_PURCH
----------
         6

1 row selected.

Если это то, что вам нужно, стоит обновить заголовок вашего вопроса, чтобы другим было легче его найти.

...