首页 > 数据库 >2023.6.15 07.数据库存储过程

2023.6.15 07.数据库存储过程

时间:2023-06-15 21:11:38浏览次数:51  
标签:存储 15 07 0.00 sec 2023.6 mysql 过程 PROCEDURE

07.数据库存储过程 存储过程 MySQL 存储过程是⼀组 预编译的 SQL 语句 ,可以在 MySQL 数据库中 定义和存储 ,并在 需要时执⾏ 。存储过程可 以接受参数、执⾏条件判断、循环、异常处理等操作,使得开发⼈员可以把⼀系列操作组合成⼀个可重复使⽤的单 元,从⽽提⾼代码的复⽤性和可维护性。 存储过程可以在 MySQL 数据库中创建和保存,然后在需要时调⽤。存储过程通常⽤于执⾏复杂的数据操作,例如 数据转换、数据清理、数据分析等。存储过程的执⾏速度通常⽐单个 SQL 语句的执⾏速度更快,因为存储过程是 预编译的,并且可以在多个客户端之间共享。 MySQL 存储过程的语法类似于其他编程语⾔,包括变量定义、条件语句、循环语句、异常处理等。存储过程可以 接受输⼊参数和输出参数,以及返回值。存储过程还可以使⽤游标来处理结果集,并且可以调⽤其他存储过程或函 数。 MySQL 存储过程是⼀种⾮常强⼤的⼯具,可以帮助开发⼈员提⾼代码的复⽤性和可维护性,同时还可以提⾼ 数据库的性能。 1、存储过程 存储过程保存在mysql.proc表中 2、创建存储过程: CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]]) 其中:proc_parameter : [IN|OUT|INOUT] parameter_name type 其中IN表示输⼊参数,OUT表示输出参数,INOUT表示既可以输⼊也可以输出;param_name表示参数名称;type表示 参数的类型 3、查看存储过程列表: SHOW PROCEDURE STATUS\G 4、查看存储过程定义 SHOW CREATE PROCEDURE sp_name mysql> SHOW CREATE PROCEDURE get_customer\G *************************** 1. row *************************** Procedure: get_customer sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_ BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION Create Procedure: CREATE DEFINER=`root`@`localhost` PROCEDURE `get_customer`(IN customer_id INT) BEGIN SELECT * FROM customers WHERE id = customer_id; END character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec) sql_mode 是 MySQL 中的⼀个参数,⽤于控制 MySQL 在执⾏ SQL 语句时的⾏为,包括数据类型的严格 性、⽇期的处理⽅式、空值的处理⽅式、SQL 语句的语法等等。   5、调⽤存储过程 CALL sp_name ([ proc_parameter [,proc_parameter ...]]) CALL sp_name 说明:当⽆参时,可以省略"()",当有参数时,不可省略"()"   6、存储过程修改 ALTER语句修改存储过程只能修改存储过程的注释等⽆关紧要的东⻄,不能修改存储过程体,所以要修改存储过程,⽅法 就是删除重建   7、删除存储过程 DROP PROCEDURE [IF EXISTS] sp_name   8、存储过程优势 存储过程把经常使⽤的SQL语句或业务逻辑封装起来,预编译保存在数据库中,当需要时从数据库中直接调⽤,省去了 编译的过程 提⾼了运⾏速度,同时降低⽹络数据传输量,存储过程相当于独⽴命令可以直接调⽤ 1. 提⾼性能 2. 提⾼安全性 3. 提⾼可维护性 4. 提⾼可重⽤性 5. ⽀持事务处理 ACID   9、存储过程与⾃定义函数的区别 1. 返回值类型不同:⾃定义函数必须返回⼀个值,⽽存储过程可以不返回任何值。 2. 使⽤⽅式不同:⾃定义函数可以在SQL语句中使⽤,如SELECT语句中的函数调⽤,⽽存储过程需要通过CALL 语句来调⽤。 3. 事务处理能⼒不同:存储过程可以包含事务处理代码,⽽⾃定义函数不能。 4. 参数传递⽅式不同:⾃定义函数只能通过参数传递来接收输⼊值,并返回计算结果。⽽存储过程可以通过输 ⼊、输出、输⼊输出三种参数类型来传递参数。 5. 可重⽤性不同:⾃定义函数可以在多个查询中使⽤,⽽存储过程需要单独调⽤。   10、存储过程示例: 10.1 创建储存过程⽆参数示例 1. 创建⼀个显示当前时间的储存过程⽆参数 mysql> delimiter // mysql> CREATE PROCEDURE showTime() -> BEGIN -> SELECT now(); -> END// Query OK, 0 rows affected (0.00 sec) mysql> delimiter ; mysql> CALL showTime; +---------------------+ | now() | +---------------------+ | 2023-05-25 15:17:44 | +---------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)   2. 查看存储过程: mysql> show procedure status like 'showTime'\G *************************** 1. row *************************** Db: wing Name: showTime Type: PROCEDURE Definer: root@localhost Modified: 2023-05-25 15:17:07 Created: 2023-05-25 15:17:07 Security_type: DEFINER Comment: character_set_client: utf8 collation_connection: utf8_general_ci Database Collation: latin1_swedish_ci 1 row in set (0.00 sec)   3. 跨数据库是否能执⾏: mysql> create database testdb; Query OK, 1 row affected (0.00 sec) mysql> use testdb; Database changed mysql> call showTime(); ERROR 1305 (42000): PROCEDURE testdb.showTime does not exist mysql> call wing.showTime(); +---------------------+ | now() | +---------------------+ | 2023-05-25 15:20:12 | +---------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)   4. 创建含参存储过程:只有⼀个IN参数 mysql> delimiter ; mysql> call selectById(2); ERROR 1305 (42000): PROCEDURE testdb.selectById does not exist mysql> call selectById(3); ERROR 1305 (42000): PROCEDURE testdb.selectById does not exist mysql> use wing; Database changed mysql> delimiter // mysql> CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED) -> BEGIN -> SELECT * FROM students WHERE stuid = uid; -> END// Query OK, 0 rows affected (0.00 sec) 10.2 创建储存过程有参数示例 1. 创建⼀个员⼯表   use wing; CREATE TABLE employees ( id INT PRIMARY KEY, name VARCHAR(50), age INT, department VARCHAR(50) ); INSERT INTO employees VALUES (1, 'Wing', 25, 'Devops'); INSERT INTO employees VALUES (2, 'Jane Smith', 30, 'Marketing'); INSERT INTO employees VALUES (3, 'Bob Johnson', 35, 'Engineering'); mysql> select * from employees; +----+-------------+------+-------------+ | id | name | age | department | +----+-------------+------+-------------+ | 1 | Wing | 25 | Devops | | 2 | Jane Smith | 30 | Marketing | | 3 | Bob Johnson | 35 | Engineering | +----+-------------+------+-------------+ 3 rows in set (0.00 sec)   2. 创建储存过程 DELIMITER // CREATE PROCEDURE `get_employee`(IN emp_id INT) BEGIN SELECT * FROM employees WHERE id = emp_id; END // DELIMITER ; 这个存储过程名为 get_employee ,它接受⼀个整数类型的参数 emp_id ,⽤于查找员⼯表中ID为 emp_id 的 员⼯记录。在存储过程中,使⽤ IN 关键字来指定参数类型。   3. 执⾏这个存储过程 mysql> CALL get_employee(1); +----+------+------+------------+ | id | name | age | department | +----+------+------+------------+ | 1 | Wing | 25 | Devops | +----+------+------+------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec)   10.3计算的存储过程示例 # @i 变量 # repeat 重复 # @i = @i + 1 相当于shell脚本⾥⾯的i++ delimiter // CREATE PROCEDURE dorepeat(n INT) BEGIN SET @i = 0; SET @sum = 0; REPEAT SET @sum = @sum+@i; SET @i = @i + 1; UNTIL @i > n END REPEAT; END// delimiter ; CALL dorepeat(100); SELECT @sum; 存储过程名为 dorepeat ,它有⼀个参数 n ,并使⽤ REPEAT 循环计算从0到n的总和。最后,存储过程将结果存储 在MySQL⽤户变量 @sum 中。 使⽤ delimiter 命令来指定存储过程的结束符。这是必要的,因为存储过程中包含了多个分号。在存储过程结束 后,使⽤ delimiter 命令将结束符改回分号。 使⽤ CALL 语句调⽤存储过程,并使⽤ SELECT 语句来检索存储在 @sum 中的结果   mysql> SELECT @sum; +------+ | @sum | +------+ | 5050 | +------+ 1 row in set (0.00 sec)    

