ITPub博客

首页 > 数据库 > Oracle > 2011-11-25 包的初始化

2011-11-25 包的初始化

Oracle 作者:hanaka 时间:2019-12-18 16:46:06 0 删除 编辑

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

191楼


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

CREATE OR REPLACE FUNCTION plch_multiplier
RETURN PLS_INTEGER
IS
   c_hour CONSTANT PLS_INTEGER
      := TO_NUMBER (TO_CHAR (SYSDATE, 'HH24')) ;
BEGIN
RETURN CASE
        WHEN c_hour < 8 THEN 3
        WHEN c_hour < 16 THEN 2
        ELSE 1
        END;
END;
/

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

CREATE OR REPLACE PACKAGE plch_pkg
IS
   FUNCTION points_for_activity (base_points_in IN INTEGER)
      RETURN PLS_INTEGER;
END;
/

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

(A)

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   g_multiplier   PLS_INTEGER;
   FUNCTION points_for_activity (base_points_in IN INTEGER)
      RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN base_points_in * g_multiplier;
   END;
BEGIN
   g_multiplier := plch_multiplier();
END;
/

(B)

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   FUNCTION points_for_activity (base_points_in IN INTEGER)
      RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN base_points_in * plch_multiplier();
   END;
END;
/

(C)

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   g_multiplier   PLS_INTEGER;
   FUNCTION points_for_activity (base_points_in IN INTEGER)
      RETURN PLS_INTEGER
   IS
   BEGIN
      IF g_multiplier IS NULL
      THEN
         g_multiplier := plch_multiplier();
      END IF;
      RETURN base_points_in * g_multiplier;
   END;
END;
/

(D)

CREATE OR REPLACE PACKAGE BODY plch_pkg
IS
   g_multiplier   PLS_INTEGER := plch_multiplier();
   FUNCTION points_for_activity (base_points_in IN INTEGER)
      RETURN PLS_INTEGER
   IS
   BEGIN
      RETURN base_points_in * g_multiplier;
   END;
END;
/


答案在194楼

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


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/680385/viewspace-2669302/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-07-15

  • 博文量
    47
  • 访问量
    29232