Mysql 创建存储过程和函数及各种例子

这篇具有很好参考价值的文章主要介绍了Mysql 创建存储过程和函数及各种例子。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. Mysql 创建存储过程

1.1 前言知识

1.1.1 语法结构

  1. 无参的存储过程
    delimiter $
    CREATE PROCEDURE 存储过程名()
    	begin
    		存储过程体
    	end $;
    
  2. 有参数的存储过程
    delimiter $
    CREATE PROCEDURE 存储过程名(in|out|inout 参数名1 参数类型,参数名2 参数类型……)
    	begin
    		存储过程体
    	end $;
    
  3. 删除存储过程:
    DROP PROCEDURE IF EXISTS `存储过程名`;  
    

1.1.2 简单解释

  • 部分语法简单介绍:
    1. delimiter $$
      $$ 是分隔符,用其他符号也行,比如一个$ 或者//
    2. 定义变量:DECLARE
      例子:
      DECLARE `de_test` VARCHAR(20) DEFAULT '';
      
    3. @符号
      • 使用 SET 直接赋值变量,变量名以 @ 开头:如:set @dogNum = 1002;
      • 其他使用例子如下:
        Mysql 创建存储过程和函数及各种例子
        Mysql 创建存储过程和函数及各种例子
    4. prepare语法格式
    • 处理动态sql,比如表名做变量的sql
      prepare stmt from 'sql语句; --定义
      execute stmt; -- 执行
      deallocate prepare stmt;  -- 删除定义(释放资源)
      

1.2 创建存储过程入门例子

1.2.1 无参存储过程

1.2.1.1 不带变量
  1. 创建如下:
    DROP PROCEDURE IF EXISTS `sp_select_one_age_dogs`;  
    
    delimiter $
    CREATE PROCEDURE sp_select_one_age_dogs()
    	begin
    		select * from dog d where d.dog_age <=1;
    	end $
    
    Mysql 创建存储过程和函数及各种例子
  2. 测试看效果
    • 查看所有的狗狗
      Mysql 创建存储过程和函数及各种例子
    • 调用存储过程查看年龄不超过1岁的狗狗
      call sp_select_one_age_dogs();
      
      Mysql 创建存储过程和函数及各种例子
1.2.1.2 带变量
  1. 创建如下:
    DROP PROCEDURE IF EXISTS `sp_test`;  
    
    delimiter $
    CREATE PROCEDURE sp_test()
    	begin
    		DECLARE `col_test` VARCHAR(20) DEFAULT '';
    		select 'test' into col_test from dual;
    		select col_test;
    	end $;
    
    Mysql 创建存储过程和函数及各种例子
  2. 测试效果
  • 调用存储过程:call sp_test();
    Mysql 创建存储过程和函数及各种例子

1.2.2 有入参的存储过程

  • 创建存储过程
    DROP PROCEDURE IF EXISTS `sp_select_dog_by_num`;  
    
    delimiter $
    CREATE PROCEDURE sp_select_dog_by_num(in dogNum int(10))
    	begin
    		select d.dog_num ,d.dog_name ,d.dog_kind ,d.dog_age  
    	    from dog d where d.dog_num =dogNum;
    	end $
    
    Mysql 创建存储过程和函数及各种例子
  • 调用存储过程
    • 调用方式1:直接给定参数值1001
      call sp_select_dog_by_num(1001);
      
      Mysql 创建存储过程和函数及各种例子
    • 调用方式2:通过变量调用
      set @dogNum = 1002;
      call sp_select_dog_by_num(@dogNum);
      
      注意:赋值也可以用:set @dogNum := 1002;
      Mysql 创建存储过程和函数及各种例子
      Mysql 创建存储过程和函数及各种例子

1.2.3 有出参的存储过程

  • 直接在上面无参存储过程 sp_test() 的基础上改一个出参的存储过程,如下:
    1. 创建出参存储过程:
      DROP PROCEDURE IF EXISTS `sp_test_out`;  
      
      delimiter $
      CREATE PROCEDURE sp_test_out(out col_test varchar(20))
      	begin
      		select 'test' into col_test from dual;
      	end $;
      
      Mysql 创建存储过程和函数及各种例子
    2. 测试看效果
      • 调用存储过程,注意加:@
        call sp_test_out(@col_test);
        
        Mysql 创建存储过程和函数及各种例子
      • 查看调用结果
        select @col_test;
        
        Mysql 创建存储过程和函数及各种例子

