菜鸟请教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;