小弟在SqlServer移植到Oracle9i的过程中遇到了一个问题。
具体是这样的:
在原先的SqlServer中有表A(IID,col1,col2,col3),其中IID是序号,col3=col1+col2,col3是用公式实现的。由于Oracle中没有公式这一概念,得用触发器去实现。现在的问题是,我怎么在触发器中得到被更新记录的序列号,要不然我就得对表A中所有记录套用公式:col3=col1+col2,这显然是不现实也不合理的。
还望各位大虾赐教啊,谢谢了。

解决方案 »

  1.   

    ;new.IID即是,简单例子
    create or replace trigger tgname
    after insert on tabname
    for each row
    declare
    v_count number;
    begin
    select count(1) into v_count from 主表 where id=:new.id;
    if v_count=0 then
    insert into 主表 values (:new.id,:new....);
    else
    update 主表 set 数量=数量+:new.数量 where id=:new.id;
    end if;
    end; 
      

  2.   

    是冒号,
    :new表示新值,:old表示旧值。create or replace trigger tgname
    before insert or update on tabname
    for each row
    begin
        :new.col3 = nvl(:new.col1,0)+nvl(:new.col2,0);
    end; 
    这样应该就可以了。只针对你插入或者修改的那条记录的(for each row了,行级触发器)。
      

  3.   

    oracle的行级触发器就是针对每一行的,在触发器中使用:new.IID就行了
      

  4.   

    直接触发器new.col3 :=  new.col1+new.col2;就行了,不需要知道ID号。 new 比SQL SERVER中的insert表方便一些。
      

  5.   

    10G没有,如果11G就有类似mssql中公式Col3是公式列,没有什么意义,你在查询的时候手工增加 Col1+Col2 as Col3就行了
      

  6.   

    直接上代码了
    下面是触发器主体begin
        :new.税款合计 = nvl(:new.资源税合计,0)+nvl(:new.个人所得税合计,0)+nvl(:new.企业所得税合计,0)+nvl(:new.营业税合计,0)+nvl(:new.城建税合计,0)+nvl(:new.房产税合计,0)+
        nvl(:new.印花税合计,0)+nvl(:new.土地使用税合计,0)+nvl(:new.土地增值税合计,0)+nvl(:new.车船使用税合计,0)+nvl(:new.教育费附加合计,0);
        :new.基金合计 = nvl(:new.文化事业建设费收入合计,0)+nvl(:new.防洪保安资金合计,0)+nvl(:new.残疾人就业保障金合计,0)+nvl(:new.工会经费合计,0)+nvl(:new.价格调节基金合计,0)+
        nvl(:new.社保基金合计,0);
        :new.合计 = nvl(:new.税款合计,0)+nvl(:new.基金合计,0);
    end;其中税款合计,基金合计,合计就是所谓的col3
    事件我选择了插入和更新列(我将上面等式右边所有的列都勾上了)
    高级里面我选择逐行触法
    但是编译后的结果是
    行号= 2 列号= 19 错误文本= PLS-00103: 出现符号 "="在需要下列之一时:  := . ( @ % ; indicator 
    行号= 4 列号= 5 错误文本= PLS-00103: 出现符号 ""
    行号= 5 列号= 29 错误文本= PLS-00103: 出现符号 ";"在需要下列之一时:  . ( * % & - + / at mod rem    return returning <an exponent (**)> and or || 符号 "(在 ";" 继续之前已插入。 
    行号= 6 列号= 58 错误文本= PLS-00103: 出现符号 ";"在需要下列之一时:  . ( ) , * % & - + / at mod    rem <an exponent (**)> and or using || 
      

  7.   

    PS,小弟才开始接触Oracle,很多地方都不太懂,还望各位大侠多多赐教,小弟在此先谢过了
      

  8.   

    刚才我把触发器的主体中的冒号全部去掉了(之前理解错了)
    把=修正为‘:=’,编译后,又出现:
    行号= 2 列号= 5 错误文本= PLS-00201: 必须说明标识符 'NEW.税款合计'
    行号= 2 列号= 5 错误文本= PL/SQL: Statement ignored
    行号= 4 列号= 5 错误文本= PLS-00201: 必须说明标识符 'NEW.基金合计'
    行号= 4 列号= 5 错误文本= PL/SQL: Statement ignored
    行号= 6 列号= 5 错误文本= PLS-00201: 必须说明标识符 'NEW.合计'
    行号= 6 列号= 5 错误文本= PL/SQL: Statement ignored
    但是这三个字段明明是存在于表中的啊,我那里又犯错了,还是我一开始就错了?
    (CSDN普通用户不可以编辑帖子,这个)