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

news2024/11/19 4:34:04

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

  • 1. Mysql 创建存储过程
    • 1.1 前言知识
      • 1.1.1 语法结构
      • 1.1.2 简单解释
    • 1.2 创建存储过程入门例子
      • 1.2.1 无参存储过程
        • 1.2.1.1 不带变量
        • 1.2.1.2 带变量
      • 1.2.2 有入参的存储过程
      • 1.2.3 有出参的存储过程
      • 1.2.4 有入参和存储的存储过程
      • 1.2.5 inout的存储过程
    • 1.3 实用存储过程例子
      • 1.3.1 根据表名添加字段的存储过程
      • 1.3.2 递归查询的存储过程
        • 1.3.2.1 递归查父id的存储过程
        • 1.3.2.2 注意问题
  • 2. Mysql 创建函数
    • 2.1 创建语法 与删除语法
    • 2.2 创建函数例子
      • 2.2.1 入门例子

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;
      • 其他使用例子如下:
        在这里插入图片描述
        在这里插入图片描述
    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 $
    
    在这里插入图片描述
  2. 测试看效果
    • 查看所有的狗狗
      在这里插入图片描述
    • 调用存储过程查看年龄不超过1岁的狗狗
      call sp_select_one_age_dogs();
      
      在这里插入图片描述

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 $;
    
    在这里插入图片描述
  2. 测试效果
  • 调用存储过程:call sp_test();
    在这里插入图片描述

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 $
    
    在这里插入图片描述
  • 调用存储过程
    • 调用方式1:直接给定参数值1001
      call sp_select_dog_by_num(1001);
      
      在这里插入图片描述
    • 调用方式2:通过变量调用
      set @dogNum = 1002;
      call sp_select_dog_by_num(@dogNum);
      
      注意:赋值也可以用:set @dogNum := 1002;
      在这里插入图片描述
      在这里插入图片描述

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 $;
      
      在这里插入图片描述
    2. 测试看效果
      • 调用存储过程,注意加:@
        call sp_test_out(@col_test);
        
        在这里插入图片描述
      • 查看调用结果
        select @col_test;
        
        在这里插入图片描述

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 $
    
    在这里插入图片描述
  2. 调用看效果
    set @dogNum := 1003;
    call sp_select_dogName_by_num(@dogNum,@dogName);
    
    select @dogName;
    
    在这里插入图片描述

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 ;
      
      在这里插入图片描述
    • 调用测试效果
      set @code := 'C001';
      call sp_select_pId_by_deptId(@code);
      select @code;
      
      在这里插入图片描述
      在这里插入图片描述

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 ;
    
    在这里插入图片描述
  • 调用存储过程,查看效果
    • 测试一张表,首先先看这个表的结构:
      在这里插入图片描述
    • 确定没有那两个字段,然后调用存储过程
      在这里插入图片描述
    • 再次查看表结构,字段已添加上
      在这里插入图片描述

1.3.2 递归查询的存储过程

1.3.2.1 递归查父id的存储过程

  1. 先看想实现的效果
    在这里插入图片描述
  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 ;
    
    在这里插入图片描述
  3. 测试效果
    set @deptId:='D001';
    call sp_find_pid_by_deptId(@deptId);
    select @deptId;
    
    在这里插入图片描述

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
    
    在这里插入图片描述
  • 问题原因:
    原因是:存储过程里默认不允许递归,递归深度是0,可以查一下默认的递归深度:
    select @@max_sp_recursion_depth;
    
    在这里插入图片描述
  • 解决问题:
    在存储过程里设置递归深度即可:
    SET @@max_sp_recursion_depth = 10;
    
    在这里插入图片描述

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 $$
    
    在这里插入图片描述
  • 测试看效果
    select fun_get_dog_name('1001');
    
    在这里插入图片描述
  • 好了,简单的一个小知识,就到这吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将镜像上传至阿里云?如何从阿里云中拉取自己的镜像?

目录 如何将制作好的镜像上传至阿里云&#xff1f; 一、前期准备 1、注册阿里云账户 2、登录账号 3、配置Docker加速器 4、创建镜像仓库的命名空间&#xff08;私有的&#xff09; 5.创建镜像仓库(创建镜像仓库时要绑定一个代码托管网站&#xff0c;例如&#xff1a;githu…

Zookeeper集群搭建

文章目录前言Zookeeper集群搭建&#xff08;一&#xff09;LeaderFollower模式&#xff08;二&#xff09;下载zookeeeper的压缩包&#xff08;三&#xff09;解压&#xff08;四&#xff09;修改配置文件&#xff08;五&#xff09;添加myid配置&#xff08;六&#xff09;安装…

痞子衡嵌入式:存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家讲的是存储器大厂Micron的NOR Flash芯片特殊丝印设计(FBGA代码)。 痞子衡之前写过一篇文章 《J-Flash在Micron Flash固定区域下载校验失败的故事》&#xff0c;这篇文章里提及了 Micron 家的串行…

明峰医疗IPO终止:亏损超过14亿元,王瑶法、潘华素夫妇为实控人

近日&#xff0c;上海证券交易所科创板披露的信息显示&#xff0c;明峰医疗系统股份有限公司&#xff08;下称“明峰医疗”&#xff09;向上海证券交易所提交了撤回上市申请文件的申请&#xff0c;保荐人海通证券提交了撤回保荐的申请。 因此&#xff0c;上海证券交易所决定终…

设计模式之创建型模式---单例模式

文章目录1.介绍2.应用场景3.实现3.1 结构3.2 类图3.3 代码示例3.3.1 饿汉式3.3.2 懒汉式3.3.3 双重检验锁3.3.3 静态内部类实现单例3.3.4 枚举类实现单例总结1.介绍 单例模式(singleton) 是指某个类中能生成一个实例&#xff0c;该类提供了一个全局访问点&#xff0c;提供一个唯…

