http://www.itpub.net/thread-1499223-20-1.html

191楼

为了鼓励访问者越来越多地使用我们的网站,我们针对他们的活动给予积分。我们的积分计算方法为基本点数和系数的乘积。如果活动发生在 08:00 之前,系数为3; 如果发生在 16:00 之前,系数为2; 其他的系数为1. 这个公式以如下函数实现:

CREATEORREPLACEFUNCTIONplch_multiplierRETURNPLS_INTEGERISc_hourCONSTANTPLS_INTEGER:=TO_NUMBER(TO_CHAR(SYSDATE,'HH24'));BEGINRETURNCASEWHENc_hour<8THEN3WHENc_hour<16THEN2ELSE1END;END;/

然后我用这个包里的函数为活动计算积分:

CREATEORREPLACEPACKAGEplch_pkgISFUNCTIONpoints_for_activity(base_points_inININTEGER)RETURNPLS_INTEGER;END;/

先不假设我们的应用程序是状态相关或者状态无关,哪些选项实现了包体,使得计算总是正确的?

(A)

CREATEORREPLACEPACKAGEBODYplch_pkgISg_multiplierPLS_INTEGER;FUNCTIONpoints_for_activity(base_points_inININTEGER)RETURNPLS_INTEGERISBEGINRETURNbase_points_in*g_multiplier;END;BEGINg_multiplier:=plch_multiplier();END;/

(B)

CREATEORREPLACEPACKAGEBODYplch_pkgISFUNCTIONpoints_for_activity(base_points_inININTEGER)RETURNPLS_INTEGERISBEGINRETURNbase_points_in*plch_multiplier();END;END;/

(C)

CREATEORREPLACEPACKAGEBODYplch_pkgISg_multiplierPLS_INTEGER;FUNCTIONpoints_for_activity(base_points_inININTEGER)RETURNPLS_INTEGERISBEGINIFg_multiplierISNULLTHENg_multiplier:=plch_multiplier();ENDIF;RETURNbase_points_in*g_multiplier;END;END;/

(D)

CREATEORREPLACEPACKAGEBODYplch_pkgISg_multiplierPLS_INTEGER:=plch_multiplier();FUNCTIONpoints_for_activity(base_points_inININTEGER)RETURNPLS_INTEGERISBEGINRETURNbase_points_in*g_multiplier;END;END;/

答案在194楼

2011-11-25答案B. 其他写法都是“静态”的,不能取到当前时间。