我在做开发的时候,有一个表中的字段有default属性,遇到了一个问题一直没有解决,所以在论坛上来求教各位。
第一步建表:
create table dotest
(
  num1  NUMBER(16,2) AS(NVL(NUM2,0) + NVL(NUM3,0) + 0),
  num2  NUMBER(16,2),
  num3  NUMBER(16,2),
  num4  NUMBER(16,2)
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64
    next 8
    minextents 1
    maxextents unlimited
  );
第二步生成一条数据:
INSERT INTO dotest(NUM2,NUM3) VALUES(100,100);
第三步修改数据:
UPDATE dotest SET NUM4 = NUM1 * 1.5;
然后你查询一下数据,看看字段NUM4的值,正常是300
SELECT * FROM dotest;我在项目的生产机上发现了一个问题,生产环境上存在一个这样有default属性字段的表,我用update语句更新其中的一个字段,就如上边用NUM1【default属性的字段】来更新NUM4字段一样,困扰我的问题是更新后的结果一直是0,但是不管我怎么再做如上的测试也不会重现这个问题,最后没有办法我在生产机上重建了这个表,就没有这个问题了。求教各位看看是否也遇到过这个问题,到底是什么原因导致的这个问题。

解决方案 »

  1.   

    哪有default?num1是虚拟列吧
    如果是虚拟列的话,确实num4的值为300是正常的。我猜测,你原来的表中,num1并不是虚拟列,而是default为0的一个字段,因此update后,num4也是0。如果不是这样的话,那就可能是bug
      

  2.   

     num1 NUMBER(16,2) AS(NVL(NUM2,0) + NVL(NUM3,0) + 0) VIRTUAL ,
    你要确定下 num1   是不是 有上面表红的 虚拟列的标识了!
      

  3.   

    在建表的时候需要用num1 NUMBER(16,2) AS(NVL(NUM2,0) + NVL(NUM3,0) + 0),表建完之后你再去看建表的sql,就一变成了 num1 NUMBER(16,2) default NVL(NUM2,0) + NVL(NUM3,0) + 0,而且我确定默认值不是写的0,而是指定列之和。