oracle不允许对虚拟列执行,虚拟列(virtual column)

虚拟列(virtual column)

虚拟列是oracle11g的新特性,列中的值并不存储在磁盘中,而是根据需要由定义的表带式或者

函数自动生成列值。

SQL> desc books

Name     Type         Nullable Default Comments

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

ISBN     VARCHAR2(10)

TITLE    VARCHAR2(30) Y

PUBDATE  DATE         Y

PUBID    NUMBER(2)    Y

COST     NUMBER(5,2)  Y

RETAIL   NUMBER(5,2)  Y

DISCOUNT NUMBER(4,2)  Y

CATEGORY VARCHAR2(12) Y

SQL> alter table books add(profit as (retail-cost));

Table altered //增加一个虚拟列profit

SQL> desc books

Name     Type         Nullable Default         Comments

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

ISBN     VARCHAR2(10)

TITLE    VARCHAR2(30) Y

PUBDATE  DATE         Y

PUBID    NUMBER(2)    Y

COST     NUMBER(5,2)  Y

RETAIL   NUMBER(5,2)  Y

DISCOUNT NUMBER(4,2)  Y

CATEGORY VARCHAR2(12) Y

PROFIT   NUMBER       Y        "RETAIL"-"COST"

SQL> select title,cost,retail,profit

2  from books; //虚拟列的数据会在使用的时候自动生成。

TITLE                             COST  RETAIL     PROFIT

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

BODYBUILD IN 10 MINUTES A DAY    18.75   30.95       12.2

REVENGE OF MICKEY                14.20   22.00        7.8

BUILDING A CAR WITH TOOTHPICKS   37.80   59.95      22.15

DATABASE IMPLEMENTATION          31.40   55.95      24.55

COOKING WITH MUSHROOMS           12.50   19.95       7.45

HOLY GRAIL OF ORACLE             47.25   75.95       28.7

HANDCRANKED COMPUTERS            21.80   25.00        3.2

E-BUSINESS THE EASY WAY          37.90   54.50       16.6

PAINLESS CHILD-REARING           48.00   89.95      41.95

THE WOK WAY TO COOK              19.00   28.75       9.75

BIG BEAR AND LITTLE DOVE          5.32    8.95       3.63

HOW TO GET FASTER PIZZA          17.85   29.95       12.1

HOW TO MANAGE THE MANAGER        15.40   31.95      16.55

SHORTEST POEMS                   21.85   39.95       18.1

下面使用表结构简单一点的表来做虚拟列插入的演示

CREATE TABLE acctmanager

(amid CHAR(4),

amfirst VARCHAR2(12)  NOT NULL,

amlast VARCHAR2(12)  NOT NULL,

amedate DATE DEFAULT SYSDATE,

amsal NUMBER(8,2),

amcomm NUMBER(7,2) DEFAULT 0,

region CHAR(2),

CONSTRAINT acctmanager_amid_pk PRIMARY KEY (amid),

CONSTRAINT acctmanager_region_ck

CHECK (region IN ('N', 'NW', 'NE', 'S', 'SE', 'SW', 'W', 'E')));

SQL> desc acctmanager

Name    Type         Nullable Default Comments

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

AMID    CHAR(4)

AMFIRST VARCHAR2(12)

AMLAST  VARCHAR2(12)

AMEDATE DATE         Y        SYSDATE

AMSAL   NUMBER(8,2)  Y

AMCOMM  NUMBER(7,2)  Y        0

REGION  CHAR(2)      Y

SQL> alter table acctmanager add(amearn as(amsal+amcomm));

Table altered  //一个客户经理的总收入等于固定工资+提出

增加一个虚拟列amearn

SQL> insert into acctmanager(amid,amfirst,amlast,amsal,amcomm,amearn)

2  values ('0001','sam','smith',5000,3000,8000);

insert into acctmanager(amid,amfirst,amlast,amsal,amcomm,amearn)

values ('0001','sam','smith',5000,3000,8000)

ORA-54013: 不允许对虚拟列执行 INSERT 操作

虚拟列不能出现在插入列列表中。

SQL> insert into acctmanager(amid,amfirst,amlast,amsal,amcomm)

2  values ('0001','sam','smith',5000,3000);

1 row inserted

SQL> select amid,amfirst,amlast,amsal,amcomm,amearn

2  from acctmanager;  //虚拟列的数据会在使用的时候自动生成。

AMID AMFIRST      AMLAST            AMSAL    AMCOMM     AMEARN

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

0001 sam          smith           5000.00   3000.00       8000

SQL> update acctmanager set amearn=9000

2  where amid='0001';

update acctmanager set amearn=9000

where amid='0001'

ORA-54017: 不允许对虚拟列执行 UPDATE 操作

SQL> update acctmanager set amearn=8000

2  where amid='0001';

update acctmanager set amearn=8000

where amid='0001'

ORA-54017: 不允许对虚拟列执行 UPDATE 操作

不能对虚拟列进行更新,不管是否违反了虚拟列产生的定义。

SQL> alter table acctmanager drop column amearn;

Table altered  //删除虚拟列的方法与普通列相关

因为虚拟列不存储数据,所以即使在系统繁忙时,也不需要使用

alter table table_name set unused column_name;

来unused一个列,然后在删除,可以直接删除虚列,只是删除

虚拟列的定义。

SQL> desc acctmanager

Name    Type         Nullable Default Comments

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

AMID    CHAR(4)

AMFIRST VARCHAR2(12)

AMLAST  VARCHAR2(12)

AMEDATE DATE         Y        SYSDATE

AMSAL   NUMBER(8,2)  Y

AMCOMM  NUMBER(7,2)  Y        0

REGION  CHAR(2)      Y

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值