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

article/2025/9/29 19:04:13

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()beginselect * 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()beginDECLARE `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))beginselect 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))beginselect '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))beginselect 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))beginSELECT 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))
    begindeclare 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) thenselect 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) 
      begindeclare 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) 
    begindeclare 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://chatgpt.dhexx.cn/article/TGPNW3hM.shtml

相关文章

oracle 存储过程 实例 循环 给查询赋值 游标取值

CREATE OR REPLACE PROCEDURE p_updete_gs is --仅供参考 i_jdid varchar(32); i_ryid varchar(32); cursor cur is --游标 给查询赋值 select c.jdid jdid, t.ryid rybh from t_zcj_rctj t,t_zj_jd c where t.ryidc.rybh and t.bgzt<>3 and c.bgzt<>…

SQL存储过程实例详解

SQL存储过程实例详解 本文用3个题目&#xff0c;从建立数据库到创建存储过程&#xff0c;详细讲解数据库的功能。 题目1 学校图书馆借书信息管理系统建立三个表&#xff1a; 学生信息表&#xff1a;student 字段名称 数据类型 说明 stuID char(10) 学生编号&#xff0c;主…

oracle存储过程实例

认识存储过程和函数 存储过程和函数也是一种PL/SQL块&#xff0c;是存入数据库的PL/SQL块。但存储过程和函数不同于已经介绍过的PL/SQL程序&#xff0c;我们通常把PL/SQL程序称为无名块&#xff0c;而存储过程和函数是以命名的方式存储于数据库中的。和PL/SQL程序相比&#xff…

MySQL存储过程实例

1、简单实例 create procedure demo.p_test1() begin-- 使用 declare语句声明一个变量declare id int default 0;declare name varchar(50) default ;-- 使用set语句给变量赋值set id7521;-- 将users表中id1的名称赋值给usernameselect ename into name from demo.emp where e…

存储过程详解与实例

存储过程 1、存储过程的优缺点 优点 通过把处理封装在容易使用的单元中&#xff0c;简化复杂的操作&#xff1b;简化对变动的管理&#xff1b;通常存储过程有助于提高应用程序的性能&#xff1b;存储过程有助于减少应用程序和数据库服务器之间的流量&#xff0c;因为应用程序…

数据库存储过程讲解与实例

目录 1 存储过程简介 2 存储过程使用 2.1 创建存储过程 2.2 in&#xff0c;out以及inout 1 存储过程简介 SQL语句需要先编译然后执行&#xff0c;而存储过程&#xff08;Stored Procedure&#xff09;是一组为了完成特定功能的SQL语句集&#xff0c;经编译后存储在数据库中…

【数据库】ACID底层实现原理

前言 我们在学MySQL的时候事务是必须要知道的部分&#xff0c;也就是原子性(Atomic)、一致性(Consistency)、隔离性(isolation)和持久性(Persistence)。知道他的概念其实是远远不够的&#xff0c;现在越来越卷&#xff0c;那么就必须知道的他的原理什么&#xff1f;怎么是实现…

数据库-ACID

ACID:原子性、持久性、一致性、独立性 事务的原子性(Atomicity)&#xff1a;是指一个事务要么全部执行&#xff0c;要么不执行&#xff0c;也就是说一个事务不可能只执行了一半就停止了。比如你从取款机取钱&#xff0c;这个事务可以分成两个步骤&#xff1a;1划卡&#xff0c;…

Mysql ACID详解

ACID简述 Atomicity、Durability实现之 &#xff08;WALredo log&#xff09; Atomicity 、Isolation实现之 &#xff08;锁 OR undo logMVCC&#xff09; 一、前言 主要是后台程序员都会和数据库打交道&#xff0c;最常用的关系型数据库是MySQL&#xff0c;最常用的存储引擎是…

数据库acid实现原理(二)

一、基础概念 事务&#xff08;Transaction&#xff09;是访问和更新数据库的程序执行单元&#xff1b;事务中可能包含一个或多个sql语句&#xff0c;这些语句要么都执行&#xff0c;要么都不执行。作为一个关系型数据库&#xff0c;MySQL支持事务&#xff0c;本文介绍基于MyS…

什么是 ACID

MySQL ACID及四种隔离级别的解释 脏读、非重复读、幻读 ACID&#xff0c;是指数据库管理系统&#xff08;DBMS&#xff09;在写入或更新资料的过程中&#xff0c;为保证事务&#xff08;transaction&#xff09;是正确可靠的&#xff0c;所必须具备的四个特性&#xff1a;原子性…

MySQL的ACID是如何实现的?

写在前面 本文主要探讨MySQL InnoDB 引擎下ACID的实现原理&#xff0c;对于诸如什么是事务&#xff0c;隔离级别的含义等基础知识不做过多阐述。 ACID MySQL 作为一个关系型数据库&#xff0c;以最常见的 InnoDB 引擎来说&#xff0c;是如何保证 ACID 的。 &#xff08;Atomi…

数据库的ACID原则

一、 事务的ACID属性 原子性&#xff08;Atomicity&#xff09; 原子性是指事务是一个不可分割的工作单位&#xff0c;事务中的操作要么都发生&#xff0c;要么都不发生。 一致性&#xff08;Consistency&#xff09; 事务必须使数据库从一个一致性状态变换到另外一个一致性状…

ACID理论

ACID 理论是对事务特性的抽象和总结&#xff0c;方便我们实现事务。可以理解成&#xff1a;如果实现了操作的 ACID 特性&#xff0c;那么就实现了事务。 1. 事务是什么 事务可以看成是一个或者多个操作的组合操作&#xff0c;并且它对这个组合操作提供一个保证&#xff0c;如果…

mysql acid

本文实验的测试环境&#xff1a;Windows 10cmdMySQL5.6.36InnoDB 一、事务的基本要素&#xff08;ACID&#xff09; 1、原子性&#xff08;Atomicity&#xff09;&#xff1a;事务开始后所有操作&#xff0c;要么全部做完&#xff0c;要么全部不做&#xff0c;不可能停滞在中间…

数据库ACID四大特性到底为了啥,一文带你看通透

小伙伴想精准查找自己想看的MySQL文章&#xff1f;喏 → MySQL江湖路 | 专栏目录 说起数据库四大特性&#xff0c;同学们张口就来&#xff0c;ACID&#xff01;那为什么要ACID&#xff1f;每种特性的原理又是什么&#xff1f;如何实现的&#xff1f;废话少说&#xff0c;哈哥今…

ACID是靠什么来保证的?

首先&#xff0c;什么是ACID&#xff1f; 原子性&#xff08;A&#xff09;&#xff1a; 原子性就是一个事务内的操作&#xff0c;要么全部成功&#xff0c;要么全部失败。一致性&#xff08;C&#xff09; 一致性就是一个正确的结果到另一个正确的结果。换句话说就是一个事…

mysql的ACID

ACID是衡量事务的四个特性&#xff1a; 原子性&#xff08;Atomicity&#xff0c;或称不可分割性&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; 原子性&#xff1a;语句要么全执行&…

ACID

细节其实很多。。。 1 到底什么是ACID 首先需要说明的是&#xff0c;在IT领域&#xff0c;很多名词在不同的上下文环境中的语义是不同的。例如某些产品宣称支持“100% ACID”和“强一致性”等。那么&#xff0c;这些名词到底指的是什么&#xff1f;如果不结合具体的语境&#x…

[MySQL]事务ACID详解

专栏简介 :MySql数据库从入门到进阶. 题目来源:leetcode,牛客,剑指offer. 创作目标:记录学习MySql学习历程 希望在提升自己的同时,帮助他人,,与大家一起共同进步,互相成长. 学历代表过去,能力代表现在,学习能力代表未来! 目录 1. 事务的概念 2. 事务的特性 3.事务控制语法…