Как уже говорил Каушик - синтаксическая ошибка.
Я бы предложил вам использовать одну RETURN
точку - включить дополнительную переменную (в моем примере RETVAL), установить для нее значение, которое вы хотите вернуть, а затем RETURN retval
.
SQL> CREATE OR REPLACE FUNCTION fun_min (a NUMBER, b NUMBER, c NUMBER)
2 RETURN NUMBER
3 AS
4 retval NUMBER;
5 BEGIN
6 IF a < c
7 AND a < b
8 THEN
9 retval := a;
10 ELSIF b < a
11 AND b < c
12 THEN
13 retval := b;
14 ELSIF c < a
15 AND c < b
16 THEN
17 retval := c;
18 END IF;
19
20 RETURN retval;
21 END;
22 /
Function created.
Однако, этот код неверен ; взгляните на следующий пример:
- мин2 должно было быть 2
- мин3 должно было быть 3
но оба они равны NULL.
SQL> SELECT fun_min (1, 2, 3) min1, fun_min (2, 2, 3) min2, fun_min (3, 3, 3) min3
2 FROM DUAL;
MIN1 MIN2 MIN3
---------- ---------- ----------
1
SQL>
Итак, да - функция LEAST
может быть лучшим выбором вместо всех этих IF:
SQL> CREATE OR REPLACE FUNCTION fun_min (a NUMBER, b NUMBER, c NUMBER)
2 RETURN NUMBER
3 AS
4 BEGIN
5 RETURN LEAST (a, b, c);
6 END;
7 /
Function created.
SQL> SELECT fun_min (1, 2, 3) min1, fun_min (2, 2, 3) min2, fun_min (3, 3, 3) min3
2 FROM DUAL;
MIN1 MIN2 MIN3
---------- ---------- ----------
1 2 3