Mysql-存储过程简单入门

定义:

        存储过程的英文是 Stored Procedure 。它的思想很简单,就是一组经过 预先编译 的 SQL 语句 的封装。 执行过程:存储过程预先存储在 MySQL 服务器上,需要执行的时候,客户端只需要向服务器端发出调用 存储过程的命令,服务器端就可以把预先存储好的这一系列 SQL 语句全部执行。

创建存储过程模板语法:

CREATE PROCEDURE 存储过程名(IN|OUT|INOUT 参数名 参数类型,...)
[characteristics ...]

BEGIN

 存储过程体

END

参数解释

参数前符号

IN :当前参数为输入参数,也就是表示入参; 存储过程只是读取这个参数的值。如果没有定义参数种类, 默认就是 IN ,表示输入参数。

OUT :当前参数为输出参数,也就是表示出参; 执行完成之后,调用这个存储过程的客户端或者应用程序就可以读取这个参数返回的值了。

INOUT :当前参数既可以为输入参数,也可以为输出参数。

存储过程的约束条件

characteristics 表示创建存储过程时指定的对存储过程的约束条件,其取值信息如下

1. LANGUAGE SQL :说明存储过程执行体是由SQL语句组成的,当前系统支持的语言为SQL。

2. [NOT] DETERMINISTIC :指明存储过程执行的结果是否确定。DETERMINISTIC表示结果是确定 的。每次执行存储过程时,相同的输入会得到相同的输出。NOT DETERMINISTIC表示结果是不确定 的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为NOT DETERMINISTIC。

3. { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } :指明子程序使 用SQL语句的限制:

1)CONTAINS SQL表示当前存储过程的子程序包含SQL语句,但是并不包含读写数据的SQL语句;

2)NO SQL表示当前存储过程的子程序中不包含任何SQL语句;

3)READS SQL DATA表示当前存储过程的子程序中包含读数据的SQL语句;

4)MODIFIES SQL DATA表示当前存储过程的子程序中包含写数据的SQL语句。

5)默认情况下,系统会指定为CONTAINS SQL。

4.SQL SECURITY { DEFINER | INVOKER } :执行当前存储过程的权限,即指明哪些用户能够执 行当前存储过程。

1)DEFINER 表示只有当前存储过程的创建者或者定义者才能执行当前存储过程;

2)INVOKER 表示拥有当前存储过程的访问权限的用户能够执行当前存储过程。

3)如果没有设置相关的值,则MySQL默认指定值为DEFINER。

4)COMMENT 'string' :注释信息,可以用来描述存储过程。

 关键字解释

1. BEGIN…END:BEGIN…END 中间包含了多个语句,每个语句都以(;)号为结束符。

2. DECLARE:DECLARE 用来声明变量,使用的位置在于 BEGIN…END 语句中间,而且需要在其他语句使用之前进 行变量的声明。

3. SET:赋值语句,用于对变量进行赋值。

4. SELECT… INTO:把从数据表中查询的结果存放到变量中,也就是为变量赋值。

 Demo示例

sql脚本,在本地自己任意一个练习的数据库下直接运行就好,包括表结构和数据

