oracle10g 虚拟列,创建虚拟列一例

权当记录:

第一步: 创建函数, 目的是创建虚拟所需的DETERMINISTIC函数

CREATE OR REPLACE FUNCTION GetTaskProgress (a_task_no task.task_no%TYPE)

RETURN PLS_INTEGER

DETERMINISTIC

RESULT_CACHE

IS

v_Task_Progress   task.progress%TYPE;

BEGIN

v_Task_Progress := 10;

RETURN v_Task_Progress;

EXCEPTION

WHEN OTHERS

THEN

-- Consider logging the error and then re-raise

RAISE;

END GetTaskProgress;

/

第二步: 添加虚拟列:

alter table task  add ( calcprogress   as (GetTaskProgress(task_no)));

第三步: 修改原来的列名

ALTER TABLE  TASK

RENAME COLUMN PROGRESS TO ORGINPROGRESS ;

第四步: 使用正确的函数

CREATE OR REPLACE FUNCTION GetTaskProgress (a_task_no task.task_no%TYPE)

RETURN PLS_INTEGER

RESULT_CACHE

IS

/******************************************************************************

NAME:       GetTaskProgress

PURPOSE:

计算任务的进展

REVISIONS:

Ver        Date        Author           Description

---------  ----------  ---------------  ------------------------------------

1.0        2015-10-8   Administrator       1. Created this function.

NOTES:

******************************************************************************/

v_Task_Progress  PLS_INTEGER;

BEGIN

BEGIN

SELECT NVL (ORGINPROGRESS, 0)

INTO v_Task_Progress

FROM TASK A

WHERE NOT EXISTS

(SELECT NULL

FROM task B

WHERE B.parent_task_no = A.task_no)

AND task_no = a_task_no;                                 --- 叶子任务

EXCEPTION

WHEN NO_DATA_FOUND

THEN                                                            -- 非叶子任务

SELECT SUM (NVL (WEIGHT, 0) * GetTaskProgress (task_no) / 100)

INTO v_Task_Progress

FROM task

WHERE parent_task_no = a_task_no

GROUP BY parent_task_no;

END;

RETURN v_Task_Progress;

EXCEPTION

WHEN OTHERS

THEN

-- Consider logging the error and then re-raise

RAISE;

END GetTaskProgress;

/

第五步: 修改计算列名字

ALTER TABLE  TASK

RENAME COLUMN CALCPROGRESS TO PROGRESS ;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值