有两表a,b
a表 b表
name money state name money2
小李 5.0 1 小李 36.3
小王 3.0 2 小王 55.6现欲实现一触发器,在每次用insert语句插入a 表时,判断如果状态为1,则此人在b表的money2+money,如果为2,则b表此人的money2-money。
小弟还不会写触发器,请大家帮帮忙。
a表 b表
name money state name money2
小李 5.0 1 小李 36.3
小王 3.0 2 小王 55.6现欲实现一触发器,在每次用insert语句插入a 表时,判断如果状态为1,则此人在b表的money2+money,如果为2,则b表此人的money2-money。
小弟还不会写触发器,请大家帮帮忙。
解决方案 »
- 以下语句为何报错?RA-00979: not a GROUP BY expression
- 能不能用sql的查询语句把查询到的多于一列的内容在一列里显示啊?
- 求牛人ORACLE 直接 SQL 解决!!!
- ORACLE10G中sys密码忘记了怎么办??
- 求救!!请各位帮忙!谢谢!急用阿!
- 求救大牛:安装oracle11gr2_64出现问题,按到85%就开始出错,导致后面安装完成,不能启动。
- 在线等待 请问 在9i中 数据库的实例名就是sid名吗? 数据库名和服务名也是同一个名字吗?
- 各位高手帮我看看这个存储过程那里有问题。Thx~~~~~
- 帮我看一下如下的存储过程,执行后不显示结果
- 同时熟悉sql server和oracle的大侠们评估一下:系统从sql server 迁移到oracle的工作量(详情见帖)
- 怎么把AA13字段(varchar2)长度大于4的记录select出来
- 一个关于自动查询的问题?
AFTER INSERT ON A FOR EACH ROW
BEGIN
UPDATE B SET MONEY2=MONEY2+SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
END;
AFTER INSERT ON A FOR EACH ROW
BEGIN
UPDATE B SET MONEY2=MONEY2-SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
END;
a表 b表
name money state name money1 money2
小李 5.0 1 小李 32 36.3
小王 3.0 2 小王 11 36.3如果为1的话加到money1,2时加到money,是否要用到if判断?
....
IF :NEW.STATE=1 THEN
UPDATE B SET MONEY1=MONEY1+:NEW.MONEY WHERE NAME=:NEW.NAME;
ELSIF :NEW.STATE=2 THEN
UPDATE B SET MONEY2=MONEY2+:NEW.MONEY WHERE NAME=:NEW.NAME;
END IF;
.....当然也可以用一条语句:
...
UPDATE B
SET MONEY1=MONEY1+DECODE(:NEW.STATE,1,:NEW.MONEY,0),
MONEY2=MONEY2+DECODE(:NEW.STATE,2,:NEW.MONEY,0)
WHERE NAME=NEW.NAME;
...
AFTER INSERT ON A
FOR EACH ROW BEGIN IF :new.state = 0 THEN UPDATE B SET MONEY2=MONEY2-SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
IF :new.state = 1 THEN UPDATE B SET MONEY2=MONEY2+SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
END IF ;
END ;
CREATE OR REPLACE TRIGGER TREATE_DATA AFTER INSERT ON A FOR EACH ROW
BEGIN
IF :new.state = 0 THEN
UPDATE B SET MONEY2=MONEY2-SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
END IF
IF :new.state = 1 THEN
UPDATE B SET MONEY2=MONEY2+SIGN(:NEW.STATE-1.5)*:NEW.MONEY WHERE NAME=:NEW.NAME;
END IF
END ;
IF :NEW.STATE=1 THEN
UPDATE B SET MONEY1=MONEY1+:NEW.MONEY WHERE NAME=:NEW.NAME;
ELSIF :NEW.STATE=2 THEN
UPDATE B SET MONEY2=MONEY2+:NEW.MONEY WHERE NAME=:NEW.NAME;
END IF;
.....
可是oracle总是报MONEY1和MONEY2 出错。但是用decode就没问题 ,不知怎么回事?
那么需要在定义部分加入"pragma autonomous_transaction;" --自治事务......
谢谢两位,结帖!
IF :NEW.STATE=1 THEN
UPDATE B SET MONEY2=MONEY2+:NEW.MONEY WHERE NAME=:NEW.NAME;
ELSIF :NEW.STATE=2 THEN
UPDATE B SET MONEY2=MONEY2-:NEW.MONEY WHERE NAME=:NEW.NAME;
END IF;
就可以了。