2011-03-10 14 views
13

Estoy usando Oracle 11g y no puedo entender cuál es mi problema. he hecho mucho más difícil cosas pero fallar en esta cosa simple para el último 5 horas:La función que devuelve booleano falla en "la expresión es del tipo incorrecto"

Este es el cuerpo de la función

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; 

Esta es la especificación:

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

cuales Y lo hace lógico equivlant a

  A*B>0?true:false; 

El mensaje de error soy recibiendo es

ORA-06552: PL/SQL: Declaración ignorado ORA-06553: PLS-382: expresión es de tipo incorrecto 06552. 00000 - "PL/SQL:% s" * Causa:
* acción: error en la línea: 1 columna: 7


Esto es cómo lo ejecuto en mi IDE

SELECT compt_tree_profile_q.legal_user(1,1) 
FROM dual 
+0

He compilado y utilizado la función y funcionó. ¿Puedes agregar un código de ejemplo sobre cómo lo estás usando? –

+0

código agregado a q –

Respuesta

23

Pure SQL no reconoce un tipo booleano, aunque PL/SQL sí lo hace. Por lo que su consulta no saber qué tipo de datos esta función está volviendo ..

funciona de la función, por lo que podría en otro uso PL/SQL bloque

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

Pero no se puede utilizar esta función en un pura Seleccionar instrucción.

+0

gracias, ya no estoy en la oficina así que lo verificaría en la mañana del domingo –

+0

yoav, si aún desea (o necesita) utilizar esta funcionalidad en una declaración de SQL, haga que devuelva un número en lugar de un booleano (1 = verdadero, 0-falso). Luego puede seleccionar legal_user (1,1) desde dual y solo tendrá que saber cómo interpretar los resultados. –

17

Su función devuelve un valor lógico. PL/SQL conoce este tipo de datos, pero está utilizando una consulta SQL. SQL no sabe cómo manejar booleanos y dice "la expresión es de tipo incorrecto".

Saludos,
Rob.

1

Dado que llama esto dentro de SQL, puede usar la función SIGN integrada en lugar de hacer la suya propia.

La función devolverá -1, 0 o 1, dependiendo del signo del parámetro (negativo, cero o positivo, respectivamente).

Así es como usted lo utilizaría:

SIGN(level_existance*types_with_impel) 

Y cómo le gustaría trabajar en una instrucción CASE:

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

En este caso, sólo estoy volviendo una cadena ("TRUE 'o' FALSE '), pero puede devolver todo lo que sea válido dentro de su instrucción SELECT (una columna, SYSDATE, etc.).

Cuestiones relacionadas