create or replace trigger aaa
before insert on TempA
declare
s number;
begin
select count(*) into s from TempA;
:new.cnt:=s;
end;

解决方案 »

  1.   

    CREATE OR REPLACE TRIGGER SCOTT.AAA_ADD
    BEFORE INSERT 
    ON SCOTT.TempA
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
       update TempA set Cnt=(select  count(*)+1 from TempA);
       select  count(*)+1 into :new.Cnt from TempA;
    END;
    /
      

  2.   

    拿到新记录的tableA后,用动态SQL吧
      

  3.   

    to sbaz(万神渡劫),sasacat(傻傻猫):
    TableA和TempA是两个表啊.
      

  4.   

    那就更简单了。这样CREATE OR REPLACE TRIGGER SCOTT.AAA_ADD
    BEFORE INSERT 
    ON SCOTT.TempA
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
       update TempA set Cnt=(select  count(*)+1 from TableA);
    END;
    /
      

  5.   

    to:sasacat(傻傻猫) TableA是哪里来的呢? 我的意思是TableA是从TempA中来的.
    例如:
    表TempA:
    TableNmae    Cnt
    ----------------------------
    order        800
    product      100
    .
    .
    .
    而表order 有800条记录
    表product 有100条记录 
    根据这两个表来更新TempA的Cnt字段.
      

  6.   

    你讲得也太不清楚了,那就写两个触发器,一个在表order上,一个在表product上
    CREATE OR REPLACE TRIGGER AAA_ADD1
    BEFORE INSERT 
    ON order
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
       update TempA set Cnt=(select  count(*)+1 from order) where TableName='order' ;
    END;
    /
    CREATE OR REPLACE TRIGGER AAA_ADD2
    BEFORE INSERT 
    ON product
    REFERENCING NEW AS NEW OLD AS OLD
    FOR EACH ROW
    BEGIN
       update TempA set Cnt=(select  count(*)+1 from product) where TableName='product' ;
    END;
    /
      

  7.   

    不好意思,我的表达能力太差火.
    我不是这个意思.我根本不用关心order表和product表.只是当我把order 表名当作记录插入TempA时,再order 表的记录数来更新TempA中对应order的Cnt字段值.
      

  8.   

    下面是我写的触发器但是编译不通过:
    CREATE OR REPLACE TRIGGER Tri_TempA
    BEFORE INSERT 
    ON TempA
    FOR EACH ROW
    Declare 
       v_Cnt NUMBER;
    BEGIN
         select count(*) into v_Cnt from :new.TableName;
         update TempA set Cnt=v_Cnt where TableName = :new.TableName ;
    END Tri_DateCheck;
    select count(*) into v_Cnt from :new.TJTYPE;
    这句有错,不能这么用,换成表名就没有错.但不满足我的要求,怎么改呢?谢谢各位指点.
      

  9.   

    按 Alkeen()所说的用动态SQL
      

  10.   

    其实你的意思是TempA.Cnt并不单单是根据一个表的记录数来确定,而是对应着多个表的记录数.你想用:new.TableName来动态替换所依据的表名?
      

  11.   

    是的,正是tiantiancn(海之滨) 理解的意思.现在的问题是用:new.TableName来动态替换所依据的表名不能实现.不知道为什么?Alkeen()所说的用动态SQL怎么做?是在程序中处理还是做成存储过程?谢谢!
      

  12.   

    触发器中,如
    CREATE OR REPLACE TRIGGER Tri_TempA
    BEFORE INSERT 
    ON TempA
    FOR EACH ROW
    Declare 
       v_Cnt NUMBER;
    BEGIN
         execute immediate 'select count(*) from '||:new.TableName into :new.Cnt;
    END Tri_DateCheck;
      

  13.   

    非常感谢 bobfang(匆匆过客)使我的问题得到解决.祝工作顺利!