我正在使用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
答案 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等)。