1.2.4 有入参和存储的存储过程

  1. 创建存储过程
    delimiter $
    CREATE PROCEDURE sp_select_dogName_by_num(in dogNum int(10),out dogName varchar(20))
    	begin
    		select d.dog_name into dogName from dog d where d.dog_num =dogNum;
    	end $
    
    Mysql 创建存储过程和函数及各种例子
  2. 调用看效果
    set @dogNum := 1003;
    call sp_select_dogName_by_num(@dogNum,@dogName);
    
    select @dogName;
    
    Mysql 创建存储过程和函数及各种例子

1.2.5 inout的存储过程

  • 根据部门id找父节点(部门id或公司id),如下:
    • 创建存储过程
      DROP PROCEDURE IF EXISTS `sp_select_pId_by_deptId`;  
      
      delimiter $
      CREATE PROCEDURE sp_select_pId_by_deptId(inout v_code varchar(10))
      	begin
      		SELECT t.PARENT_ID into v_code FROM SYS_COMPANY_DEPT t 
              where t.DEPT_ID =v_code;
      	end $
      	
      delimiter ;
      
      Mysql 创建存储过程和函数及各种例子
    • 调用测试效果
      set @code := 'C001';
      call sp_select_pId_by_deptId(@code);
      select @code;
      
      Mysql 创建存储过程和函数及各种例子
      Mysql 创建存储过程和函数及各种例子

1.3 实用存储过程例子

1.3.1 根据表名添加字段的存储过程

  • 动态给表添加字段 create_timeupdate_time
  • 创建存储过程
    drop procedure if exists `add_col_date`;  
    delimiter $$
    create procedure add_col_date(in tableName varchar(50))  
    begin 
    	set @tableName = tableName;
    	set @createTimeSql = concat(' alter table ',@tableName,' add create_time datetime;'); 
    	set @updateTimeSql = concat(' alter table ',@tableName,' add update_time datetime;'); 
    	select  @createTimeSql;
    	prepare stmt from @createTimeSql; 
    	prepare stmt2 from @updateTimeSql;
    	execute stmt;
    	execute stmt2;
    	deallocate prepare stmt; -- 释放数据库连接
    	deallocate prepare stmt2; 
    end $$
    delimiter ;
    
    Mysql 创建存储过程和函数及各种例子
  • 调用存储过程,查看效果
    • 测试一张表,首先先看这个表的结构:
      Mysql 创建存储过程和函数及各种例子
    • 确定没有那两个字段,然后调用存储过程
      Mysql 创建存储过程和函数及各种例子
    • 再次查看表结构,字段已添加上
      Mysql 创建存储过程和函数及各种例子

1.3.2 递归查询的存储过程

1.3.2.1 递归查父id的存储过程
  1. 先看想实现的效果
    Mysql 创建存储过程和函数及各种例子
  2. 创建存储过程
    drop procedure if exists sp_find_pId_by_deptId;
    
    delimiter $$
    create procedure sp_find_pId_by_deptId(inout deptId varchar(10))
    begin
        declare count_num int(10);  
        SET @@max_sp_recursion_depth = 10;
    	select count(0) into count_num from sys_company_dept t where t.`TYPE` ='1' and t.dept_id =deptId;
        if (count_num = 0) then
            select t.PARENT_ID into deptId from sys_company_dept t where t.dept_id =deptId;
    		call sp_find_pId_by_deptId(deptId); 
        end if;
    end $$
    delimiter ;
    
    Mysql 创建存储过程和函数及各种例子
  3. 测试效果
    set @deptId:='D001';
    call sp_find_pid_by_deptId(@deptId);
    select @deptId;
    
    Mysql 创建存储过程和函数及各种例子
1.3.2.2 注意问题
  • 遇到的问题:
    call sp_find_pid_by_deptId(@deptId)
    1456 - Recursive limit 0 (as set by the max_sp_recursion_depth variable) was exceeded for routine sp_find_pid_by_deptId
    
    Mysql 创建存储过程和函数及各种例子
  • 问题原因:
    原因是:存储过程里默认不允许递归,递归深度是0,可以查一下默认的递归深度:
    select @@max_sp_recursion_depth;
    
    Mysql 创建存储过程和函数及各种例子
  • 解决问题:
    在存储过程里设置递归深度即可:
    SET @@max_sp_recursion_depth = 10;
    
    Mysql 创建存储过程和函数及各种例子

2. Mysql 创建函数

2.1 创建语法 与删除语法

  1. 创建语法
    • 如下:
      delimiter $$
      #在函数名后面一定要加上returns 函数返回类型
      create function fun_get_dog_name(dogNum VARCHAR(10)) 
      returns VARCHAR(30) 
      begin
      	declare dogName VARCHAR(30);  #在函数中定义一个变量,用来接收函数返回值
      	 函数逻辑处理
      	return dogName;   # 返回变量                
      end $$
      
  2. 删除语法:
    drop function if exists 函数名;
    

2.2 创建函数例子

