Oracle求触发器写法

CaptainGan 2012-05-24 05:05:09
由于学艺不到家,对Oracle的触发器不深了解,在此求个触发器的写法。

下面是这种情况:

A表中有enterpiseId

和B表中enterpriseId是关联的,

当A表中CRUD时,就在B表的NO字段进行自动+1,但是enterpriseId要和A表中的crud时对应。

这个实例怎么使用触发器实现,求教了。

先多谢各位大侠些了。
...全文
309 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
WSZHAO_SELECT 2014-03-25
  • 打赏
  • 举报
回复

create or replace trigger tri_1
  before insert or delete or update on A
  for each row
  declare
     pragma autonomous_transaction;
  begin
       update B set num=num+1 where B_TID=:new.tid;
       commit;
  end;
hyb22ndf 2012-05-25
  • 打赏
  • 举报
回复
create or replace trigger tri_1
before insert or delete or update on A
for each row
declare
-- local variables here
begin
update B set NO=NO+1 where enterpriseId=:new.enterpiseId;
end tri_1;
changjz 2012-05-25
  • 打赏
  • 举报
回复
说明你的update语句有问题啊
CaptainGan 2012-05-25
  • 打赏
  • 举报
回复

SELECT enterpriseid FROM tb_brandinfo WHERE brandid = (SELECT distinct(tb_dressupinfo.brandorproductid) FROM tb_dressupinfo where tb_dressupinfo.brandorproductid = 1)

执行这个语句是有结果的。
CaptainGan 2012-05-25
  • 打赏
  • 举报
回复


create or replace
TRIGGER DRESSUP_UPDATE_TRIGGER
BEFORE INSERT OR DELETE OR UPDATE ON TB_DRESSUPINFO
FOR EACH ROW
DECLARE
ENTERID NUMBER(32,0);
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT b.enterpriseid INTO ENTERID FROM tb_brandinfo b WHERE b.brandid = (SELECT DISTINCT(t.brandorproductid) FROM tb_dressupinfo t WHERE t.brandorproductid=:old.brandorproductid);
UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1, t.update_date=sysdate,t.enterpriseid=ENTERID WHERE t.update_id=1 AND t.enterpriseid =ENTERID;
END;

我写的这个根据你的修改的,但是还是出现错误。
在我想tb_dressupinfo 中INSERT数据时,
出现
=============
保存对表 "ADMIN"."TB_DRESSUPINFO" 的更改时出现一个错误:
行 9: ORA-01403: 未找到任何数据
ORA-01403: 未找到任何数据
ORA-06512: 在 "ADMIN.DRESSUP_UPDATE_TRIGGER", line 5
ORA-04088: 触发器 'ADMIN.DRESSUP_UPDATE_TRIGGER' 执行过程中出错
ORA-06512: 在 line 1
changjz 2012-05-25
  • 打赏
  • 举报
回复
问题出在SELECT b.enterpriseid INTO V_ENTERID FROM tb_brandinfo b WHERE b.brandid = (SELECT brandorproductid FROM tb_dressupinfo t WHERE t.brandorproductid=:new.brandorproductid);
根据你的错误提示很明显是在作删除操作触发了:
在行 1 上开始执行命令时出错:
DELETE FROM tb_dressupinfo WHERE cardressupid=10
而删除操作时:new.brandorproductid是不存在的,可以使用:old.brandorproductid
还有一个问题是,在触发器里面不能commit;
另外就是你的更新、删除、插入操作时的更新语句是一样的啊

看你写的触发器的功能可以换成这样的:

create or replace
TRIGGER DRESSUP_UPDATE_TRIGGER
BEFORE INSERT OR DELETE OR UPDATE ON TB_DRESSUPINFO
FOR EACH ROW
DECLARE
V_ENTERID NUMBER(32,0);
pragma autonomous_transaction;
BEGIN

SELECT b.enterpriseid INTO V_ENTERID FROM tb_brandinfo b WHERE b.brandid=:old.brandorproductid;

UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1,t.update_date=sysdate,t.enterpriseid=V_ENTERID WHERE t.update_id=1 AND t.enterpriseid =V_ENTERID;
END;

CaptainGan 2012-05-24
  • 打赏
  • 举报
回复
执行这句SQL语句老是报错:


create or replace
TRIGGER DRESSUP_UPDATE_TRIGGER
BEFORE INSERT OR DELETE OR UPDATE ON TB_DRESSUPINFO
FOR EACH ROW
DECLARE
V_ENTERID NUMBER(32,0);
pragma autonomous_transaction;
BEGIN
IF UPDATING OR DELETING THEN
SELECT b.enterpriseid INTO V_ENTERID FROM tb_brandinfo b WHERE b.brandid = (SELECT brandorproductid FROM tb_dressupinfo t WHERE t.brandorproductid=:new.brandorproductid);
UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1, t.update_date=sysdate,t.enterpriseid=V_ENTERID WHERE t.update_id=1 AND t.enterpriseid =V_ENTERID;
ELSIF INSERTING THEN
UPDATE tb_interface_update t SET t.UPDATE_VERSION_NO = t.UPDATE_VERSION_NO+1,t.update_date=sysdate,t.enterpriseid=V_ENTERID WHERE t.update_id=1 AND t.enterpriseid =V_ENTERID;
END IF;
COMMIT;
END;



在行 1 上开始执行命令时出错:
DELETE FROM tb_dressupinfo WHERE cardressupid=10
错误报告:
SQL 错误: ORA-01403: 未找到任何数据
ORA-06512: 在 "ADMIN.DRESSUP_UPDATE_TRIGGER", line 6
ORA-04088: 触发器 'ADMIN.DRESSUP_UPDATE_TRIGGER' 执行过程中出错
01403. 00000 - "no data found"
*Cause:
*Action:

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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