如何在oracle 10g中计算列值?

时间:2013-07-30 11:53:36

标签: sql oracle plsql oracle10g

create table ord_tbl
(
ord_id number(10) primary key,
ord_name varchar2(20),
quantity number(20),
cost_per_item number(30),
total_cost number(30)--This colm shud be (quantity*cost_per_item),
ord_date date
)

因此,当我插入行时,'total_cost'应自动生成并插入表

2 个答案:

答案 0 :(得分:4)

10g没有此功能。而是使用视图:

create table ord_tbl
(
ord_id number(10) primary key,
ord_name varchar2(20),
quantity number(20),
cost_per_item number(30),
ord_date date
);

create view vw_ord_tbl as
    select ord_id, ord_name, quantity, cost_perId, (quantity*cost_per_item) as total_cost, ord_date
    from ord_tbl;

替代方法是让表中的列使用触发器来维护值 - 对于更新和插入。我建议使用视图,因为维护触发器会增加很多维护开销。

编辑(杰森饰):

在11g中,您可以在表定义中创建虚拟列。

create table ord_tbl (
    ord_id number(10) primary key,
    ord_name varchar2(20),
    quantity number(20),
    cost_per_item number(30),
    total_cost as (quantity*cost_per_item),
    ord_date date
)

答案 1 :(得分:2)

就像戈登·林诺夫回答的那样,你可以创建一个视图。或者,您可以创建触发器并存储实际值:

create trigger tiua_ord_tbl
on ord_tbl after insert or update
for each row
begin
  :new.total_cost := :new.quantity * :new.cost_per_item;
end;

存储数据的好处是,您可以更快地访问它并在需要时将其编入索引。缺点是存储冗余数据(可以在运行时计算),并且需要更多存储空间。

我建议首先使用该视图,并且只有在需要此“缓存”版本才能开始将值存储在表中。