Plsql 试图通过调用函数设置表列的值来更新表列时出错:PLS-00231

Plsql 试图通过调用函数设置表列的值来更新表列时出错:PLS-00231,plsql,Plsql,下面是引发错误的update语句: PLS-00231:SQL中不能使用函数“F_GET_MUSTGO_LOOKAHEAD” f_get_mustgo_lookahead是一个私有函数,参数已通过表中的列值传递给该函数 FUNCTION f_get_mustgo_lookahead --f_get_mustgo_lookahead function takes input parameters smart_code

下面是引发错误的update语句:

PLS-00231:SQL中不能使用函数“F_GET_MUSTGO_LOOKAHEAD”

f_get_mustgo_lookahead
是一个私有函数,参数已通过表中的列值传递给该函数

FUNCTION  f_get_mustgo_lookahead                                        --f_get_mustgo_lookahead function takes input parameters smart_code and multiplier and returns value for u_must_go and u_look_ahead
(in_smart_code IN varchar2, in_multiplier IN FLOAT)
RETURN  NUMBER
IS
l_type_mustgo_lookahead NUMBER;  

BEGIN

SELECT (closedt.eff - opendt.eff) INTO l_type_mustgo_lookahead          
FROM
(SELECT eff from (SELECT eff FROM scpomgr.caldata  WHERE cal=in_smart_code AND opt=1 order by eff )where rownum=1) opendt,
(SELECT eff from(SELECT eff FROM scpomgr.caldata  WHERE cal=in_smart_code AND  opt=2 order by eff )where rownum=1) closedt 
WHERE closedt.eff > opendt.eff ;

RETURN (l_type_mustgo_lookahead * in_multiplier); 
EXCEPTION
WHEN NO_DATA_FOUND THEN                         
  RETURN 0;                        
END f_get_mustgo_lookahead;     

不能从SQL调用私有函数。如果在包中,则需要在包规范中定义它,或者它需要是架构级别的

FUNCTION  f_get_mustgo_lookahead                                        --f_get_mustgo_lookahead function takes input parameters smart_code and multiplier and returns value for u_must_go and u_look_ahead
(in_smart_code IN varchar2, in_multiplier IN FLOAT)
RETURN  NUMBER
IS
l_type_mustgo_lookahead NUMBER;  

BEGIN

SELECT (closedt.eff - opendt.eff) INTO l_type_mustgo_lookahead          
FROM
(SELECT eff from (SELECT eff FROM scpomgr.caldata  WHERE cal=in_smart_code AND opt=1 order by eff )where rownum=1) opendt,
(SELECT eff from(SELECT eff FROM scpomgr.caldata  WHERE cal=in_smart_code AND  opt=2 order by eff )where rownum=1) closedt 
WHERE closedt.eff > opendt.eff ;

RETURN (l_type_mustgo_lookahead * in_multiplier); 
EXCEPTION
WHEN NO_DATA_FOUND THEN                         
  RETURN 0;                        
END f_get_mustgo_lookahead;