菜鸟请教Oracle触发器写了2个都不行第一次写。

leizhou90 2013-07-31 07:40:00
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;
...全文
107 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
leizhou90 2013-08-01
  • 打赏
  • 举报
回复
引用 1 楼 jdsnhan 的回复:
第一个,直接引用 :new.OBJ_STATUS,:new.OBJ_UDFCHKBOX05 就行了。 if :new.OBJ_STATUS = 'ZJGC' and :new.OBJ_UDFCHKBOX05 <> '+' then ........ end if; 第二个,谁是A,谁是B啊。在哪个表上触发
A表示查询出来的那张表 B表是 r5projects
jdsnhan 2013-08-01
  • 打赏
  • 举报
回复
第一个,直接引用 :new.OBJ_STATUS,:new.OBJ_UDFCHKBOX05 就行了。 if :new.OBJ_STATUS = 'ZJGC' and :new.OBJ_UDFCHKBOX05 <> '+' then ........ end if; 第二个,谁是A,谁是B啊。在哪个表上触发

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