mysql程序过程语言procedure、触发器trigger

sql 复制代码
CREATE TABLE `accounts` (
  `a_no` int(11) DEFAULT NULL COMMENT '账户编码',
  `a_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '账户名称',
  `a_status` int(11) DEFAULT NULL COMMENT '账户状态',
  `a_bal` float DEFAULT NULL COMMENT '账户余额',
  `open_branch` int(11) DEFAULT NULL COMMENT '开户网点编码',
  `open_branch_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '开户行网点名称',
  `phone_no` int(11) DEFAULT NULL COMMENT '账户移动名称'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into accounts values(1,'test1',1,100,11,'1open',111)
insert into accounts values(3,'test1',1,100,11,'1open',33)
insert into accounts values(2,'test2',1,200,22,'1open',222)
sql 复制代码
CREATE TABLE `branch_sum` (
  `b_no` int(11) DEFAULT NULL COMMENT '网点编码',
  `b_date` date DEFAULT NULL COMMENT '汇总日期',
  `b_name` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '网点名称',
  `all_bal` float DEFAULT NULL COMMENT '网点开户行账户余额'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sql 复制代码
CREATE TABLE `trade_details` (
  `t_date` date DEFAULT NULL COMMENT '交易日期',
  `optr_no` int(11) DEFAULT NULL COMMENT '操作员编码',
  `serial_no` int(11) DEFAULT NULL COMMENT '流水号',
  `t_branch` int(11) DEFAULT NULL COMMENT '交易网点编码',
  `a_no` int(11) DEFAULT NULL COMMENT '账户编码',
  `t_type` int(11) DEFAULT NULL COMMENT '交易类型(1、存款 2、取款)',
  `t_amt` float DEFAULT NULL COMMENT '交易金额',
  `t_result` int(11) DEFAULT NULL COMMENT '交易结果(1、成功 2.失败 3.异常 4.已取消)'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into trade_details values('2026-02-09',1,123,11,2,1,200,1)
insert into trade_details values('2026-02-09',1,123,11,3,2,200,1)

insert into trade_details values('2026-02-09',1,123,11,1,1,500,1)
insert into trade_details values('2026-02-09',1,123,11,1,2,500,1)

CREATE DEFINER=`root`@`localhost` TRIGGER `BalanceNotice` 
AFTER INSERT ON `trade_details` FOR EACH ROW #when NEW.t_result=1
	Begin
declare v_phone varchar(30);
declare	v_type varchar(30);
declare	v_bal int;
declare	v_msg varchar(300);
	

 select phone_no,a_bal into v_phone,v_bal from accounts where a_no=new.a_no;
 
 if new.t_type=1 then
   set  v_type ='存款';
	 set  v_bal=new.t_amt+v_bal;
	 UPDATE accounts set a_bal=v_bal where a_no=new.a_no;
 end if;
 if new.t_type=2 then
    set v_type ='取款';
		set v_bal=v_bal-new.t_amt;
		UPDATE accounts set a_bal=v_bal where a_no=new.a_no;
 end if;
 
    set v_msg =concat(new.t_date,'你的账户',new.a_no,'上执行了',v_type,'交易,存款金额:',new.t_amt,',账号余额为: ',v_bal);
		insert into log values(v_msg);
end;
sql 复制代码
CREATE TABLE `log` (
  `msg` varchar(300) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
sql 复制代码
drop trigger BalanceNotice;
create trigger BalanceNotice
	after insert on trade_details for each row 
	#when NEW.t_result=1
	Begin
declare v_phone varchar(30);
declare	v_type varchar(30);
declare	v_bal int;
declare	v_msg varchar(300);
	
 select phone_no,a_bal into v_phone,v_bal from accounts where a_no=new.a_no;
 
 if new.t_type=1 then
   set  v_type ='存款';
	 set  v_bal=new.t_amt+v_bal;
	 UPDATE accounts set a_bal=v_bal where a_no=new.a_no;
 end if;
 if new.t_type=2 then
    set v_type ='取款';
		set v_bal=v_bal-new.t_amt;
		UPDATE accounts set a_bal=v_bal where a_no=new.a_no;
 end if;
 
    set v_msg =concat(new.t_date,'你的账户',new.a_no,'上执行了',v_type,'交易,存款金额:',new.t_amt,',账号余额为: ',v_bal);
		insert into log values(v_msg);
end
	
sql 复制代码
drop procedure branceBalancesum
create  procedure branceBalancesum(in s_date VARCHAR(20))
Begin
    declare  all_balance int;
    declare	 v_bran_no varchar(10);
    declare	 v_bran_name varchar(30);
    declare	 v_finished int;
    declare c_sum_bal CURSOR FOR   select open_branch,open_branch_name,sum(a_bal) from accounts GROUP BY open_branch,open_branch_name;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;
 
	 open c_sum_bal;
	 process_loop: loop
		    fetch c_sum_bal into  v_bran_no,v_bran_name,all_balance ;
		
		     if v_finished=1 then 
		         LEAVE process_loop;
		     end if ;
		    insert into branch_sum values(v_bran_no,s_date,v_bran_name,all_balance);
		end loop;
		CLOSE c_sum_bal;
		commit;
	END;
	
	call branceBalancesum('2025-02-07')
	
相关推荐
常利兵6 分钟前
Spring项目新姿势:Lambda封装Service调用,告别繁琐注入!
java·数据库·spring
liqianpin142 分钟前
MySQL官网驱动下载(jar包驱动和ODBC驱动)【详细教程】
数据库·mysql
想唱rap1 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
kgduu1 小时前
js之客户端存储
javascript·数据库·oracle
light blue bird1 小时前
原生控件GDI完成作业协同界面
jvm·数据库·.net·winform·gdi+界面
聊点儿技术1 小时前
利用IP归属地查询识别异地登录风险:企业账号安全的技术探索
数据库·tcp/ip·安全
Ricky_Theseus2 小时前
SQL Server 的五种约束类型
数据库·sql·oracle
zjshuster2 小时前
数据库分库分表的方法论与实操
数据库·adb
yige452 小时前
【MySQL】MySQL内置函数--日期函数字符串函数数学函数其他相关函数
android·mysql·adb
一只努力的微服务2 小时前
【Calcite 系列】深入理解 Calcite 的 AggregateValuesRule
大数据·数据库·calcite·优化规则