精华内容
下载资源
问答
  • 怎么在mysql中编写存储过程
    2021-01-18 18:16:47

    存储过程:其实就是存储在数据库中,有一些逻辑语句与SQL语句组成的函数。由于是已经编译好的语句,所以执行速度快,而且也安全。

    打开mysql的控制台,开始编写存储过程。

    实例1:

    编写存储过程:

    394afee5f80b8de65a9102f4e0b595e9.png

    执行存储过程:

    c1fd0964b52fc45667e77f64a5fa7dd7.png

    查看执行结果:

    31f60f29ab8f4a8bf55cc765c171547a.png

    语句解释:

    1、delimiter //,声明分隔符:DELIMITER是分割符的意思,因为MySQL默认以";"为分隔符,如果我们没有声明分割符,那么编译器会把存储过程当成SQL语句进行处理,则存储过程的编译过程会报错,所以要事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";"当做存储过程中的代码,不会执行这些代码(这里如果不懂的话,你可以通过试错的方法来理解)。

    2、编写存储过程的格式:CREATE PROCEDURE([[IN |OUT |INOUT ] 参数名 数据类形...])

    例子:

    1)create procedure proc1(out s int)  // 只有输出

    2)create procedure proc2(in p_in bigint)  // 只有输入

    3)create procedure proc15() // 没有输入与输出

    4)create procedure demo_multi_param(in id bigint,in name varchar(32),out c int) //多输入与输出

    3、过程体的开始与结束使用BEGIN与END进行标识。

    4、select count (*) into s from student; // 过程体,一系列的逻辑语句,sql语句

    5、delimiter ; 用完了之后要把分隔符还原。

    实例2:

    5850a910424dd915ebf99446303c9150.png

    实例3、

    f31e7b55c838480ca791d3282dba5055.png

    1d791aa5b50d9c8663f12f8dc7578474.png

    结论:输出参数在过程中改变了,会得到保存。但是如果@p_out有预设的值,执行存储过程也不会认预设值,可以从第一个输出为null看出。

    实例4、

    f4d50883138691c39c6e45bbb2103dc9.png

    注意:p_in虽然在存储过程中被修改,但并不影响@p_id的值,执行完语句之后,再执行@select @p_in。

    实例5、

    78e5b67b117d9895e0bc6650dd9771b8.png

    结论:如果输入输出参数,那么在存储过程中,即会认输入的,如果在存储过程中改变了,那么输出也会认。

    实例6:

    d0f46961355075901571112fb913f628.png

    这个是一个多个输入,一个输出的例子。

    实例7:

    c47afacd06008937e5b8c7c9e0d98abc.png

    说明:begin...end 之间是内部变量的作用域,一旦超过这个作用域,其内部声明的变量就结束了,就会变成外部作用域的变量。

    更多相关内容
  • MySQL存储过程编写总结文档,包括循环结构样式,创建临时表,删除数据,MySQL分页,动态存储过程编写
  • 通过使用Oracle作为中间容器编写存储过程,将Sql Server的数据实时同步到MySql,不直接SqlServer进行操作。 公司最近的项目要部署上线了,然后需要将甲方公司的ERP,OA,MES,PLM等系统的数据同步到我们的系统之...
  • 有输入输出参数,可以声明变量,有if/else, case,while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能; 函数的普遍特性:模块化,封装,代码复用; 速度快,只有首次执行需经过编译和优化步骤,后续被调用...
  • 下面是自己曾经编写过的mysql数据库存储过程,留作存档,以后用到的时候拿来参考。 其中,涉及到了存储过程、游标(双层循环)、事务。 【说明】:代码的注释只针对当时业务而言,无须理会。 代码如下: ...
  • MySQL中存储过程(详细篇)

    万次阅读 多人点赞 2022-04-14 20:20:36
    编写在数据库的SQL语句集称为存储过程存储过程:(PROCEDURE)是事先经过编译并存储在数据库的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据数据库和应用服务器之间的传输,...


    在这里插入图片描述

    概述

    由MySQL5.0 版本开始支持存储过程。

    如果在实现用户的某些需求时,需要编写一组复杂的SQL语句才能实现的时候,那么我们就可以将这组复杂的SQL语句集提前编写在数据库中,由JDBC调用来执行这组SQL语句。把编写在数据库中的SQL语句集称为存储过程。

    存储过程:(PROCEDURE)是事先经过编译并存储在数据库中的一段SQL语句的集合。调用存储过程可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是很有好处的。

    就是数据库 SQL 语言层面的代码封装与重用。

    存储过程就类似于Java中的方法,需要先定义,使用时需要调用。存储过程可以定义参数,参数分为IN、OUT、INOUT类型三种类型。

    1. IN类型的参数表示接受调用者传入的数据;
    2. OUT类型的参数表示向调用者返回数据;
    3. INOUT类型的参数即可以接受调用者传入的参数,也可以向调用者返回数据。

    优点

    1. 存储过程是通过处理封装在容易使用的单元中,简化了复杂的操作。

    2. 简化对变动的管理。如果表名、列名、或业务逻辑有了变化。只需要更改存储过程的代码。使用它的人不用更改自己的代码。

    3. 通常存储过程都是有助于提高应用程序的性能。当创建的存储过程被编译之后,就存储在数据库中。
      但是,MySQL实现的存储过程略有所不同。
      MySQL存储过程是按需编译。在编译存储过程之后,MySQL将其放入缓存中。
      MySQL为每个连接维护自己的存储过程高速缓存。如果应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询。

    4. 存储过程有助于减少应用程序和数据库服务器之间的流量。
      因为应运程序不必发送多个冗长的SQL语句,只用发送存储过程中的名称和参数即可。

    5. 存储过程度任何应用程序都是可重用的和透明的。存储过程将数据库接口暴露给所有的应用程序,以方便开发人员不必开发存储过程中已支持的功能。

    6. 存储的程序是安全的。数据库管理员是可以向访问数据库中存储过程的应用程序授予适当的权限,而不是向基础数据库表提供任何权限。

    缺点

    1. 如果使用大量的存储过程,那么使用这些存储过程的每个连接的内存使用量将大大增加。
      此外,如果在存储过程中过度使用大量的逻辑操作,那么CPU的使用率也在增加,因为MySQL数据库最初的设计就侧重于高效的查询,而不是逻辑运算。

    2. 存储过程的构造使得开发具有了复杂的业务逻辑的存储过程变得困难。

    3. 很难调试存储过程。只有少数数据库管理系统允许调试存储过程。不幸的是,MySQL不提供调试存储过程的功能。

    4. 开发和维护存储过程都不容易。
      开发和维护存储过程通常需要一个不是所有应用程序开发人员拥有的专业技能。这可能导致应用程序开发和维护阶段的问题。

    5. 对数据库依赖程度较高,移值性差。

    MySQL存储过程的定义

    存储过程的基本语句格式

    DELIMITER $$
    
    CREATE
        /*[DEFINER = { user | CURRENT_USER }]*/
        PROCEDURE 数据库名.存储过程名([in变量名 类型,out 参数 2...])
        /*LANGUAGE SQL
        | [NOT] DETERMINISTIC
        | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
        | SQL SECURITY { DEFINER | INVOKER }
        | COMMENT 'string'*/
    	BEGIN
    		[DECLARE 变量名 类型 [DEFAULT];]
    		存储过程的语句块;
    	END$$
    
    DELIMITER ;
    

    ● 存储过程中的参数分别是 in,out,inout三种类型;

    1. in代表输入参数(默认情况下为in参数),表示该参数的值必须由调用程序指定。
    2. ou代表输出参数,表示该参数的值经存储过程计算后,将out参数的计算结果返回给调用程序。
    3. inout代表即时输入参数,又是输出参数,表示该参数的值即可有调用程序制定,又可以将inout参数的计算结果返回给调用程序。

    ● 存储过程中的语句必须包含在BEGIN和END之间。

    ● DECLARE中用来声明变量,变量默认赋值使用的DEFAULT,语句块中改变变量值,使用SET 变量=值;

    存储过程的使用

    定义一个存储过程

    DELIMITER $$
    
    CREATE
        PROCEDURE `demo`.`demo1`()
    	-- 存储过程体
    	BEGIN
    		-- DECLARE声明 用来声明变量的
    		DECLARE de_name VARCHAR(10) DEFAULT '';
    		
    		SET de_name = "jim";
    		
    		-- 测试输出语句(不同的数据库,测试语句都不太一样。
    		SELECT de_name;
    	END$$
    
    DELIMITER ;
    

    在这里插入图片描述

    调用存储过程

    CALL demo1();
    

    在这里插入图片描述

    定义一个有参数的存储过程

    先定义一个student数据库表:
    在这里插入图片描述

    现在要查询这个student表中的sex为男的有多少个人。

    DELIMITER $$
    
    CREATE
        PROCEDURE `demo`.`demo2`(IN s_sex CHAR(1),OUT s_count INT)
    	-- 存储过程体
    	BEGIN
    		-- 把SQL中查询的结果通过INTO赋给变量
    		SELECT COUNT(*) INTO s_count FROM student WHERE sex= s_sex;
    		SELECT s_count;
    		
    	END$$
    DELIMITER ;
    

    调用这个存储过程

    -- @s_count表示测试出输出的参数
    CALL demo2 ('男',@s_count);
    

    在这里插入图片描述

    定义一个流程控制语句 IF ELSE

    IF 语句包含多个条件判断,根据结果为 TRUE、FALSE执行语句,与编程语言中的 if、else if、else 语法类似。

    DELIMITER $$
    CREATE
        PROCEDURE `demo`.`demo3`(IN `day` INT)
    	-- 存储过程体
    	BEGIN
    		IF `day` = 0 THEN
    		SELECT '星期天';
    		ELSEIF `day` = 1 THEN
    		SELECT '星期一';
    		ELSEIF `day` = 2 THEN
    		SELECT '星期二';
    		ELSE
    		SELECT '无效日期';
    		END IF;
    		
    	END$$
    DELIMITER ;
    

    调用这个存储过程

    CALL demo3(2);
    

    在这里插入图片描述

    定义一个条件控制语句 CASE

    case是另一个条件判断的语句,类似于编程语言中的 choose、when语法。MySQL 中的 case语句有两种语法格式。

    1. 第一种
    DELIMITER $$
    CREATE 
        PROCEDURE demo4(IN num INT)
    	BEGIN
    		CASE -- 条件开始
    	
    		WHEN num<0 THEN 
    			SELECT '负数';
    		WHEN num>0 THEN 
    			SELECT '正数';
    		ELSE 
    		SELECT '不是正数也不是负数';
    	
    		END CASE; -- 条件结束
    	END$$
    DELIMITER;
    

    调用这个存储过程

    CALL demo4(1);
    

    在这里插入图片描述

    2.第二种

    DELIMITER $$
    CREATE 
        PROCEDURE demo5(IN num INT)
    	BEGIN
    		CASE num  -- 条件开始
    		WHEN 1 THEN 
    			SELECT '输入为1';
    		WHEN 0 THEN 
    			SELECT '输入为0';
    		ELSE 
    		SELECT '不是1也不是0';
    		END CASE; -- 条件结束
    	END$$
    DELIMITER;
    

    调用此函数

    CALL demo5(0);
    

    在这里插入图片描述

    定义一个循环语句 WHILE

    DELIMITER $$
    CREATE 
        PROCEDURE demo6(IN num INT,OUT SUM INT)
    	BEGIN
    	     SET SUM = 0;
    	     WHILE num<10 DO -- 循环开始
    	         SET num = num+1;
    	         SET SUM = SUM+num;
    	         END WHILE; -- 循环结束
    	END$$
    DELIMITER;
    

    调用此函数

    -- 调用函数
    CALL demo6(0,@sum);
    
    -- 查询函数
    SELECT @sum;
    

    在这里插入图片描述

    定义一个循环语句 REPEAT UNTLL

    REPEATE…UNTLL 语句的用法和 Java中的 do…while 语句类似,都是先执行循环操作,再判断条件,区别是REPEATE 表达式值为 false时才执行循环操作,直到表达式值为 true停止。

    -- 创建过程
    DELIMITER $$
    CREATE 
        PROCEDURE demo7(IN num INT,OUT SUM INT)
    	BEGIN
    	     SET SUM = 0;
    	     REPEAT-- 循环开始
    		SET num = num+1;
    		SET SUM = SUM+num ;
    		UNTIL num>=10
    		END REPEAT; -- 循环结束
    	END$$
    DELIMITER;
    

    调用此函数

    CALL demo7(9,@sum);
    
    SELECT @sum;
    

    在这里插入图片描述

    定义一个循环语句 LOOP

    循环语句,用来重复执行某些语句。

    执行过程中可使用 LEAVE语句或者ITEREATE来跳出循环,也可以嵌套IF等判断语句。

    1. LEAVE 语句效果对于Java中的break,用来终止循环;
    2. ITERATE语句效果相当于Java中的continue,用来跳过此次循环。进入下一次循环。且ITERATE之下的语句将不在进行。
    DELIMITER $$
    CREATE 
        PROCEDURE demo8(IN num INT,OUT SUM INT)
    	BEGIN
    	     SET SUM = 0;
    	     demo_sum:LOOP-- 循环开始
    		SET num = num+1;
    		IF num > 10 THEN
    		    LEAVE demo_sum; -- 结束此次循环
    		ELSEIF num <= 9 THEN
    		    ITERATE demo_sum; -- 跳过此次循环
    		END IF;
    		
    		SET SUM = SUM+num;
    		END LOOP demo_sum; -- 循环结束
    	END$$
    DELIMITER;
    

    调用此函数

    CALL demo8(0,@sum);
    
    SELECT @sum;
    

    在这里插入图片描述

    使用存储过程插入信息

    DELIMITER $$
    CREATE 
        PROCEDURE demo9(IN s_student VARCHAR(10),IN s_sex CHAR(1),OUT s_result VARCHAR(20))
    	BEGIN
    	   -- 声明一个变量 用来决定这个名字是否已经存在
    	   DECLARE s_count INT DEFAULT 0;
    	   -- 验证这么名字是否已经存在
    	   SELECT COUNT(*) INTO s_count FROM student WHERE `name` = s_student;	
    	   IF s_count = 0 THEN
    	        INSERT INTO student (`name`, sex) VALUES(s_student, s_sex);
    		SET s_result = '数据添加成功';
    	   ELSE
                    SET s_result = '名字已存在,不能添加';
                    SELECT s_result;
    	   END IF;
    	END$$
    DELIMITER;
    

    调用此函数

    CALL demo9("Jim","女",@s_result);
    

    在这里插入图片描述

    再次调用次函数

    CALL demo9("Jim","女",@s_result)
    

    在这里插入图片描述

    存储过程的管理

    显示存储过程

    SHOW PROCEDURE STATUS
    

    在这里插入图片描述

    显示特定数据库的存储过程

    SHOW PROCEDURE STATUS WHERE db = 'db名字' AND NAME = 'name名字';
    

    显示特定模式的存储过程

    SHOW PROCEDURE STATUS WHERE NAME LIKE '%mo%';
    

    在这里插入图片描述

    显示存储过程的源码

    SHOW CREATE PROCEDURE 存储过程名;
    

    在这里插入图片描述

    删除存储过程

    DROP PROCEDURE 存储过程名;
    

    后端调用存储过程的实现

    在mybatis当中,调用存储过程

    <parameterMap type="savemap" id=“usermap"> 
    	<parameter property="name" jdbcType="VARCHAR" mode="IN"/>
    	<parameter property="sex" jdbcType="CHAR" mode="IN"/>
    	<parameter property="result" jdbcType="VARCHAR" mode="OUT"/>
    </parameterMap>
    
    <insert id="saveUserDemo" parameterMap="savemap" statementType="CALLABLE"> 
    {call saveuser(?, ?, ?)} 
    </insert >
    

    调用数据库管理

    HashMap<String, Object> map = new HashMap<String, Object>(); 
    	map.put("name", "Jim"); 
    	map.put("sex","男");
    	userDao.saveUserDemo(map); 
    	map.get(“result”);//获得输出参数
    

    通过这样就可以调用数据库中的存储过程的结果。

    展开全文
  • 编写程序类似,存储过程中也有对应的条件判断,功能类似于if、switch。在MySql里面对应的是IF和CASE 1、IF判断 IF判断的格式是这样的: IF expression THEN commands [ELSEIF expression THEN commands] [ELSE ...
  • 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int default 1; start TRANSACTION; while i <= args DO insert into A_student(id,name) VALUES (i, concat(“陈...
  • MySQL存储过程

    万次阅读 多人点赞 2022-01-26 16:43:19
    1.有输入输出参数,可以声明变量,有if/else/case/while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能 2.函数的普通特性:模块化,封装,代码复用 3.速度快,只有首次执行需要经过编译和优化步骤,后续被调用可以...

    目录

    概念

    特性

    格式

    创建存储过程

    定义变量

    局部变量

    用户变量

    系统变量

    存储过程

    存储过程传参-in

    存储过程传参-out

    存储过程传参-inout

    流程控制

    流程控制-判断

    流程控制语句-case 

    控制流程-循环

    while循环

    repeat循环

    loop循环

    游标

    异常处理-HANDLER句柄


    概念

    MySQL5.0版本开始支持存储过程,存储过程就是一组SQL语句集,功能强大,可以实现一些比较复杂的逻辑功能,类似于JAVA语言中的方法,存储过就是数据库SQL与层层面的代码封装与重用

    特性

    1.有输入输出参数,可以声明变量,有if/else/case/while等控制语句,通过编写存储过程,可以实现复杂的逻辑功能

    2.函数的普通特性:模块化,封装,代码复用

    3.速度快,只有首次执行需要经过编译和优化步骤,后续被调用可以直接执行,省去以上步骤

    格式

    创建存储过程

    -- 创建存储过程
    delimiter $$
    create procedure proc01()
    begin
    	select empno,ename from emp;
    end $$
    delimiter ;
    -- 调用存储过程
    call proc01;

    定义变量

    局部变量

    用户自定义,在begin/end块中有效

    delimiter $$
    create procedure proc02()
    begin
    	declare var_name01 varchar(20) default 'aaa';  -- 声明/定义变量
    	set var_naem01 = 'zhangsan'; -- 给变量赋值
    	select var_name01; -- 输出变量的值
    end $$
    dilimiter ;
    call proc02();

    用户变量

    用户自定义,当前会话(连接)有效.类比java的成员变量

    delimiter $$
    create procedure proc04()
    begin
    	set @var_name01 = 'beijing';
    	select @var_name01;
    end $$
    dilimiter ;
    call proc04();
    select @var_name01; -- 外部也是可以使用用户变量

    系统变量

    1.系统变量有分为全局变量会话变量

    2.全局变量在MYSQL启动的时候由服务器自动将他的初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改

    3.会话变量在每次建立一个新的连接的时候,由MYSQL来初始化,MYSQL会将当前所有全局变量的值复制一份,来作为会话变量

    4.也就是说,如果在建立会话以后,没有手动更改过会话变量与全局变量的值,那所有这些变量的值都是一样的

    5.全局变量与会话变量的区别在于,对全局变量的修改会影响整个服务器,但是对会话变量的修改,只会影响到当前的会话(也就是当前的数据库连接)

    6.有些系统变量的值是可以利用语句来动态进行更改的,但是有些系统变量的值缺是只读的,对于那些可以更改的系统变量,我们可以利用set语句进行更改

    系统变量-全局变量

    由系统系统,在整个数据库中有效

    存储过程

    存储过程传参-in

    in表示传入的参数,可以传入数值或者变量,即使传入变量,并不会改变变量的值,可以内部更改,仅仅作用在函数范围内

    delimiter $$
    create procedure proc06(in param_empno int)
    begin
    	select*from emp where empno = param_empno
    end $$
    delimiter ;
    call proc06(1001);
    

     多个参数传参

    存储过程传参-out

    out表示从存储过程内部传值给调用者

    存储过程传参-inout

    inout表示从外部传入的参数经过修改后可以返回的变量,既可以使用传入变量的值也可以修改变量的值(即使函数执行完)

    流程控制

    流程控制-判断

    IF语句包含多个条件判断,根据结果为TURE和FALSE执行语句,与编程语言中的if、else if、else语法类似,其语法格式如下

    -- 存储过程-if
    -- 案例1
    -- 输入学生的成绩,来判断成绩的级别
    /*
    score<60:不及格
    score>=60 , score<80 :及格
    score>=80 , score<90 :良好
    score>=90 , score<=100 :优秀
    score>100 :成就错误
    */
    delimiter $$
    create procedure proc_12_if (in score int)
    begin
    	if score<60 then select '不及格';
    	elseif score>=60 and score<80 then select '及格';
    	elseif score>=80 and score<90 then select '良好';
    	elseif score>=90 and score<=100 then select '优秀';
    	else select '成绩错误'
    	end if;
    end $$
    delimiter ;
    
    set @score=55;
    call proc_12_if(@score)
    -- 输入员工的名字,判断工资的情况
    /*
    sal<10000 :适用薪资
    sal>=10000 and sal<20000 :转正薪资
    sal>=20000 :元老薪资
    */
    delimiter $$
    create procedure proc_13_if(in in_ename varchar)
    begin
    	declare var_sal decimal(7,2);  -- 定义局部变量,7个长度,2个小数 
    	declare result varchar(20);
    	select sal into var_sal from emp where ename=in_eanme;  -- 将值赋给局部变量
    	if var_sal <10000 then set result ='适用薪资';
    	elseif var_sal <20000 then set result ='转正薪资';
    	else set result ='元老薪资';
    	end if;
    	select result;
    end$$
    delimiter ;
    
    -- 调用
    call proc_13_if('刘备');

    流程控制语句-case 

     CASE是另一个条件判断语句,类似于编程语言中的switch语法

    语法一:当case后面的语句与when后面的语句相等时,则会执行then后面的语句,如果均不匹配则执行else

    语法二:直接写case 当when后面的条件成立则执行then后面的语句,如果都不成立,则执行else

    -- 流程控制语句:case
    /*
    支付方式:
    	1.微信支付
    	2.支付宝支付
    	3.银行卡支付
    	4.其他支付
    */
    -- 格式1
    delimiter $$
    create procedure proc14_case(in pay_type int)
    begin
    	case pay_type 
    	when 1 then select '微信支付';
    	when 2 then select '支付宝支付';
    	when 3 then select '银行卡支付';
    	else select '其他方式支付';
    	end case;
    end$$
    delimiter ;
    
    call proc14_case(2);
    call proc14_case(3);
    -- 语法二
    -- 输入学生的成绩,来判断成绩的级别
    /*
    score<60:不及格
    score>=60 , score<80 :及格
    score>=80 , score<90 :良好
    score>=90 , score<=100 :优秀
    score>100 :成就错误
    */
    delimiter $$
    create procedure proc_15_case (in score int)
    begin
    	case
    	when score<60 then select '不及格';
    	when score>=60 and score<80 then select '及格';
    	when score>=80 and score<90 then select '良好';
    	when score>=90 and score<=100 then select '优秀';
    	else select '成绩错误'
    	end case;
    end $$
    delimiter ;
    
    call proc_15_case(88);

    控制流程-循环

    概述

    循环是一段在程序中只出现一次,但可能会连续运行多次的代码

    循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环

    循环分类

    while、repeat、loop

    循环控制

    leave 类似于break,跳出,结束当前所在的循环

    iteater 类似于continue,继续,结束本次循环,继续下一次

    while循环

    -- 需求:向表中添加指定条数据
    -- while
    delimiter $$
    create procedure proc16_while(in insertCount int)
    begin
    	declare i int default 1;  -- 设置循环的增量
    	label:while i<=insertCount do insert into user(id,username,password) values(i,concat('user-',i),'123456');
    	set i=i+1;
    end while label;
    end$$
    delimiter ;
    
    
    call proc16_while(10);
    -- 需求:向表中添加指定条数据
    -- while+leave
    delimiter $$
    create procedure proc16_while(in insertCount int)
    begin
    	declare i int default 1;  -- 设置循环的增量
    	label:while i<=insertCount do insert into user(id,username,password) values(i,concat('user-',i),'123456');
    	if i=5 then leave label;   -- 如果i=5则跳出循环
    	set i=i+1;
    end while label;
    end$$
    delimiter ;
    
    
    call proc16_while(10);

    repeat循环

    格式

    -- 存储过程-循环控制-repeat
    
    delimiter $$
    create procedure proc18_repaet(in insertCount int)
    begin
    	declare i int default 1;
    	label:repeat
    		insert into user(uid,username,password)values(i,concat('user-',i),'123456');
    		set i = i+1;
    		until i>inserCount  -- 这里不能写; 表示跳出循环
    		end repeat label;
    		select '循环结束';
    end$$
    delimiter ;
    
    call proc18_repeat(100);
    

    loop循环

    -- 存储过程-循环控制-loop
    
    delimiter $$
    create procedure proc19_loop(in insertCount int)
    begin
    	declare i default 1;
    	label:loop insert into user (uid,username,password) values (i,concat('user-')i,'123456');
    	set i= i+1;
    	if i>insertCount then leave label;
    	end if;
    	end loop label;
    end$$
    delimiter ;
    
    call proc19_loop()

    游标

    游标(cursor)是庸才存储查询结果集的数据类型,在存储过程和函数中可以使用光标对结果集进行循环的处理,光标的使用包括光标的声明、OPEN、FETCH、CLOSE

    -- 操作游标(cursor)
    -- 声明游标
    -- 打开游标
    -- 通过游标获取值
    -- 关闭游标
    -- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
    delimiter $$
    create procedure proc19_cursor(in in_danme varchar(50))
    begin
     -- 定义局部变量
    	declare var_empno int;
    	declare var_ename varchar(50);
    	declare var_sal decimal(7,2);
     -- 声明游标
    	declare my_cursor cursor for select empno,ename,sal from dept a,emp b where a.deptno=b.deptno and a.dname=in_dname;
     -- 打开游标
    	open my_cursor;
     -- 通过游标获取值
    -- 	fetch my_cursor into var_empno,var_ename,var_sal;
    -- 	select var_empno,var_ename,var_sal;  -- 注意:以上两句只可以获取一个数据,因为游标是一次一行,所以采用循环
    	label:loop
    		fetch my_cursor into var_empno,var_ename,var_sal;
    		select var_empno,var_ename,var_sal; 
    	end loop label;
     -- 关闭游标
     close my_cursor;
    end$$
    delimiter ;
    
    call proc19_cursor('销售部');

    异常处理-HANDLER句柄

    MySQL存储过程也提供了对异常处理的功能:通过定义HANDLER来完成异常声明的实现

    格式

    在语法中,变量声明、游标声明、handler声明必须按照先后顺序书写的,否则创建存储过程出错

    DECALARE handler_action 创建句柄

    FOR 后面为条件值,为什么异常提供处理

    statment 当没有数据发现这个异常发生时采取什么措施

    handler_action :{

            CONTINUE    继续执行

            EXIT 退出

            UNDO 取消(目前MySQL不支持)

    }

    condition_value :{

    mysql_error_code  错误码

    condition 条件名

    SQLWARNING   SQL警告

    NOT FOUND  数据没有发现

    SQLEXCEPTION  SQL异常

    }

    /*用于测试句柄,改造上面游标代码会出现1329错误代码的情况*/
    -- 操作游标(cursor)
    -- 声明游标
    -- 打开游标
    -- 通过游标获取值
    -- 关闭游标
    -- 需求:输入一个部门名,查询该部门员工的编号、名字、薪资,将查询的结果集添加游标
    delimiter $$
    create procedure proc21_cursor_handler(in in_danme varchar(50))
    begin
     -- 定义局部变量
    	declare var_empno int;
    	declare var_ename varchar(50);
    	declare var_sal decimal(7,2);
     -- 定义标记值
    	declare flag int default 1;
     -- 声明游标
    	declare my_cursor cursor for select empno,ename,sal from dept a,emp b where a.deptno=b.deptno and a.dname=in_dname;
     -- 定义句柄:定义异常的处理方式
     /*
     1:异常处理完之后,程序应该如何执行
    		continue :继续执行剩余代码
    		exit:直接终止程序
    		undo:不支持
     2:触发条件
    		条件码:1329.....
    		条件名:
    					SQLWARNING
    					NOT FOUND
    					SQLEXCEPTION
     3:异常触发之后执行什么代码
    		设置flag的值 -> 0 
     */
      declare continue handler for 1329 set flag=0 ;
     -- 打开游标
    	open my_cursor;
     -- 通过游标获取值
    -- 	fetch my_cursor into var_empno,var_ename,var_sal;
    -- 	select var_empno,var_ename,var_sal;  -- 注意:以上两句只可以获取一个数据,因为游标是一次一行,所以采用循环
    	label:loop
    		fetch my_cursor into var_empno,var_ename,var_sal;
    		-- 判断flag的值如果为1则执行,否则不执行
    		if flag =1 then 
    		 select var_empno,var_ename,var_sal; 
    		else leave label;
    		end if;
    	end loop label;
     -- 关闭游标
     close my_cursor;
    end$$
    delimiter ;
    
    call proc19_cursor('销售部');
    

    展开全文
  • 本资源结合实例实现一个复杂的存储过程存储过程中有用到游标、临时表、循环、递归等知识,sql文件附有实例数据表创建的sql语句。
  • MySQL Workbench创建存储过程教程示例

    千次阅读 2021-01-20 18:24:37
    MySQL中存储过程指的是存储在数据库的SQL语句集合,当创建好存储过程运行时提供所需参数,存储过程就可以以代码指定的方式使用参数执行并返回值。一、存储过程如何工作首先要先创建一个存储过程然后再运行。...

    MySQL中的存储过程指的是存储在数据库中的SQL语句集合,当创建好存储过程后在运行时提供所需参数,存储过程就可以以代码指定的方式使用参数执行并返回值。

    一、存储过程如何工作

    首先要先创建一个存储过程然后再运行。在运行的过程中需要提供它所需要的参数,然后存储过程将以代码指定的任何方式使用参数执行。例如,编写一个接受FruitId参数的存储过程。然后在存储过程可以获取该参数并使用它来检查该特定水果的库存。因此我们可以调用存储过程,即每次使用不同的水果ID它都将返回一个值,并显示该库存中有多少水果。

    您可以在MySQL命令行工具中编写存储过程,也可以使用MySQL Workbench编写存储过程,这是一个出色的前端工具(此处使用的是5.3 CE版本)。

    二、MySQL命令行工具

    从开始菜单中选择MySQL命令客户端

    8823b11bd3935c13a3de9eab30b4b256.png

    选择MySQL命令提示符将会出现:

    2805fd29e1968893ba67010d9ad59305.png

    成功登录后,您可以使用MySQL命令提示符:

    43c3e1aeb78d365f0c761ea2890717b7.png

    现在,您编写并运行自己的过程,请参见以下示例:

    a07d9fad6d5b50c89d738d01c008fb7c.png

    使用MySQL Workbench

    6c155edcb459da9dc7cb41d05dfbee78.png

    连接MySQL Workbench如下:

    fa8bdfb09c8bd3bca19a8f7af01df6a3.png

    输入详细登录信息

    09eac79f3a1474763e06ed5529e2fc65.png

    登录完毕后即可选择需要操作的mysql数据库

    6598c38f83332d532aa1c418dba3878a.png

    选择数据库后,右键单击“ 示例”,将出现一个新的弹出窗口:

    6c34ec736722cb3370ed7c7e27f1dfbb.png

    选择“创新mysql存储过程”就可以编写自己的存储过程

    2a72574fa7dfdb24348ced97365b9ff0.png

    等待其编写完成后单击“应用”按钮

    3bc0374009225e21e69bcd721d35655c.png

    选择脚本应用的数据库

    60ccaf3010da36a27adf650d329c44fd.png

    执行存储过程则整个过程完毕

    b657881cca9ec5e019a724be7709cc29.png

    本地部署起来或有一定难度,为了数据安全性和稳定性或许上云是一个不错的选择!《新睿云服务器来袭,爆款Mysql数据库空间免费用!》

    展开全文
  • MySQL中存储过程的简单使用案例

    千次阅读 2022-03-25 15:13:39
    结合mysql+springboot简单调用存储过程
  • mysql call 存储过程

    2021-01-18 22:27:53
    PHP调用MYSQL存储过程实例PHP调用MYSQL存储过程实例标签:mysql存储phpsqlquerycmd2010-09-26 11:1011552人阅读评论(3)收藏举报实例一:无参的存储过程$conn = mysql_connect('localhost','root','root') o......
  • 使用存储过程的目的是将常用或复杂的工作预先用 SQL 语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器,因此称为存储过程。当以后需要数据库提供与已定义好的存储过程的功能相同的...
  • 1 存储过程 1.1 什么是存储过程 存储过程是一组为了完成某项特定功能的sql语句集,其实质上就是一段存储在数据库的代码,他可以...存储过程被创建后,可以程序被多次调用,而不必担心重写编写存储过程的sql语
  • MYSQL定时执行存储过程

    千次阅读 2021-03-04 00:08:37
    第一步:编写存储程序(需了解基本的存储程序的语法) Sql代码 create procedure inproc() begin declare done int default 0; declare a,b,c int; declare curl cursor for select ver,date_format(time,'%Y%m%d')...
  • MySQL存储过程编写 (Navicat 15)

    千次阅读 2022-01-25 17:06:41
    1.创建存储过程 数据库下函数处右键点击新建函数,输入名称并选择过程,如下图所示 输入名称后点击完成及创建了一个空的存储过程,以创建登录存储过程为例,如下图 登录分析:输入用户名和密码 ,将输入的用户名...
  • MySQL存储过程中的3种循环

    千次阅读 2021-02-03 03:35:02
    在MySQL存储过程的语句有三个标准的循环方式:WHILE循环,LOOP循环以及REPEAT循环。还有一种非标准的循环方式:GOTO,不过这种循环方式最好别用,很容易引起程序的混乱,这里就不错具体介绍了。这几个循环语句的...
  • MySQL存储过程

    千次阅读 2021-01-18 20:33:55
    存储过程简介我们常用的操作数据库语言SQL语句执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库,用户通过指定存储过程的名字并给定...
  • Mysql函数和存储过程

    万次阅读 2022-06-15 09:14:08
    设置变量 定义用户变量 : set @...IN 类型参数可以接收变量也可以接收常量,传入的参数在存储过程内部使用即可,但是在存储过程内部的修改无法传递到外部。OUT 类型参数只能接收一个变量,接收的变量不能够在存储
  • 此文以oracle数据库的SCOTT用户的EMP表为例,用PL/SQL Developer编写一个分页存储过程,要求是:可以输入表名,每页显示记录数,当前页,返回总记录数,总页数和返回的结果集。 由于需要返回查询出来的结果集,...
  • 1、 基本完全代替编写存储过程的工作任务。 2、 让不会写存储过程的测试人员,也可顺利完成加压测试工作。 3、 让会写存储过程的测试人员,短时间内完成存储过程编写。 4、 可生成现行业主流的不同数据库类型的存储...
  • mysql存储过程简单实例

    千次阅读 2021-03-16 19:26:29
    例一,mysql存储过程:复制代码 代码示例:CREATE PROCEDURE test(IN myid INT(3),IN myname VARCHAR(22),IN myage INT(3))if myid=0THENINSERT INTO a(name,age) VALUES(myname,myage);ELSEUPDATE a SET a.name=my...
  • 一、存储过程函数详解 CREATE PROCEDURE : 声明存储过程 delete_matches:方法名用来调用 IN uid INTEGER :传参uid,INTEGER 类型。 IN 输入参数:表示调用者向过程传入值(传入值可以是字面量或变量) OUT ...
  • 接着在MySQL数据库中编写往这个Logisitcistable表读写数据的存储过程 再接着Qt中编写调用存储过程,往数据库表插入数据 再接着Qt中编写调用存储过程,从数据库表读取数据 最终效果,从数据库该表读出...
  • MySQL存储过程和函数简单写法

    千次阅读 2021-01-18 23:52:19
    MySQL存储过程MySQL中,创建存储过程的基本形式如下:CREATE PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_body其中,sp_name参数是存储过程的名称;proc_parameter表示存储过程的参数...
  • mysql存储过程-游标

    千次阅读 2022-05-05 16:08:45
    -- 2022-05-03 星期二 1924 mysql存储过程-游标 -- 参考:https://wenku.baidu.com/view/4cc6c15b158884868762caaedd3383c4ba4cb453.html /** SHOW CREATE PROCEDURE drop_copy;#查看已经创建的-存储过程 CALL drop_...
  • MySql创建存储过程-批量添加数据

    千次阅读 2022-04-14 14:08:40
    存储过程是为了完成特定功能的SQL语句集,经编译创建并保存数据库,用户可通过指定存储过程的名字并给定参数(需要时)来调用执行。 存储过程思想上很简单,就是数据库 SQL 语言层面的代码封装与重用。 1.1 优点...
  • MySQL存储过程详解 mysql 存储过程

    千次阅读 2021-02-07 10:07:44
    我们常用的操作数据库语言SQL语句执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库,用户通过指定存储过程的名字并给定参数(如果该...
  • 在存储过程中使用变量 在存储过程和函数,可以定义和使用变量。用户可以使用关键字DECLARE来定义变量,然后为变量赋值。这些变量的作用范围是BEGIN…END程序段。 1. 定义变量 在MySQL中,可以使用DECLARE...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 171,114
精华内容 68,445
热门标签
关键字:

怎么在mysql中编写存储过程

mysql 订阅