我正在使用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
3条答案
按热度按时间kwvwclae1#
纯SQL不识别布尔类型(直到版本23 c),尽管PL/SQL可以。所以你的查询不知道这个函数返回的数据类型。
该函数可以工作,因此您可以在另一个pl/sql块中使用
但是不能在纯select语句中使用此函数。
5gfr0r5j2#
你的函数返回一个布尔值。这个数据类型对于PL/SQL是已知的,但是您使用的是SQL查询。SQL不知道如何处理布尔值,并说“表达式的类型错误”。
致上,
罗伯
dl5txlt93#
如果您在SQL中调用此函数,则可以使用内置的SIGN函数,而不是滚动自己的函数。
该函数将返回-1、0或1,具体取决于参数的符号(分别为负、零或正)。
以下是您将如何使用它:
以及如何将其转换为CASE语句:
在本例中,我只是返回一个字符串('TRUE'或'FALSE'),但您可以返回SELECT语句中的任何有效内容(列、SYSDATE等)。