Добавьте встроенную функцию с предложением IF / ELSE в Oracle 12c - PullRequest
0 голосов
/ 13 декабря 2018

У меня есть таблица A. Если я сделаю запрос со встроенной функцией

with function f(n number) return varchar2 as
   begin
    return 'const string';
   end;
select id, val, count, f(count) as value from A;

, результат будет следующим:

    ID         VAL                       COUNT VALUE
    ---------- -------------------- ---------- ---------------
     1         car                           4 const string
     2         building                     15 const string

Но если я попытаюсь усложнить функцию

with function f(n number)
   return varchar2 as
   begin
    IF n < 5 THEN
            return 'small';
        ELSIF n < 50 THEN
            return 'normal';
        ELSE 
            return 'big';
        END IF;
    end;
select id, val, count, f(count) as value from A;

появляется сообщение об ошибке:

with function f(n number)
              *
ERROR at line 1:
ORA-00905: missing keyword

В чем здесь проблема?Использую ли я правильный синтаксис для команды?

1 Ответ

0 голосов
/ 13 декабря 2018

В вашем операторе if отсутствует then после условия условия elsif, следовательно, отсутствует ключевое слово, указывающее на функцию f.Кроме того, после исправления этой ошибки вы можете получить ORA-00933: SQL command not properly ended, указывающий на последнюю точку с запятой.Интересно, что ";"похоже, не работает как терминатор для оператора SQL, когда объявление PL / SQL включено в предложение WITH.Если мы попытаемся использовать его самостоятельно, SQL * Plus ожидает ввода большего количества текста.Таким образом, вы должны закончить это с / на новой строке.Даже в примере Справочное руководство по SQL использует комбинацию ; и /.Вот мой пример, который я тестировал в PL / SQL Developer 11:

WITH
 FUNCTION f(n number) return varchar2 IS
   begin
     if n<5 then 
       return 'small';
     elsif (n>5 AND n<50) then
       return 'medium';
     else 
       return 'big';
      end if;     
   end;  
select f(25) from dual
/

Вывод:

F(25)
medium

РЕДАКТИРОВАТЬ: Кроме того, измените AS на IS в определении вашей функции.

...