标签:存储,15,07,0.00,sec,2023.6,mysql,过程,PROCEDURE
From: https://www.cnblogs.com/BXXY5961/p/17484121.html

相关文章

  • (2023.6.15)linux下can的调试工具交叉编译
    //源码包路径:https://public.pengutronix.de/software/libsocketcan/libsocketcan-0.0.11.tar.bz2https://public.pengutronix.de/software/socket-can/canutils/v4.0/canutils-4.0.6.tar.bz2//编译命令./configure--host=arm-linux-gnueabihf--prefix=/home/fangzeli/work/......
  • 2023-6-15 面试笔试复盘总结
    四川君迪能源后端笔试2023-6-15简答题:线程和进程的区别本质区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位。包含关系:一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。资源开销:每个进程都有独立的地址空......
  • 如何调试lvds屏-基于TQT507开发板
    1.1.更换不同的屏  TQT507可以通过修改指定启动配置文件(Embedsky.ini)方便地支持不同分辨率的屏。用户可以显示参数写入配置文件中,并放到sd卡内。插入sd卡启动板卡,板卡会读取配置文件内容,并进行相应的设置。1.2.显示屏接线说明 TQT507Android支持LVDS和HDMI输出。LVDS和HDMI同......
  • 欧奈儿行业 RPS 排名,一图览全貌 2023-06-15
    自动复盘2023-06-15k线图是最好的老师,点击详情图可以看到行业20日RPS的排名,最底下子图是行业rps走势线跟踪板块总结:成交额超过100亿排名靠前,macd柱由绿转红成交量要大于均线有必要给每个行业加一个上级的归类,这样更能体现主流方向rps有时候比较滞后,但不少是欲......
  • C/C++《数据结构》课程设计指导书[2023-06-15]
    C/C++《数据结构》课程设计指导书[2023-06-15]《数据结构》课程设计指导书适用专业:计算机2022级编写人:李玉龙2023年5月《数据结构》课程设计指导书一、设计目的1、训练学生灵活应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题;2.初步掌握软......
  • C/C++器材信息管理系统[2023-06-15]
    C/C++器材信息管理系统[2023-06-15]使用C++程序设计语言,完成一个项目,项目名为:器材信息管理系统,要实现的功能如下,且每项功能具有数据校对验证:1、实现新器材的录入,包括器材的名称、录入日期、购买价钱等信息;2、当有器材借用需求时,进行借用登记,主要流程为:查询器材数量,若库存数量大......
  • 深入理解ASEMI代理光宝LTV-152光耦的特性与应用
    编辑-Z光耦LTV-152是一种广泛应用于电子设备中的光电器件,它的主要功能是实现电路之间的隔离和信号传输。本文将深入探讨光耦LTV-152的特性和应用,帮助读者更好地理解和使用这种重要的电子元件。 一、光耦LTV-152的特性 1.高隔离电压:光耦LTV-152具有高达5000Vrms的隔离电压,......
  • 2023-06-15 css伪类before、after制作文字两边横线
    <divclass="box">测试</div>···.box{color:#ccc;text-align:center;position:relative;&::after{position:absolute;left:24rpx;top:52%;content:'';width:calc(50%......
  • 2023-06-15
    渐渐的网易的歌听着听着收费了渐渐的张江的电车坐着坐着拆了....时代的浪潮下每个人也许只是被迫的不断的适应社会的变化而已吧。 ......
  • 15 Spring核心注释示例
    我们经常将这些称为“Spring核心注释”,我们将在本文中对它们进行审核。这是所有已知的Spring核心注释的列表。@Autowired我们可以使用  @Autowired 注释  来标记Spring将要解析和注入的依赖关系。我们可以将这个注释与构造函数,setter或字段注入一起使用。构造函数注入:@RestCon......