JUC并发编程与源码分析笔记07-volatile与JMM

被volatile修饰的变量有两大特点 可见性、有序性&#xff0c;但是不保证原子性。 当写一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时&#xff0c;JMM会把该线程对应的本地内存设置为无效&#xff0c;重…

Java开发:汇编语言

一、为什么学习汇编语言 中国人和中国人沟通需要学习汉语 中国人和美国人沟通在会汉语的基础上还要学习英语 那么&#xff0c;人和机器沟通的话需要学习哪些语言呢&#xff1f; 答案是&#xff1a;人类的语言机器语言 但是&#xff0c;机器语言都是由0和1组成&#xff0c;人类…

opencv图像直方图

灰度直方图&#xff1a;从数学上来说&#xff0c;图像直方图是描述图像的各个灰度级的统计特性&#xff0c;它是图像灰度值的函数&#xff0c;统计图像中各个灰度级出现的次数或频率。从图像上来说&#xff0c;灰度直方图是一个二维图像&#xff0c;横坐标为图像中各个像素点的…

git stash命令用法详解(临时存储代码)

1、需求背景 有时候在开发过程中&#xff0c;在一个分支上&#xff08;dev1&#xff09;已经写了一部分代码&#xff0c;但是需要紧急切换到别的分支(dev2)上修改某个代码&#xff0c;这时候不能直接从dev1分支上切换到dev2分支上&#xff0c;提示你需要保存代码。此时dev1分支…

Linux内存模型

sparse内存模型前言1.SPARSEMEM原理:2.vmemmap在虚拟地址空间位置3.virt&#xff0c;phys&#xff0c;page&#xff0c;pfn之间的转换关系3.1内核态虚拟地址和物理内存地址转换关系3.2页帧pfn、物理内存的page指针的关系3.3其他快捷的转换总结前言 Linux中的物理内存被按页框划…

408 考研《操作系统》第二章第五节:信号量机制和用信号量机制实现进程互斥、同步、前驱关系

文章目录教程1. 信号量机制1.1 概念1.2 信号量机制——整型信号量1.3 信号量机制——记录型信号量&#xff08;important&#xff09;1.4 总结2. 用信号量机制实现进程互斥、同步、前驱关系2.1 信号量机制实现进程互斥&#xff08;important&#xff09;2.2 信号量机制实现进程…

java基于SpringBoot的在线答疑系统的研究与实现-计算机毕业设计

项目介绍 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大师生的喜爱&#xff0c;也逐渐进入了每个学生的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合…

【matplotlib】2-使用统计函数绘制简单图形

文章目录使用统计函数绘制简单图形1.函数bar()--用于绘制柱状图2.函数barh()--用于绘制条形图3.函数hist()--用于绘制条形图4.函数pie()--用于绘制饼图5.函数polar()--用于绘制极线图6.函数scatter()--用于绘制气泡图7.函数stem()--用于绘制棉棒图8.函数boxplot()--用于绘制箱线…

openGauss洗冤录 之 copy from

openGauss洗冤录 之 copy from 引子 之前一篇《测评报告&#xff1a;文件导入哪家强&#xff1f;》关于openGauss性能与预期不符的问题留下了个坑&#xff0c;今天回来填坑。 前文提到使用openGauss的copy from导入csv文件耗时是mysql的2倍&#xff0c;是PostgreSQL的6倍&#…

下载nacos-server-1.1.4安装包,使用mvn打包

git官方地址下载nacos-server-1.1.4.zip速度太慢&#xff0c;码云上下载地址没有安装包。采用从码云上下载源码&#xff0c;自行打包。(https://gitee.com/mirrors/Nacos/tree/1.1.4)下载完成之后&#xff0c;进入项目目录如图 下载源码后 &#xff0c;解压 本地在本文件夹 在d…

这十套练习,教你如何用Pandas做数据分析(03)

练习3-数据分组 探索酒类消费数据 步骤1 导入必要的库 运行以下代码 import pandas as pd 步骤2 从以下地址导入数据 运行以下代码 path3 ‘…/input/pandas_exercise/pandas_exercise/exercise_data/drinks.csv’ #‘drinks.csv’ 步骤3 将数据框命名为drinks 运行以下代…

SpringBoot+Vue实现前后端分离的航空售票管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

JavaScript(一):编写位置、输入输出语句

JavaScript入门一、 JavaScript编写位置二、输入输出语句一、 JavaScript编写位置 &#xff08;1&#xff09;编写到script标签中 控制浏览器弹出一个警告框 alert("警告内容")让计算机在页面中输出一个内容 document.write() /*可以向body中输出一个内容*/向控制…

基于java+springboot+mybatis+vue+mysql的自媒体社区平台

项目介绍 近几年来自媒体平台的发展越来越迅猛&#xff0c;并逐渐成为新闻信息传播的主流模式&#xff0c;自媒体平台的内容构成没有主要的核心&#xff0c;新闻信息的探讨和传播环境比较自由&#xff0c;与此同时自媒体平台概念的应用与发展,赋予了普通民众发表自己感想的权利…

OneUI 5.5.0 for HTML/PHP/VueJS

OneUI 是一个高度通用的 Bootstrap 管理仪表板模板和 UI 框架&#xff0c;支持 Laravel&#xff0c;可让您以相同的速度和稳健的布局创建各种网站。它是使用 Sass 和 ECMAScript 6 (ES6) 开发的&#xff0c;并为开发人员提供了各种智能工具&#xff0c;如 webpack5、Babel 7、G…