Функция, возвращающая логическое значение, завершается с ошибкой «выражение имеет неправильный тип» - PullRequest
14 голосов
/ 10 марта 2011

Я использую оракул 11g, и я просто не могу понять, где моя проблема.Я сделал намного более сложные вещи, но я провалился в этой простой вещи за последние 5 часов:

Это тело функции

FUNCTION legal_user(
     level_existance  number
    ,types_with_impel number)
RETURN BOOLEAN
 IS
 v_ret_val BOOLEAN;
 BEGIN
   v_ret_val := FALSE;
   IF (level_existance*types_with_impel>0) then 
     v_ret_val := TRUE;
     DBMS_OUTPUT.PUT_LINE('true');
   else 
     DBMS_OUTPUT.PUT_LINE('false');
   END IF;       
  return v_ret_val;
END legal_user;

Это спецификация:

FUNCTION legal_user(
       level_existance number
       ,types_with_impel number)
   RETURN BOOLEAN;

, который выполняет логическое И эквивалентно

         A*B>0?true:false;   

Полученное сообщение об ошибке:

ORA-06552: PL / SQL: оператор игнорируется ORA-06553: PLS-382:выражение имеет неправильный тип 06552. 00000 - «PL / SQL:% s» * Причина:
* Действие: Ошибка в строке: 1 Столбец: 7


Вот как я запускаю его вмой IDE

 SELECT compt_tree_profile_q.legal_user(1,1)
 FROM dual 

Ответы [ 3 ]

24 голосов
/ 10 марта 2011

Чистый SQL не распознает логический тип, хотя PL / SQL распознает.Так что ваш запрос не знает, какой тип данных возвращает эта функцияфункция в чистом операторе выбора.

17 голосов
/ 10 марта 2011

Ваша функция возвращает логическое значение.Этот тип данных известен PL / SQL, но вы используете запрос SQL.SQL не знает, как обращаться с логическими значениями, и говорит, что «выражение имеет неправильный тип».

С уважением,
Роб.

1 голос
/ 11 марта 2011

Учитывая, что вы вызываете это в SQL, вы можете использовать встроенную функцию SIGN вместо того, чтобы использовать свою собственную.

Функция вернет -1, 0 или 1, в зависимости от знака параметра (отрицательный, нулевой или положительный соответственно).

Вот как бы вы его использовали:

SIGN(level_existance*types_with_impel)

И как бы вы работали с оператором CASE:

SELECT CASE WHEN (SIGN(level_existance*types_with_impel) = 1)
            THEN 'TRUE'
            ELSE 'FALSE'
       END legal_user
FROM ...

В этом случае я просто возвращаю строку («ИСТИНА» или «ЛОЖЬ»), но вы можете вернуть все, что допустимо в вашем операторе SELECT (столбец, SYSDATE и т. Д.).

...