14

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

3 回答 3

25

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

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

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

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

于 2011-03-10T14:02:51.297 回答
17

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

问候,
罗布。

于 2011-03-10T14:02:45.340 回答
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 等)。

于 2011-03-11T19:14:30.647 回答