日期:2014-05-17  浏览次数:20686 次

菜鸟请教Oracle触发器写了2个都不行第一次写。
1)数据表里面的每一行记录 如果OBJ_STATUS字段值变成了'ZJGC'的话 那么该行OBJ_UDFCHKBOX05 的值必须是‘+’不是加号就报错。
  DECLARE              
     OBJ   VARCHAR2(30);
              STATUS  VARCHAR2(30);
             KBOX05  VARCHAR2(30);
          begin  
    SELECT   OBJ=OBJ_CODE,STATUS=OBJ_STATUS,KBOX05=OBJ_UDFCHKBOX05   FROM   R5OBJECTS   WHERE   ROWID= :ROWID;
    IF (STATUS='ZJGC' AND KBOX05='-')
    RAISERROR('FLEXBEGIN:选择在建工程是必须先将“是否新建”打"√"!:FLEXEND',16,1) 
        ROLLBACK TRANSACTION
        RETURN
      END IF;
     END;

2)第二个触发器就是从A表里面取数据, 然后到B表里面有一个字段跟A表的数据值相比,如果B表字段值比A表的大就报错。A.prj_code = B.PRJ_CODE (写出来修改数据没反应)


create or replace trigger U5evt_JE
  BEFORE UPDATE on  r5projects
  for each row

DECLARE
  db_error EXCEPTION;
  db_qty  number;
 -- v_sc_qty number;


begin
       SELECT A.bud_total
         INTO db_qty
         FROM
          ( SELECT bud_total,prj_code FROM R5PROJECTS , U5_BUDGET WHERE bud_prjid=prj_code) A

     WHERE A.prj_code = :OLD.PRJ_CODE;
     IF db_qty<=:NEW.PRJ_ACTBUD THEN
      RAISE DB_ERROR ;
      END IF;
EXCEPTION
  WHEN DB_ERROR THEN
    RAISE_APPLICATION_ERROR(-20003,
                            '无法保存' || :OLD.PRJ_CODE ||
                            '保存失败,该金额大于预算金额!');
  WHEN OTHERS THEN
    NULL;
end U5evt_JE;