Функция PL / SQL, показывающая ошибку, которая ::: ORA-06575: Пакет или функция FUN_MIN находятся в недопустимом состоянии - PullRequest
0 голосов
/ 25 апреля 2018

Я не могу решить эту проблему, пожалуйста, помогите

ORA-06575: пакет или функция FUN_MIN находится в недопустимом состоянии

create or replace Function fun_min(a number,b number,c number)
return number as
begin
if a<c and a<b
then
return a;
else if
b<a and b<c
then
return b;
else if
c<a and c<b
then
return c;
end if;
end;
/
select fun_min(1,2,3) from dual;

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Как уже говорил Каушик - синтаксическая ошибка.

Я бы предложил вам использовать одну 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
0 голосов
/ 25 апреля 2018

Это должно быть ELSIF вместо ELSE IF

Кроме того, нет необходимости писать это, Oracle уже предоставляет вам функцию LEAST, которая работает с числами, строками и датами.

select LEAST(1,2,3) FROM DUAL;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...