现在做一个在线付费学习的系统,需要定时扣除用户应付款,我想写个存储过程,但是不知道如何写。具体是这样的:
表A中存储了用户的学习记录,及每次需要支付的金额
用户名 金额 日期时间
student1 30¥ yyyy-mm-dd H:i:s
student2 20¥ ...
student1 20¥ ...表B中是用户的信息,包括其可用金额
用户名 可用金额
student1 100¥
student2 400¥我要实现的功能就是根据表A的记录,在表B中扣除相应的应付款,比如说student1,需要扣除他30¥+20¥=50¥求教
表A中存储了用户的学习记录,及每次需要支付的金额
用户名 金额 日期时间
student1 30¥ yyyy-mm-dd H:i:s
student2 20¥ ...
student1 20¥ ...表B中是用户的信息,包括其可用金额
用户名 可用金额
student1 100¥
student2 400¥我要实现的功能就是根据表A的记录,在表B中扣除相应的应付款,比如说student1,需要扣除他30¥+20¥=50¥求教
set b.可用金额=b可用金额-c.sAmt
where b.用户名=c.用户名;
set b.可用金额=b.可用金额-t.金额
from (select 用户名,sum(金额) as 金额 from A group by 用户名) t
where b.用户名=t.用户名这里统计A表的金额应该加个时间条件,或者在A表加个是否已扣款的标识,防止重复扣款
josy说的很对,A表是有一个是否已扣款的标识,我忘记讲了,怎么在扣款的同时(楼上两位写的sql语句)更改这个标识呢(比如从0改成1)?
set b.可用金额=b.可用金额-t.金额
from (select 用户名,sum(金额) as 金额 from A group by 用户名) t
where b.用户名=t.用户名update a set 扣款标识=1if @@ERROR <> 0 ROLLBACK TRANSACTION
COMMIT TRANSACTION加个事务保证修改扣款标识不成功时,不扣款
update test.b set course='english';
update test.b set score='ss';
if @@ERROR <> 0 ROLLBACK;
COMMIT;
josy,上面这个是我做的测试,第二个update语句是会出错的,我在Mysql Administrator里执行,第一个update语句还是把数据给更新了。在命令行执行的时候报"if @@ERROR"附近语法错误。求教
if语句出现错误了。
好好看看语法吧。
update test.b set score='ss';IF @@ERROR <> 0
BEGIN
ROLLBACK TRANSACTION;
END
COMMIT TRANSACTION;
这样呢?
我把这段放到procedure里,
CREATE PROCEDURE `test`.`t_test` ()
BEGIN
START TRANSACTION; update test.b set course='english';
update test.b set score='ss'; IF @@ERROR <> 0
BEGIN
ROLLBACK;
END
COMMIT;
END
创建的时候说ERROR不是正确的系统变量(Unknown system variable 'ERROR')
请测试一下
CREATE PROCEDURE `test`.`t_test` ()
BEGIN
START TRANSACTION; update test.b set course='english';
update test.b set score='ss'; ROLLBACK;END
START TRANSACTION; update test.b set course='english';
update test.b set score='ss'; ROLLBACK;
这样的时候,我call t_test()的时候报第二个update有错(因为‘ss’类型和列类型不符),第一个update无效。但是我把score的值改了以后:
START TRANSACTION; update test.b set course='english';
update test.b set score='50'; ROLLBACK;这样的话不出错,但是第一个update成功了,第二个没效果。
update test.b set score='ss';COMMIT;
这样就可以了