2.2.1 入门例子

  • 创建如下:
    drop function if exists fun_get_dog_name;
    
    delimiter $$
    #在函数名后面一定要加上returns 函数返回类型
    create function fun_get_dog_name(dogNum VARCHAR(10)) returns VARCHAR(30) 
    begin
    	declare dogName VARCHAR(30);  #在函数中定义一个变量,用来接收函数返回值
    	select d.dog_name into dogName from dog d where d.dog_num =dogNum;
    	return dogName;                   
    end $$
    
    Mysql 创建存储过程和函数及各种例子
  • 测试看效果
    select fun_get_dog_name('1001');
    
    Mysql 创建存储过程和函数及各种例子
  • 好了,简单的一个小知识,就到这吧

文章来源地址https://www.toymoban.com/news/detail-463891.html

到了这里,关于Mysql 创建存储过程和函数及各种例子的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MySQL——存储过程与存储函数

    MySQL从 5.0版本 开始支持 存储过程 和 存储函数 。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。 1.1 理解 含义 :存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组

    2024年02月10日
    浏览(44)
  • MySQL之存储过程和存储函数

    能够将完成特定功能的SQL指令进行封装(SQL指令集),编译之后存储在数据库服务器上,并且为之取一个名字,客户端可以通过名字直接调用这个SQL指令集,获取执行结果。 2.1 优点 (1)SQL指令无需经客户端编写通过网络传送,可以节省网络开销,同时避免使用SQL指令在网络传

    2024年02月05日
    浏览(51)
  • MySQL存储函数与存储过程习题

    创建表并插入数据: 1、创建一个可以统计表格内记录条数的存储函数 ,函数名为count_sch() 先创建一个表并插入一些数据: mysql d // mysql create function count_sch() - returns int - begin - declare i int default 0; - select count(*) into i from sch; - return i; - end // Query OK, 0 rows affected (0.00 sec) mysql sel

    2024年01月19日
    浏览(47)
  • mysql:存储过程的创建与使用

    一、创建存储过程 使用MySql Workbench创建存储过程,一定要记得使用 delimiter 指明结束符,否则会报错:Statement is incomplete, expecting: \\\';’ 错误示例: 正确示例: 其中,//就是结束符,可以自行指定,比如一般都用$$。 二、存储过程语法 这里就不照搬官方的语法了,按照我的理

    2024年02月09日
    浏览(39)
  • 【MySql】MySql存储过程与函数

    存储过程没有返回值,函数有返回值 存储过程就是一组预先编译好的SQL语句的封装,需要执行时客户端向服务器发送调用请求,服务器就会将这一系列预先存储好的SQL语句全部执行。 简单举例:存储过程的创建 DELIMITER意味将$设置为结束标识,这样就可以在存储过程中使用分

    2024年02月09日
    浏览(43)
  • MySQL 存储过程和函数

    目录 一、存储过程和函数概述 二、创建存储过程和函数 1、创建存储过程 2、创建存储函数 三、查看/调用储存过程和函数 1、查看储存过程/函数 2、调用储存过程/函数 四、修改/删除存储过程和函数 1、修改存储过程和函数 2、删除存储过程和函数 五、练习  存储过程就是一

    2024年02月11日
    浏览(34)
  • MySQL:存储过程与函数、视图

    一、学习目标 掌握如何创建存储过程 掌握如何创建存储函数 熟悉变量的使用方法 熟悉如何定义条件和处理程序 了解光标的使用方法 掌握流程控制的使用 掌握如何调用存储过程和函数 熟悉如何查看存储过程和函数 掌握修改存储过程和函数的方法 熟悉如何删除存储过程和函

    2024年02月05日
    浏览(49)
  • MySQL-15.存储过程和函数

    MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部复杂的SQL逻辑,而只需要简单地调用存储过程和函数即可。 1.1 理解 含义 :存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先

    2024年02月21日
    浏览(39)
  • MySQL调用存储过程和函数

    存储过程和存储函数都是存储在服务器端的 SQL 语句集合。要想使用这些已经定义好的存储过程和存储函数就必须要通过调用的方式来实现。 存储过程通过 CALL 语句来调用,存储函数的使用方法与 MySQL 内部函数的使用方法相同。执行存储过程和存储函数需要拥有 EXECUTE 权限(

    2024年02月06日
    浏览(55)
  • MySQL系列(九)存储过程的创建和使用

    (1)利用预处理sql语句输出teacher表中前n行记录,执行预处理命令时具体输出前5行的数据。 (2)利用预处理sql语句,更改course表中课程号为c05109的课程名称为“数据库系统原理”。 (3)创建存储过程update_email,修改student表中姓名为‘封月明’的学生的email为‘feng@qq.com’。

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包