SQL 语句实现
系统有福田、南山、罗湖三个校区,编号分别为 FT、NS、LH;有缴费、退费、结转、转让4种操作类型,每个操作对应的编号分别为 JF、TF、JZ、ZR
需求,用户进行缴费、退费、结转、转让操作时,需要根据校区、操作类型、操作日期生成相应的编号,编号生成规则:
1、校区编号 + 操作类型编号 + yyyyMMdd + '-' + '***'
2、yyyyMMdd:代表日期格式,如20160522
3、***代表自增符号,从1开始递增,不足三位则补前导0
即每个校区,每种操作类型,都有自己的编号,且每天的编号都是从001开始,
要求:写一个存储过程或函数,来生成编号。
如:
2016-05-22
福田校区收费,第一笔收费编号为—— FTJF20160522-001,第二笔缴费编号为FTJF20160522-002,... 第10笔缴费编号为 FTJF20160522-010
福田校区转让,第一笔转让编号为—— FTZR20160522-001,第二笔转让编号为FTZR20160522-002,... 第10笔转让编号为 FTZR20160522-010
2016-05-23
福田校区收费,第一笔收费编号为—— FTJF20160523-001,第二笔缴费编号为FTJF20160523-002,... 第10笔缴费编号为 FTJF20160523-010
福田校区转让,第一笔转让编号为—— FTZR20160523-001,第二笔转让编号为FTZR20160523-002,... 第10笔转让编号为 FTZR20160523-010
考虑:后期校区可能增加,操作类型也可能增加
建议:创建 相关的校区表,存储校区、编号;操作类型表,存储操作类型、编号
百度一大堆,各种存储过程
http://blog.csdn.net/weixin_36380516/article/details/68576444
oracle的存储过程写法,但大同小异
存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在Oracle 中,若干个有联系的过程可以组合在一起构成程序包。
这是我之前写过的一个mysql存储过程,可以仿照着写。
drop procedure if exists count_pass_same;
CREATE PROCEDURE count_pass_same()
BEGIN
#定义 变量 存储用户个数
DECLARE count int;
#定义 变量 存储用户密码
DECLARE pass VARCHAR(60);
#此变可有可无,为了给个该存储函数执行成功后给个提示,运行下便知道
DECLARE str VARCHAR(300);
#这个用于处理游标到达最后一行的情况
DECLARE s int default 0;
#声明游标cursor_name(cursor_name是个多行结果集) 获取密码查询的结果集
DECLARE cursor_name CURSOR FOR select id from temp_id ;
#设置一个终止标记 似乎通用
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;
# 提示信息的打印
set str = "--";
#打开游标
OPEN cursor_name;
#获取游标当前指针的记录,读取一行数据并传给变量pass
fetch cursor_name into pass;
#开始循环,判断是否游标已经到达了最后作为循环条件
while s <> 1 do
#查询使用当前密码的用户个数
SELECT count(*) into count FROM account_info t WHERE t.user_pass = MD5(CONCAT(pass,t.pass_rand_str));
#设置提示信息
set str = concat(pass,'|',count);
#将获取的密码值及统计个数插入提前建好的数据库
insert into count_password_same(`password`,count) values(pass,count);
#打印提示信息
SELECT str;
#读取下一行的数据
fetch cursor_name into pass;
end while;
#关闭游标
CLOSE cursor_name ;
#语句执行结束
END;
编程不适合你,你转行吧!做为一个程序员需要自己学习。这种东西没难度
create table table_name(serialNo varchar(32) comment '流水号' default '',...,primary key(serialNo))
engine=InnoDB default CHARSET=utf8 comment='流水记录表';
create function genSerialNo(prefix varchar(8), symbol varchar(8))
returns varchar(32) language sql
begin
# 生成流水号标识符
declare flag varchar(2) default '';
# 新流水号
declare serialNo varchar(32) default '';
# 最大流水号
declare maxSerialNo varchar(32) default '';
# 中间标识符右侧数值(字符串)
declare symRightStr varchar(6) default '';
# 中间标识符右侧数值(数字)
declare symRightInt int(6) default 0;
# 数字转换字符串结果
declare convertIntToStr varchar(6) default '';
# serialNo 字段:流水号、table_name 表名
# 获取当前表中最大流水号,如:FTJF20170401-100
set maxSerialNo = (select max(serialNo) from table_name where serialNo like CONCAT('''',prefix,date_format(CURDATE(), '%Y%m%d'),'%'''));
# 流水号存在,置标识为 00
# 流水号不存在,初始化流水号
if(maxSerialNo is not null and maxSerialNo <> '') then
set flag = '00';
set symRightStr = substr(maxSerialNo, length(maxSerialNo)-5, length(maxSerialNo));
else
set serialNo = CONCAT(prefix,date_format(CURDATE(), '%Y%m%d'),symbol,'000001');
end if;
# 在最大流水号上自增
if(flag == '00') then
set symRightInt = CAST(symRightStr AS SIGNED);
set symRightInt = symRightInt + 1;
set convertIntToStr = CAST(symRightInt AS CHAR);
set serialNo = CONCAT(prefix,date_format(CURDATE(), '%Y%m%d'),symbol,substr(symRightStr, 1, length(symRightStr)-length(convertIntToStr)),convertIntToStr)
end if;
# 返回新流水号
return serialNo;
end;
select genSerialNo('FTJF', '-') from table_name limit 1;