DROP TABLE IF EXISTS `employees`;
CREATE TABLE `employees`  (
  `EMPLOYEE_ID` int(12) NOT NULL,
  `LAST_NAME` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `MANAGER_ID` int(11) NULL DEFAULT NULL,
  `SALARY` decimal(10, 2) NULL DEFAULT NULL,
  `department_id` int(11) NULL DEFAULT NULL,
  `location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of employees
-- ----------------------------
INSERT INTO `employees` VALUES (100, 'STEVEN', 100, 1000.00, 50, 'jiangsu');
INSERT INTO `employees` VALUES (101, 'Kochhar', 100, 2000.00, 10, 'shenzhen');
INSERT INTO `employees` VALUES (102, 'De Haan', 100, 1000.00, 50, 'jiangsu');
INSERT INTO `employees` VALUES (103, 'Hunold', 102, 2000.00, 20, 'shenzhen');
INSERT INTO `employees` VALUES (104, 'Emst', 103, 1000.00, 30, 'jiangsu');
INSERT INTO `employees` VALUES (107, 'Lorentz', 103, 3000.00, 20, 'shenzhen');
INSERT INTO `employees` VALUES (124, 'Mourgos', 100, 1000.00, 40, 'beijing');

SET FOREIGN_KEY_CHECKS = 1;

数据效果:

 存储过程使用及其解释

需求:

        创建存储过程show_mgr_name(),查询某个员工领导的姓名,并用INOUT参数“empname”输入员工姓名,#输出领导的姓名。

#使用 DELIMITER 
#DELIMITER 语句只是用于帮助解析器正确解释存储过程定义的语法,并不会影响代码块中使用的实际 SQL 语句。
#在存储过程定义完成后,使用 DELIMITER ; 将分隔符改回默认的分号 (;)。
delimiter //
# 创建存储过程 show_mgr_name 指定为inout类型,即输如输出都是empname
create procedure show_mgr_name(inout empname varchar(25))
begin
    # 查询领导的名字,并将查询的LAST_NAME结果为变量empname赋值
    select LAST_NAME into empname
    from dbtest15.employees
        where EMPLOYEE_ID =
              #根据输入的员工姓名查询到领导的id
              (
            select MANAGER_ID
            from dbtest15.employees
            where LAST_NAME = empname
            );
end //
delimiter ;
#设置传入参数为Hunold,
set @empname :='Hunold';
# 使用call语法调用show_mgr_name存储过程
call show_mgr_name(@empname);
#查询结果:根据上面效果图片可以知道Hunold的领导是De Haan
select @empname;

调试

1. 通过 SELECT 语句,把程序执行的中间结果查询出来,来调试一个 SQL 语句的正确性。调试 成功之后,把 SELECT 语句后移到下一个 SQL 语句之后,再调试下一个 SQL 语句。

2.把存储过程中的 SQL 语句复制出来,逐段单独调试。

         很多公司禁止使用存储过程,但是存储过程或许我们不用但是还是要掌握,看懂了自己找一些例子多练练就好了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Godot引擎 4.0 文档 - 循序渐进教程 - 监听玩家输入

本文为Google Translate英译中结果,DrGraph在此基础上加了一些校正。英文原版页面: Listening to player input — Godot Engine (stable) documentation in English 监听玩家输入 在上一课创建您的第一个脚本的基础上,让我们看看任何游戏…

SpringBoot集成SpringSecurity从0到1搭建权限管理详细过程(认证+授权)

前言 最近工作需要给一个老系统搭建一套权限管理,选用的安全框架是SpringSecurity,基本上是结合业务从0到1搭建了一套权限管理,然后想着可以将一些核心逻辑抽取出来写一个权限通用Demo,特此记录下。 文章目录 前言1、SpringSecuri…

Elastic Stack

一、简介 ELK是一个免费开源的日志分析架构技术栈总称,官网https://www.elastic.co/cn。包含三大基础组件,分别是Elasticsearch、Logstash、Kibana。但实际上ELK不仅仅适用于日志分析,它还可以支持其它任何数据搜索、分析和收集的场景&#…

接口测试:Eolink Apikit 和 Postman 哪个更好用?

接口测试:Eolink Apikit 和 Postman 哪个更好用? 很多做服务端开发的同学,应该基本都用过 Postman 来测试接口,虽然 Postman 能支撑日常工作,但是总感觉还是少了点什么,比如需要 Swagger 来维护接口文档&am…

nginx压测记录

nginx压测记录 1 概述2 原理3 环境3.1 设备与部署3.2 nginx配置/服务器配置 4 netty服务5 步骤6 结果7 写在最后 1 概述 都说nginx的负载均衡能力很强,最近出于好奇对nginx的实际并发能力进行了简单的测试,主要测试了TCP/IP层的长链接负载均衡 2 原理 …

YOLOv5区域检测+声音警报

YOLOv5区域检测声音警报 1. 相关配置2. 检测区域设置3. 画检测区域线(不想显示也可以不画)4. 报警模块5. 代码修改5.1 主代码5.2 细节修改(可忽略) 6. 实验效果 本篇博文工程源码下载 链接1:https://github.com/up-up-…

远程桌面连接工具在哪里下载?

在市场上,有很多种不同的工具可用。一些远程桌面连接工具(如RayLink)具有高清流畅、操作简单和连接速度快的特点。而其他一些连接工具则更注重保护安全和数据保密性。不同的远程桌面连接工具各有特点,需要根据不同的需求进行选择。…

[AI图片生成]自己搭建StableDiffusion安装过程

前言 最近尝试玩玩AI图片生成,安装一路坑 出个一路安装成功的记录 开始 找个空间大的盘符,这玩意将来会很占空间.一个模型大约5g左右,你可能还会装很多模型创建个目录,路径不要有中文安装git 下载地址 详细教程 (如果有忽略)下载 Python3.10.0,记得勾选添加到环境变量选项,安…

ChatGPT帮你写简历找工作

随着随着毕业时间的到来,应届生将要面临求职问题,根据官方的统计,2023届高校毕业生预计达1158万人,就业市场竞争激烈,无论是校园招聘,招聘会,线上招聘除了自身的准备和个人能力,都会…

2023 hnust 大三下 人工智能导论课程 期中考试复习笔记

前言 ★大概率考✦个人推测考点※补充内容没有完全覆盖“人工智能导论复习2023.pdf”的重点致谢:hwl、lyf、lqx 题型 问答:5*10分综合:15分设计:25分开放题/论述题:10分 第1章 绪论 人工智能的定义 智能 思考与…

Android平台外部编码数据(H264/H265/AAC/PCMA/PCMU)实时预览播放技术实现

开发背景 好多开发者可能疑惑,外部数据实时预览播放,到底有什么用? 是的,一般场景是用不到的,我们在开发这块前几年已经开发了非常稳定的RTMP、RTSP直播播放模块,不过也遇到这样的场景,部分设…

MySQL和Redis如何保证数据一致性?

前言 由于缓存的高并发和高性能已经在各种项目中被广泛使用,在读取缓存这方面基本都是一致的,大概都是按照下图的流程进行操作: 但是在更新缓存方面,是更新完数据库再更新缓存还是直接删除缓存呢?又或者是先删除缓存再…

ATTCK v13版本战术介绍——防御规避(六)

一、引言 在前几期文章中我们介绍了ATT&CK中侦察、资源开发、初始访问、执行、持久化、提权战术理论知识及实战研究、部分防御规避战术,本期我们为大家介绍ATT&CK 14项战术中防御规避战术第31-36种子技术,后续会介绍防御规避其他子技术&#xf…

Revit幕墙:这些命令在幕墙嵌板中的妙用及快速幕墙

一、Revit中这些命令在幕墙嵌板中的妙用 在我们做幕墙时,通常会有不同种类的幕墙,比如材质不同,颜色不同。这时我们就需要去选中嵌板进行替换新样式的嵌板。 1.通常我们在替换嵌板时都是通过Tab切换,然后选中嵌板。这样进行来回切…

携手企企通,农业产业化国家重点龙头企业「罗牛山」加速采购数智化建设

导语 与企企通形成战略合作,双方基于供应商、合同管理、采购协同等多方面的应用场景,打造立足海南辐射全国的行业标准化解决方案。行业案例的示范作用,不仅对牛罗山采购业务数字化有指导意义,对整个畜牧养殖行业加入采购供应链管…

AI人工智能预处理数据的方法和技术有哪些?

AI人工智能 预处理数据 在人工智能(Artificial Intelligence,简称AI)领域中,数据预处理是非常重要的一环。它是在将数据输入到模型之前对数据进行处理和清洗的过程。数据预处理可以提高模型的准确性、可靠性和可解释性。 本文将…

阿里三面过了,却无理由挂了,HR反问一句话:为什么不考虑阿里?

进入互联网大厂一般都是“过五关斩六将”,难度堪比西天取经,但当你真正面对这些大厂的面试时,有时候又会被其中的神操作弄的很是蒙圈。 近日,某位测试员发帖称,自己去阿里面试,三面都过了,却被…

IMU和GPS融合定位(ESKF)

说明 1.本文理论部分参考文章https://zhuanlan.zhihu.com/p/152662055和https://blog.csdn.net/brightming/article/details/118057262 ROS下的实践参考https://blog.csdn.net/qinqinxiansheng/article/details/107108475和https://zhuanlan.zhihu.com/p/163038275 理论 坐标…

Python中的自定义函数创建方法和应用举例

Python中的自定义函数创建方法和应用举例 在Python语言中,函数是一组能够完成特定任务的语句模块,可分为内置函数、第三方模块函数和自定义函数。其中,内置函数是Python系统自带的函数;模块函数是NumPy等库中的函数。 1.自定义函…

如何让数据安全管理工作化繁为简?uDSP 十问十答

数据安全管理工作与国家数据安全、企业资产保护以及个人信息保护工作息息相关。复杂、多元、流通的数据也给数据安全带来了更多的威胁和挑战,如数据资产管理、分类分级问题,数据安全集中管控问题,数据共享与流通问题等。原点安全一体化数据安…