函数返回布尔值失败“表达式是错误的类型”

时间:2011-03-10 13:27:34

标签: oracle plsql oracle11g ora-06553

我正在使用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;

符合逻辑AND
         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 个答案:

答案 0 :(得分:24)

Pure SQL无法识别布尔类型,尽管PL / SQL可以。所以你的查询不知道这个函数返回的数据类型..

该功能有效,因此您可以在另一个pl / sql块中使用

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

但是你不能在纯粹的select语句中使用这个函数。

答案 1 :(得分:17)

你的函数返回一个布尔值。此数据类型是PL / SQL已知的,但您使用的是SQL查询。 SQL不知道如何处理布尔值并说“表达式是错误的类型”。

的问候,
罗布。

答案 2 :(得分:1)

鉴于你在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 ...

在这种情况下,我只是返回一个字符串('TRUE'或'FALSE'),但你可以返回SELECT语句中有效的任何内容(列,SYSDATE等)。