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

qyyhg6bp  于 2023-06-05  发布在  Oracle
关注(0)|答案(3)|浏览(527)

我正在使用oracle 11 g,我只是不能理解我的问题在哪里。我做过更难的东西,但我在过去的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
kwvwclae

kwvwclae1#

纯SQL不识别布尔类型(直到版本23 c),尽管PL/SQL可以。所以你的查询不知道这个函数返回的数据类型。
该函数可以工作,因此您可以在另一个pl/sql块中使用

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

但是不能在纯select语句中使用此函数。

5gfr0r5j

5gfr0r5j2#

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

dl5txlt9

dl5txlt93#

如果您在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等)。

相关问题