Подтвердить что ты не робот

Функция, возвращающая boolean, терпит неудачу при "выражении неправильного типа"

Я использую oracle 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 
4b9b3361

Ответ 1

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

Функция работает, поэтому вы можете использовать в другом PL/SQL-блоке

declare
myvar boolean;
begin
   myvar := compt_tree_profile_q.legal_user(1,1);
end;

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

Ответ 2

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

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

Ответ 3

Учитывая, что вы вызываете это в 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 и т.д.).