美文网首页
Mysql数据库-存储过程

Mysql数据库-存储过程

作者: 老张_Jason | 来源:发表于2019-10-25 17:51 被阅读0次

    Mysql数据库-存储过程

    https://www.cnblogs.com/phpper/p/7361841.html

    一、什么是存储过程

    存储过程其实就是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。

    【存储过程就是SQL语句集】

    MySQL中提供存储过程与存储函数机制,我们姑且将存储过程和存储函数合称为存储程序。与一般的SQL语句需要先编译然后立即执行不同,存储程序是一组为了完成特定功能的SQL语句集经编译后存储在数据库中,当用户通过指定存储程序的名字并给定参数(如果该存储程序带有参数)来调用才会执行。

    存储程序就是一条或者多条SQL语句和控制语句的集合,我们可以将其看作MySQL的批处理文件,当然,其作用不仅限于批处理。当想要在不同的应用程序或平台上执行相同的功能一段程序或者封装特定功能时,存储程序是非常有用的。数据库中的存储程序可以看做是面向对编程中面向对象方法,它允许控制数据的访问方式。

    理解:

    数据库的存储过程好比是python的函数,类似于函数,可以定义存储过程(类似于封装一个函数,只是存储过程中是将一些SQL语句集合封装在一起,形成一个具有特定功能的模块/函数),调用存储过程

    目的:

    为测试构造大批量的数据

    存储过程是数据库的一个重要的功能,MySQL 5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0开始支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。

    优点:

    • (1).增强SQL语言的功能和灵活性:存储过程可以用控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。
    • (2).标准组件式编程:存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。
    • (3).较快的执行速度:如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。
    • (4).减少网络流量:针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织进存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大减少网络流量并降低了网络负载。
    • (5).作为一种安全机制来充分利用:通过对执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。

    二、创建存储过程

    创建存储过程语法结构如下:

    CREATE PROCEDURE  过程名([[IN|OUT|INOUT] 参数名 数据类型[,[IN|OUT|INOUT] 参数名 数据类型…]]) [特性 ...]
    
    BEGIN
        过程体
    END
    

    CREATE PROCEDURE是用来创建存储过程的关键字;[IN|OUT|INOUT]是参数的输入输出类型,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;过程体是包含若干SQL语句或流程控制语句的集合,可以用BEGIN…END来包裹。

    delimiter //                    # 定义结束符
    create procedure show()         # 创建存储过程,存储过程的名称是show
    begin
        # SQL语句集
    end
    //                              # 表示存储过程写完了
    delimiter ;                     # 恢复结束符
    

    案例体验:

    在演示如果创建存储过程之前(emp表、dept表),先创建两个数据表,本文所有演示操作都基于这两个表来进行,创建表与插入数据SQL语句如下:

    DROP TABLE IF EXISTS `emp`;
    
    CREATE TABLE `emp`  (
      `empno` int(4) NOT NULL,
      `ename` varchar(10) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
      `job` varchar(9) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
      `mgr` int(4) NULL DEFAULT NULL,
      `hiredate` date NULL DEFAULT NULL,
      `sal` float(7, 2) NULL DEFAULT NULL,
      `comm` float(7, 2) NULL DEFAULT NULL,
      `deptno` int(2) NULL DEFAULT NULL,
      PRIMARY KEY (`empno`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
    
    INSERT INTO `emp` VALUES (7369, 'SMITH', 'CLERK', 7902, '1998-12-17', 800.00, NULL, 20);
    INSERT INTO `emp` VALUES (7499, 'ALLEN', 'SALESMAN', 7698, '1981-02-20', 1600.00, 300.00, 30);
    INSERT INTO `emp` VALUES (7521, 'WARD', 'SALESMAN', 7698, '1981-02-22', 1250.00, 500.00, 30);
    INSERT INTO `emp` VALUES (7566, 'JONES', 'MANAGER', 7839, '1981-04-02', 2975.00, NULL, 20);
    INSERT INTO `emp` VALUES (7654, 'MARTIN', 'SALESMAN', 7698, '1981-09-28', 1250.00, 1400.00, 30);
    INSERT INTO `emp` VALUES (7698, 'BLAKE', 'MANAGER', 7839, '1981-05-01', 2850.00, NULL, 30);
    INSERT INTO `emp` VALUES (7782, 'CLARK', 'MANAGER', 7839, '1981-06-09', 2450.00, NULL, 10);
    INSERT INTO `emp` VALUES (7788, 'SCOTT', 'ANALYST', 7566, '1981-11-17', 3000.00, NULL, 20);
    INSERT INTO `emp` VALUES (7839, 'KING', 'PRESIDENT', NULL, '1981-11-17', 5000.00, NULL, 10);
    INSERT INTO `emp` VALUES (7844, 'TURNER', 'SALESMAN', 7698, '1981-09-08', 1500.00, 0.00, 30);
    INSERT INTO `emp` VALUES (7876, 'ADAMS', 'CLERK', 7788, '1987-05-23', 1100.00, NULL, 20);
    INSERT INTO `emp` VALUES (7900, 'JAMES', 'CLERK', 7698, '1981-12-03', 950.00, NULL, 30);
    INSERT INTO `emp` VALUES (7902, 'FORD', 'ANALYST', 7566, '1981-12-03', 3000.00, NULL, 20);
    INSERT INTO `emp` VALUES (7934, 'MILLER', 'CLERK', 7782, '1982-02-23', 1300.00, NULL, 10);
    INSERT INTO `emp` VALUES (8888, 'CHB', 'CLERK', 7369, '2018-12-10', 8000.00, 100.00, NULL);
    
    DROP TABLE IF EXISTS `dept`;
    
    CREATE TABLE `dept`  (
      `deptno` int(2) NOT NULL,
      `dname` varchar(14) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
      `loc` varchar(13) CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL DEFAULT NULL,
      PRIMARY KEY (`deptno`) USING BTREE
    ) ENGINE = InnoDB CHARACTER SET = latin1 COLLATE = latin1_swedish_ci ROW_FORMAT = Compact;
    
    INSERT INTO `dept` VALUES (10, 'ACCOUNTING', 'NEW YORK');
    INSERT INTO `dept` VALUES (20, 'RESEARCH', 'DALLAS');
    INSERT INTO `dept` VALUES (30, 'SALES', 'CHICAGO');
    INSERT INTO `dept` VALUES (40, 'OPERATIONS', 'BOSTON');
    

    建好表后,我们来创建一个存储过程。

    示例1:通过存储过程完成查询每个员工编号(empno)、姓名(ename)、职位(job)、领导编号(mgr)、领导姓名(empno)、部门名称(dname)、部门位置(loc)。

    delimiter //
    create procedure select_pro()
    begin
        select e1.empno bianhao, e1.ename xingming, e1.job zhiwei, e1.mgr lindaobianhao, e2.ename lindaoxingming, d.dname bumenmingchen, d.loc bumenweizhi from emp e1 , emp e2 , dept d where e1.mgr=e2.empno and e1.deptno=d.deptno ;
    
    end //
    delimiter ;
    

    注:“delimiter //”语句的作用是将MySQL的结束符设置为//,因为MySQL默认的语句结束符是分号“;”,为了避免与存储过程中的SQL语句结束符相冲突,需要使用delimiter改变存储过程的结束符,设置为以“end //”结束存储过程。存储过程定义完毕之后,再使用“delimiter;”回复默认结束符。delimiter也可以指定其他符号作为结束符(“\”除外,这是转义字符)。当然,如果你在Navicat等图形界面下进行,可以不用设置delimiter。

    二、调用存储过程

    示例1中SQL语句创建了一个名为select_pro的存储过程,通过“call select_pro()”,即可完成查询功能,不在需要每次查询都重写查询语句。

    格式:call 存储过程名();
    
    call  select_pro()
    

    三、查询存储过程

    show procedure status;
    

    四、删除存储过程

    如果存储过程写错了,需要进行修改时,只能删除原先的存储过程,重新定义;

    drop procedure 存储过程的名称;
    

    五、创建带参数的存储过程

    示例2:创建一个带参数的存储过程,删除emp表中empno为指定值得记录,并返回最高最高月薪,也返回大于指定月薪的人数。

    delimiter //
    create procedure param_pro(in id int , out num int, inout p_sal int)
    begin
        delete from emp where empno = id ;
        select max(sal) from emp into num;
        select count(*) into p_sal from emp where sal >P_sal ;
    end //
    delimiter ;
    

    调用上面创建好的存储过程param_pro:

    set @p_sal = 1250 ;
    call param_pro(7369 , @num , @p_sal);
    select @num , @p_sal ;
    

    六、存储函数

    • 查看mysql数据库是否开启了函数功能
    show variables like 'log_bin_trust_function_creators';
    
    set global log_bin_trust_function_creators=1;
    
    • 查询mysql数据库中的函数
    show function status;
    

    生成随机英文字符

    delimiter //
    drop function if exists rand_string;
    create function rand_string(n int) returns varchar(255)
    begin
        declare chars_str varchar(52) default 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
        declare return_str varchar(255) default '';
        declare i int default 0;
        while i<n do
        set return_str=concat(return_str,substring(chars_str,floor(1+rand()*52),1));
        set i=i+1;
        end while;
        return return_str;
    end //
    delimiter;
    

    生成随机汉字

    drop function if exists rand_name;
    delimiter //
    -- 生成用户姓名
    create definer=`root`@`localhost` function `rand_name`(n int) returns varchar(255) charset utf8
    begin
        declare char_str varchar(255) default '哈哈章与张霞笑小欧由于语塔堆太湖想笑一二三四五六七八九十宇宇你是最耀眼的星星再干一杯永远生命不过短暂的烟火爱你所爱无问西东';
        declare return_name varchar(255) default '';
        declare i int default 0;
        declare j int default 0;
        declare length_str int default length(char_str)/3;
        
        set j = floor(1+rand()*length_str);
        if j%2 then
            set j=j;
        else 
            set j=j+1;
        end if;
    
        while i < n do
            set return_name = concat(return_name, substring(char_str,j,2));
    
            set j = floor(1+rand()*length_str);
            if j%2 then
                set j=j;
            else 
                set j=j+1;
            end if;
            
            set i = i + 1;
        end while;
        return return_name;
    end//
    delimiter;
    

    生成电话号码

    #电话号码头部
    drop function if exists `phone_head`;
    delimiter //
    create definer=`root`@localhost function `phone_head`() returns char(3) charset utf8
    begin
        declare head char(3);
        declare bodys varchar(225) default'130 131 132 133 134 135 136 137 138 139 186 187 189 151 157';
        declare starts int;
        set starts = 1 + floor(rand()*15)*4 ;
        set head =trim(substring(bodys,starts,3));
        return head;
    end//
    delimiter ;
    
    #生成随机数字串
    drop function if exists `rand_string_num`;
    delimiter //
    create definer=`root`@`IP地址` function `rand_string_num`(n int) returns varchar(255) charset utf8
    begin
        declare char_str varchar(255) default '0123456789';
        declare return_str varchar(255) default '';
        declare i int default 0;
        while i < n do
            set return_str=concat(return_str,substring(char_str,floor(1+rand()*10),1));
            set i=i+1;
        end while;
        return return_str;
    end //
    delimiter;
    
    #生成电话号码
    drop function if exists `get_phone`;
    delimiter //
    create definer=`root`@`IP地址` function `get_phone`() returns varchar(20) charset utf8
    begin
        declare phone varchar(11);
        set phone = trim(concat(phone_head(),rand_string_num(8)));
        return phone;
    end //
    delimiter ;
    
    drop function if exists `phone`;
    delimiter //
    create definer=root@localhost function phone() returns char(11) charset utf8
    begin
        declare head varchar(3) default '';
        declare bodys varchar(225) default '130 131 132 133 134 135 136 137 138 139 186 187 189 151 157';
        declare starts int;
        declare num varchar(8);
        declare phone_num varchar(11);
        set starts = 1 + floor(rand()*15)*4;
        set head =trim(substring(bodys,starts,3));          
        set num = FLOOR(RAND()*500000000 + 5000000000);
        set phone_num = concat(head,num);
        return phone_num;
    end//
    delimiter;  
    

    随机生成名字—存储过程

    drop PROCEDURE if exists jishu5;
    DELIMITER //
    CREATE PROCEDURE jishu5()
    BEGIN
        DECLARE xing varchar(2056) DEFAULT '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';
        DECLARE ming varchar(2056) DEFAULT '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';
        DECLARE l_xing int DEFAULT LENGTH(xing) / 3; # 这里的长度不是字符串的字数,而是此字符串的占的容量大小,一个汉字占3个字节
        DECLARE l_ming int DEFAULT LENGTH(ming) / 3;
        
        DECLARE str_xing varchar(255) DEFAULT '';
        DECLARE str_ming varchar(255) DEFAULT '';
        DECLARE rand_name varchar(255) DEFAULT '';
        declare i int(4) default 0;
        set i = FLOOR(1+RAND()*l_xing);
    
        # 先选出姓
        if i%2 THEN
            set i = i;
        ELSE
            set i = i + 1;
        END IF;
        
        SET str_xing = CONCAT(str_xing, SUBSTRING(xing, i, 2));
        
        #再选出名
        SET str_ming = CONCAT(str_ming, SUBSTRING(ming, i, 4));
    
        SET rand_name =concat(str_xing,str_ming);
    
        select rand_name;
    END //
    delimiter;
    

    随机生成名字—存储函数

    drop function if exists `get_name`;
    delimiter //
    create definer=`root`@`IP地址` function `get_name`(n int) returns varchar(255) 
    begin
        DECLARE xing varchar(2056) DEFAULT '赵钱孙李周郑王冯陈楮卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闽席季麻强贾路娄危江童颜郭梅盛林刁锺徐丘骆高夏蔡田樊胡凌霍虞万支柯昝管卢莫经裘缪干解应宗丁宣贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁';
        DECLARE ming varchar(2056) DEFAULT '嘉懿煜城懿轩烨伟苑博伟泽熠彤鸿煊博涛烨霖烨华煜祺智宸正豪昊然明杰诚立轩立辉峻熙弘文熠彤鸿煊烨霖哲瀚鑫鹏致远俊驰雨泽烨磊晟睿天佑文昊修洁黎昕远航旭尧鸿涛伟祺轩越泽浩宇瑾瑜皓轩擎苍擎宇志泽睿渊楷瑞轩弘文哲瀚雨泽鑫磊梦琪忆之桃慕青问兰尔岚元香初夏沛菡傲珊曼文乐菱痴珊恨玉惜文香寒新柔语蓉海安夜蓉涵柏水桃醉蓝春儿语琴从彤傲晴语兰又菱碧彤元霜怜梦紫寒妙彤曼易南莲紫翠雨寒易烟如萱若南寻真晓亦向珊慕灵以蕊寻雁映易雪柳孤岚笑霜海云凝天沛珊寒云冰旋宛儿绿真盼儿晓霜碧凡夏菡曼香若烟半梦雅绿冰蓝灵槐平安书翠翠风香巧代云梦曼幼翠友巧听寒梦柏醉易访旋亦玉凌萱访卉怀亦笑蓝春翠靖柏夜蕾冰夏梦松书雪乐枫念薇靖雁寻春恨山从寒忆香觅波静曼凡旋以亦念露芷蕾千兰新波代真新蕾雁玉冷卉紫山千琴恨天傲芙盼山怀蝶冰兰山柏翠萱乐丹翠柔谷山之瑶冰露尔珍谷雪乐萱涵菡海莲傲蕾青槐冬儿易梦惜雪宛海之柔夏青亦瑶妙菡春竹修杰伟诚建辉晋鹏天磊绍辉泽洋明轩健柏煊昊强伟宸博超君浩子骞明辉鹏涛炎彬鹤轩越彬风华靖琪明诚高格光华国源宇晗昱涵润翰飞翰海昊乾浩博和安弘博鸿朗华奥华灿嘉慕坚秉建明金鑫锦程瑾瑜鹏经赋景同靖琪君昊俊明季同开济凯安康成乐语力勤良哲理群茂彦敏博明达朋义彭泽鹏举濮存溥心璞瑜浦泽奇邃祥荣轩';
        DECLARE l_xing int DEFAULT LENGTH(xing) / 3; # 这里的长度不是字符串的字数,而是此字符串的占的容量大小,一个汉字占3个字节
        DECLARE l_ming int DEFAULT LENGTH(ming) / 3;
        
        DECLARE str_xing varchar(255) DEFAULT '';
        DECLARE str_ming varchar(255) DEFAULT '';
        DECLARE rand_name varchar(255) DEFAULT '';
        declare i int(4) default 0;
        declare j int(4) default 0;
        
        set i = FLOOR(1+RAND()*l_xing);
    
        # 先选出姓
        if i%2 THEN
            set i = i;
        ELSE
            set i = i + 1;
        END IF;
        
        SET str_xing = CONCAT(str_xing, SUBSTRING(xing, i, 2));
        
        #再选出名
        while j<n do 
            SET str_ming = CONCAT(str_ming, SUBSTRING(ming, i, 2));
            set i = FLOOR(1+RAND()*l_xing);
            if i%2 THEN
                set i = i;
            ELSE
                set i = i + 1;
            END IF;
            set j = j+1;
        end while;
        
        SET rand_name =concat(str_xing,str_ming);
    
        return rand_name;
    end//
    delimiter;
    

    七、向学生表中插入1000条数据

    • 创建一个张学生表
    drop procedure if exists create_table;
    delimiter //
    create procedure create_table()
    begin
        drop table if exists students;
        create table students(id int(4) not null primary key auto_increment,
                                                        name varchar(20),
                                                        sex varchar(10),
                                                        age int(4),
                                                        mobile varchar(20),
                                                        address varchar(20),
                                                        class varchar(10));
        desc students;
    end//
    
    delimiter;
    
    call create_table();
    
    • 插入1000条数据

    1、创建一个存储函数,用来随机生成性别,男或女

    drop function if exists get_sex;
    delimiter//
    create function get_sex() returns varchar(255)
    begin
        declare str varchar(10) default '男女';
        declare i int default 0;
        declare sex varchar(255) default '';
        
        set i = floor(1+rand()*length(str)/2);
        if i%2 then 
            set i = i;
        else
            set i = i + 1;
        end if;
        set sex = concat(sex,substring(str,i,2));
        return sex;
    end//
    delimiter;
    

    1、创建一个存储函数,用来随机生成年龄

    drop function if exists get_age;
    delimiter//
    create function get_age(start_age int(4),end_age int(4)) returns int(4)
    begin
        declare age int(4) default 0;
        set age = floor(start_age+rand()*end_age);
        return age;
    end//
    delimiter;
    

    3、创建一个存储函数,用来随机生成电话号码

    drop function if exists `phone`;
    delimiter //
    create definer=root@localhost function phone() returns char(11) charset utf8
    begin
        declare head varchar(3) default '';
        declare bodys varchar(225) default '130 131 132 133 134 135 136 137 138 139 186 187 189 151 157';
        declare starts int;
        declare num varchar(8);
        declare phone_num varchar(11);
        set starts = 1 + floor(rand()*15)*4;
        set head =trim(substring(bodys,starts,3));          
        set num = FLOOR(RAND()*500000000 + 5000000000);
        set phone_num = concat(head,num);
        return phone_num;
    end//
    delimiter;  
    

    4、创建一个存储函数,用于随机获取地址表中的地名

    drop function if exists get_address;
    delimiter//
    create function get_address() returns varchar(20)
    begin
        declare myaddress varchar(20) default '';
        declare count int default 0;
        declare j int default 0;
        select count(id) into count from table_address;
        set j = floor(1+rand()*count);
        select address into myaddress from table_address where id=j;
        return myaddress;
    end//
    delimiter;
    

    向学生表中插入1000条数据的存储过程

    drop procedure if exists insert_data;
    delimiter//
    create procedure insert_data(in num int)
    begin
        declare _name varchar(20) default '';
        declare _sex varchar(10) default '';
        declare _age int(4) default 0;
        declare _mobile varchar(20) default '';
        declare _address varchar(20) default '';
        declare _class varchar(10) default '';  
        declare i int default 0;
        truncate table students;
        #delete from students;
        while i<num do 
            set _name = get_name(2);
            set _sex = get_sex();
            set _age = get_age(18,30);
            set _mobile = phone();
            set _address = get_address();
            set _class = concat('17',floor(43+rand()*7));
            insert into students(name,sex,age,mobile,address,class) values(_name,_sex,_age,_mobile,_address,_class);
            set i = i + 1;
        end while;
    end//
    delimiter;
    
    call insert_data(1000);
    

    八、数据库语法

    select floor(1+rand()*3);           #在1-3之间随机取一个数
    select floor(1+rand()*9);           #在1-9之间随机取一个数
    select floor(1+rand()*900);         #在1-900之间随机取一个数
    
    ### 9、if语句                                  
    语法:
        if 条件 then
            符合条件执行的;
        end if;
        
        if 条件 then
            符合条件执行的;
        else
            不符合条件执行的;
        end if;
    
    ### 10、case语句           选择语句  
    语法:
    case 变量
        when 具体值 then
            符合该值的执行代码;
        when 具体值 then
            符合该值的执行代码;
        when 具体值 then
            符合该值的执行代码;
        ....
        else
            都不符合执行代码;
    end case;
    
    ### 11、变量
    定义变量语法:
        declare 变量名 数据类型;
        declare 变量名 数据类型 default 默认值;
    
    设置变量语法:
        set 变量名 = 值;
        
    例如:
        x + 10 = 30,求未知数x;
        x + y = 100,求解x和y;
            x = 10;
            y = 90;
    
    ### 12、while循环
    语法:
        while 条件 do
            循环体代码
        end while;
        
        备注:
            条件为真true,即执行循环体内的代码;条件为假false,即跳出循环;
    
    备注:
            随机数的产生:
                rand() 随机数的取值范围是0~1,并不包含1;
                round()四舍五入
                需要n~m范围内的随机数: round( rand() * (m-n) + n )
                
                rand()*100    0~100,不包含100
                round(rand() * 100)   0~100,包含100
                
                70~168:  round(rand() * 98 + 70)
                
            字符串拼接:
                concat(arg1,age2,age3......);
                
                concat("hello", " world!"); # "hello world!"
                concat(10,"-haha");         # "10-haha"
                concat("呵呵","哈哈","hello");  # "呵呵哈哈hello"
                
            除法、取余:
                除法(/) 
                取余(%)
    

    相关文章

      网友评论

          本文标题:Mysql数据库-存储过程

          本文链接:https://www.haomeiwen.com/subject/qbkevctx.html