我有一个库存的表,有库位,优先级,和名称之类的列,库位能表示上层和下层,我想做一个触发器,在有上层货物到时,将下层的货物优先级修改小一些,我写了一个总是出错,请问高手怎么解决?CREATE OR REPLACE TRIGGER PROVIEW.TRI_COILS2
AFTER INSERT OR UPDATE
ON PROVIEW.COILS1
FOR EACH ROW
DECLARE
V_NUM1 NUMBER(2);
V_NUM2 NUMBER(2);
V_VAR1 VARCHAR(4);
V_NUM3 NUMBER(4);
BEGIN
IF UPDATING THEN
BEGIN
V_NUM2 := TO_NUMBER(SUBSTR(:NEW.UF3,3,2));
V_NUM1 := TO_NUMBER(SUBSTR(:NEW.UF3,1,2));
V_NUM3 := TO_NUMBER(SUBSTR(:NEW.UF3,1,4));
V_VAR1 := TO_CHAR((V_NUM3-20));
IF ((V_NUM1>=1 AND V_NUM1<=23) AND (V_NUM2>=21 AND V_NUM2<=32) AND:NEW.FLAG = 119 ) THEN
UPDATE COILS1 SET PRIORITY = 0 WHERE UF3 = V_VAR1 AND FLAG = 119;
END IF;
END;
END IF;END;
AFTER INSERT OR UPDATE
ON PROVIEW.COILS1
FOR EACH ROW
DECLARE
V_NUM1 NUMBER(2);
V_NUM2 NUMBER(2);
V_VAR1 VARCHAR(4);
V_NUM3 NUMBER(4);
BEGIN
IF UPDATING THEN
BEGIN
V_NUM2 := TO_NUMBER(SUBSTR(:NEW.UF3,3,2));
V_NUM1 := TO_NUMBER(SUBSTR(:NEW.UF3,1,2));
V_NUM3 := TO_NUMBER(SUBSTR(:NEW.UF3,1,4));
V_VAR1 := TO_CHAR((V_NUM3-20));
IF ((V_NUM1>=1 AND V_NUM1<=23) AND (V_NUM2>=21 AND V_NUM2<=32) AND:NEW.FLAG = 119 ) THEN
UPDATE COILS1 SET PRIORITY = 0 WHERE UF3 = V_VAR1 AND FLAG = 119;
END IF;
END;
END IF;END;
解决方案 »
- ORACLE SQL语句求助 oracle中table中默认存在emp,dept表,在这基础上询问
- 这个问题一定要解决啊。
- 求sql语句,求id为偶数的数据。
- 跪求一个检测数据库中的记录是否过期的触发器.
- 新手 小心地求诸位解惑
- 用SQL语句如何创建一个表,该表拥有另一个表的全部字段,且属性相同?
- 我的硬盘空间不够了,被oracl数据库占了10G,怎么清理数据库,给出空间呢?
- ORACLE 9I 存储过程中的string类型变量最大长度为多少?有没有限制
- oracle workflow 是什么?(在线等!)
- oracle 存储过程调用webservice 取不到返回的参数
- Oracle 问题,求大神解答
- 世界这么大,行业这么多,我想转行看看,求助
可以搜下自治事务。如果使用自治事务,事务的末尾要commit
但这样也会造成一个问题,例如:你往COILS1表中插入一条记录,触发了触发器
此时,自治事务里是看不到这条记录的,因为该记录尚未提交,而自治事务和当前事务属于两个事务
再者,你在自治事务里提交,触发器中的更改即已生效。此时如果你的当前事务没有提交,而是回滚,自治事务中的却不会回滚。可能会造成数据不一致所以需要权衡一下。触发器并不建议使用