第一个表TBInfo中有三个字段MasterId char(18),DTime char(16) 
第二个表TBCount中有两个字段MasterId char(18),DTime char(16) , DCount char(1) 
当像TBCount表中插入数据时触发比如 Insert Into TBCount (MasterId,DTime) Values ('13065019861126001x',‘2009120211260000’)  <DTime是精确到毫秒的时间> 
1.首先判断TBCount表中今天是否有这条数据:Select Count(*) From TBCount Where MasterId='13065019861126001x' And DTime>'今天的零时,像 <2009120200000000>' 
1.如果有0条记录则将这条记录插入TBCount表中,并把DCount字段赋为1; 
2.如果有记录并且记录数小于2则Update把DCount字段++1; 
3.如果有记录并且记录数大于等于2,则抛出异常RAISE_APPLICATION_ERROR(-20055,'INVALID  CODE')阻止其插入; 
这个触发器实现的逻辑就是在一个MasterId在一天之内只能插入两条数据 
我一直用MSSql的,对Oracle的语法不太懂,哪位大侠帮帮忙啊分不是问题

解决方案 »

  1.   

    似乎要行级触发器,还得操作本表的select菜鸟我没辙也坐等高手。
      

  2.   

    好像这个问题我回答过诶
    怎么没了
    bug?
      

  3.   

    ---说明一点:insert时给dcount一个值就行,因为插入后在更新表容易死锁,所以在插入前给Dcount处理一下,因此插入时给dcount一个值就行。
    CREATE OR REPLACE TRIGGER tri_tbcount
      BEFORE INSERT ON tbcount
      FOR EACH ROW
    DECLARE
      n_count NUMBER;
    BEGIN
      SELECT COUNT(1)
        INTO n_count
        FROM tbcount
       WHERE masterID = :NEW.masterid
         AND Dtime > to_char(trunc(SYSDATE, 'DD'), 'yyyy-mm-dd hh24:mi:ss');  IF n_count = 0 THEN
        :NEW.Dcount := 1;
      ELSIF n_count = 1 THEN
        :NEW.Dcount := 2;
      ELSE
        RAISE_APPLICATION_ERROR(-20055, 'INVALIDCODE');
      END IF;END tri_tbcount;
      

  4.   

    你问题描述的TBInfo表好像没什么用。
    这样应该可以解决你问题。
    不过如果表的业务量大建议不要用触发器,容易锁表。
      

  5.   


    create or replace trigger TBCount_insert
    before insert on TBCount for each row
    declare
        pragma  autonomous_transaction;
        cnt     int := 0;
    begin
        select count(1) into cnt
          from TBCount
         where MasterId = :new.MasterId
           and DTime    > to_char(sysdate,'yyyymmdd')||'00000000';
        if cnt = 0 then
            :new.DCount := 1;
        elsif cnt < 2 then
            update TBCount set DCount = DCount + 1 where MasterId = :new.MasterId;
        elsif cnt >=2 then
            RAISE_APPLICATION_ERROR(-20055,'INVALIDCODE');
        end if;
        commit;
    end;
    /