MySQL存储过程怎么写啊,求具体代码 谢谢 20C

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

考虑:后期校区可能增加,操作类型也可能增加

建议:创建 相关的校区表,存储校区、编号;操作类型表,存储操作类型、编号

6个回答

百度一大堆,各种存储过程

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;  

编程不适合你,你转行吧!做为一个程序员需要自己学习。这种东西没难度

########## 以下实现,基于MySQL数据库,实际使用时,可依据自己情况调整

创建流水记录表(表名和其余字段可自己定义)

create table table_name(serialNo varchar(32) comment '流水号' default '',...,primary key(serialNo))
engine=InnoDB default CHARSET=utf8 comment='流水记录表';

考虑到流水号中标识符右侧3位长度不太够用,函数实现中使用了6位,实际使用中可自行修改,也可动态传入(需要自己实现)

prefix 为前缀,如:FTJF、NSJF 等; symbol 为中间标识符,如:-

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;

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问