《数据库开发实践》之存储过程【知识点罗列+例题演练】

一、什么是存储过程?

1.概念理解:

存储过程是一组为了完成特定功能的SQL语句集。通过组成SQL语句和控制语句,提供一种封装任务的方法。因此在创建编译好某个存储过程后,因为存储过程中有可执行操作的sql语句,用户可以根据需求,调用该过程时输入参数即可执行。简单一点理解,也就是相当于我们在JAVA里面写的代码一样,封装好 某个类、方法,这样在需要这个方法的时候就去调用其,就不用再重新又写、反复写。

2.存储过程的优点:

(1)模块化的程序设计
(2)在服务器端运行,具有高效率的执行力
(3)减少网络流量,存储过程在编译后,也就是要在执行一次之后,它的执行规划就会保留在高速缓冲存储器中,用户在后期调用该存储过程时,后台便只需从高速缓冲存储器中调用编译好的二进制代码,提高了系统性能
(4)确保数据库的安全,防止了用户暴露数据库表的细节,可以作为安全机制使用  

3.存储过程的分类:

  • 系统存储过程
  • 用户自定义存储过程

二、Mysql语句创建、执行和删除存储过程

1.创建存储过程

创建时需要事先确定存储过程的三个组成部分:

(1).所有的输入参数以及传给调用者的输出参数。
(2).被执行的针对数据库的操作语句,包括调用其他存储过程的语句。
(3).返回给调用者的状态值以指明调用是成功还是失败。

(1) 创建语法格式:

CREATE PROCEDURE 存储过程名 ([参数 ... ])
[特征 ...]  存储过程体 
a.参数=:[ IN | OUT | INOUT ] 参数名 参数类型
  • 参数的命名不要与所联系的数据表的列名出现相同的
  • 有多个参数的时候,要用逗号隔开
IN类型——输入参数可以使数据传递给存储过程
OUT类型——输出参数当需要返回一个结果时使用
INOUT类型——输入/输出参数两者都可以充当
b.特征=:LANGUAGE SQL  | [NOT] DETERMINISTIC  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }  | SQL SECURITY { DEFINER | INVOKER }  | COMMENT 'string'
特征对应内容
LANGUAGE SQL存储过程的语言为SQL
[NOT] DETERMINISTIC存储过程是否确定性,即存储过程对同样的输入参数产生的结果是否相同
CONTAINS SQL[默认选项] 存储过程的子程序包含SQL语句,但是不包含读、写数据的语句
NO SQL存储过程中不包含SQL语句
READS SQL DATA存储过程只读取SQL数据
MODIFIES SQL DATA存储过程只修改SQL数据
SQL SECURITY { DEFINER | INVOKER }

存储过程执行的身份者指定

  • DEFINER:默认。创建该存储过程的用户许可
  • INVOKER:使用存储过程的用户许可
COMMENT 'string'存储过程的描述备注,string是描述的内容。使用SHOW CREATE PROCEDURE 就可以显示该信息
c.存储过程体:存储过程的主体部分,包含了调用存储过程时必会执行的SQL语句。
  • 开始标志是BEGIN,结束标志是END,只有 一条SQL语句时可以省略开始和结束标志;
  • 还需要注意的一个点是,因为存储过程里面的SQL语句是以分号结尾的,所以服务器在处理程序的时候遇到第一个分号就会以为要结束程序了,所以需要我们使用“Delimiter 结束符号”命令将Mysql语句的结束标志更改一下,编译后再恢复分号结束标志。

2.修改存储过程特征

MySQL只能通过ALTER语句修改存储过程的特征,不能修改存储过程体的内容,如需修改存储过程体的内容,需要先删除存储过程再重新创建

3.查看存储过程

show procedure status [like 'pattern']; 

其中,like 'pattern'为可选参数,用来匹配存储过程的名称,如果不指定该参数,则会查看所有的存储过程。

4.调用执行存储过程

call sp_name[(传参)];    

其中,sp_name为所执行的存储过程名称,传参表示根据存储过程定义时的参数进行传参。

5.删除存储过程

drop procedure [if exists] 存储过程名;

三、异常处理

(1)MySQL定义异常捕获类型及处理方法的语法如下:

DECLARE handler_action HANDLER  
        FOR condition_value [, condition_value] ...  
        statement  
    handler_action:  
        CONTINUE | EXIT  | UNDO        
    condition_value:  
        mysql_error_code  
      | SQLSTATE [VALUE] sqlstate_value  
      | condition_name|SQLWARNING|NOT FOUND| SQLEXCEPTION 

a.HANDLER  :异常关键词

b.FOR:声明

c.statement:表示出现某种条件、错误的时候需要执行的语句

  • 可以是简单的一句SQL语句
  • 可以是复杂的多行语句——这里就需要用起始标签Begin和结束标签End

d.hander_action:异常类型,表示执行完statement后希望系统执行什么动作

  • CONTINUE | EXIT  | UNDO        
  • continue:程序继续——SQL WARNING和NO FOUND 的默认处理方法
  • exit:跳出程序——SQLEXCEPTION的默认处理方法
  • undo:程序回滚,撤销

d.condition_value:表示一个异常处理可以定义成针对多种情况进行相应的操作

condition_value内容
mysql_error_codeMySQL错误码,一个由mysql自定义的数字
SQLSTATE[VALUE] sqlstate_valueSQL状态码,一个由五个字符组成的字符串
condition_name条件名称,使用declare...condition语句定义
SQLWARNINGSQL警告,表示SQLSTATE中字符串以‘01’起始的错误
NOT FOUND找不到,表示SQLSTATE中字符串以‘02’起始的错误
SQLEXCEPTION

SQL异常,表示SQLSTATE中字符串不以‘00’,‘01’,‘02’起始的错误

其中,‘00’是表示成功执行。

四、例题演练

1.创建一个存储过程p_yg1:

实现根据传入参数部门名称可以查询各部门所有员工的员工编号,员工姓名和职务。并调用此存储过程查询“技术”部门员工的员工编号,员工姓名和职务

delimiter //
create  procedure p_yg1( IN departmentName varchar(30))
begin
select  ygxx.ygbh,ygxx.name,ygxx.zw from ygxx inner join  bmxx on ygxx.ssbmbh=bmxx.bmbh  where bmxx.bmmc=departmentName;
end //
delimiter;

1)创建存储过程p_yg1 

 (2)调用存储过程p_yg1

2.创建一存储过程p_intsp1:

  • 通过带参数的存储过程向表spxx中插入一条数据,传入参数为spbh,spmc,sslb,jg,sl
  • 如果插入主键重复数据(错误号1062),则将spbh和spmc插入错误记录表splog中
  • 数据插入时间赋为当前日期,操作标志位赋上'insert'。
DELIMITER //
CREATE PROCEDURE p_intsp1 (IN spbh VARCHAR(20), IN spmc VARCHAR(30), IN sslb VARCHAR(20), IN jg DOUBLE, IN sl INT)
BEGIN
    DECLARE t_error INTEGER DEFAULT 0;
    DECLARE CONTINUE HANDLER FOR 1062 SET t_error = 1;
    INSERT INTO spxx (spbh, spmc,sslb, jg, sl) VALUES (spbh, spmc,sslb, jg, sl);
    IF t_error = 1 THEN
        INSERT INTO splog (spbjlog, spmclog, sjlog, bz) VALUES (spbh, spmc, NOW(), 'insert');
    ELSE 
        COMMIT;
    END IF;

END //
DELIMITER ;

(1)创建存储过程p_intsp1

(2)调用存储过程

a.展示当前的商品信息表和记录表

b.插入一条数据,重复了主键id
c.此时商品信息表没有新数据插入,记录log表插入新数据

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

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

相关文章

OFDM——PAPR减小

文章目录 前言一、PAPR 减小二、MATLAB 仿真1、OFDM 信号的 CCDF①、MATLAB 源码②、仿真结果 2、单载波基带/通频带信号的 PAPR①、MATLAB 源码②、仿真结果 3、时域 OFDM 信号和幅度分布①、MATLAB 源码②、仿真结果 4、Chu 序列和 IEEE802.16e 前导的 PAPR①、MATLAB 源码②…

模型 KANO卡诺模型

本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知。需求分析。 1 卡诺模型的应用 1.1 餐厅需求分析故事 假设你经营一家餐厅,你想了解客户对你的服务质量的满意度。你可以使用卡诺模型来收集客户的反馈,并分析客户的…

MySQL的日志管理以及备份和恢复

MySQL日志管理 mysql的日志默认保存位置为/usr/local/mysql/data vim /etc/my.cnf #开启二进制日志功能 vim /etc/my.cnf [mysqld]##错误日志,用来记录当MySQL启动、停止或运行时发生的错误信息,默认已开启 log-error/usr/local/mysql/data/mysql_…

Python从入门到网络爬虫、自动化

可以创建C、C#、Python、Golang、Java、React、Node、Vue、PHP项目 创建Java项目 创建Python项目 简单if……else……语句 # 简单的if……else……语句 state True if state:print("状态正常") else:print("状态异常")# 复杂的if……elif……语句 score …

基于 LangChain + GLM搭建知识本地库

一种利用 langchain 思想实现的基于本地知识库的问答应用,目标期望建立一套对中文场景与开源模型支持友好、可离线运行的知识库问答解决方案。 受GanymedeNil的项目document.ai和AlexZhangji创建的ChatGLM-6B Pull Request启发,建立了全流程可使用开源模…

【Linux C | 文件I/O】文件数据的同步 | sysc、fsync 和 fdatasync 函数

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…

电压,电流,温度采样检测原理

电流采集电路: 电流采样原理: 电压采样电路: 温度检测:通过热敏电阻实现 以上资料来源于:正点原子,仅做学习笔记使用

20231231_小米音箱接入GPT

参考资料: GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker *.设置运行脚本权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned *.配置小米音箱 ()pip install miservice_fork -i https://pypi.tuna.tsinghua.edu.cn/sim…

2013年AMC8数学竞赛中英文真题典型考题、考点分析和答案解析

“一元复始,万象更新。行而不辍,未来可期。” 努力学习和奋斗的时光总是过得飞快,不知不觉,2024年已经悄然而至,今天是2024年1月1日,六分成长祝所有的读者朋友和孩子们新年快乐!学习进步&#…

Django 学习教程- Django 入门案例

Django学习教程系列 Django学习教程-介绍与安装 前言 本教程是为 Django 5.0 编写的,它支持 Python 3.10 至以上。如果 Django 版本不匹配,可以参考教程 使用右下角的版本切换器来获取你的 Django 版本 ,或将 Django 更新到最新版本。如果…

uni-app js语法

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

1.项目简介

本次项目建立的基础是基于Django后台admin管理功能上的二次加工以符合实际情况,所以需要读者对Django这个架构有一定的了解,具体可以查看作者的另一个专栏Django详解。 随着信息技术的迅猛发展,图书馆的借阅系统也在不断地进行更新和改进。传…

Element|InfiniteScroll 无限滚动组件的具体使用方法

目录 InfiniteScroll 无限滚动 基本用法 详细说明 v-infinite-scroll 指令 infinite-scroll-disabled 属性 infinite-scroll-distance 属性 总结 需求背景 : 项目统计管理列表页面,数据量过多时在 IE 浏览器上面会加载异常缓慢,导致刚…

「实验记录」CS144 Lab1 StreamReassembler

目录 一、Motivation二、SolutionsS1 - StreamReassembler的对外接口S2 - push_substring序列写入ByteStream 三、Result四、My Code五、Reference 一、Motivation 我们都知道 TCP 是基于字节流的传输方式,即 Receiver 收到的数据应该和 Sender 发送的数据是一样的…

jmeter的常用功能及在测试中的基本使用和压测实战

Jmeter基础功能 了解Jmeter的常用组件 元件:多个类似功能组件的容器(类似于类) 一:Test Plan(测试计划) 测试计划通常用来给测试的项目重命名,使用多线程脚本运行时还可以配置线程组运行方式…

无监督学习(下)

1.高斯混合模型(GMM) (1)简单概念 高斯混合模型是一种概率模型,它假定实例是由多个参数未知的高斯分布的混合生成的。从单个高斯分布生成的所有实例都形成一个集群,通常看起来像一个椭圆。每个集群都可以由不同的椭圆形状,大小,密…

C# 给方形图片切圆角

写在前面 在有些场景中&#xff0c;给图片加上圆角处理会让视觉效果更美观。 代码实现 /// <summary>/// 将图片处理为圆角/// </summary>/// <param name"image"></param>/// <returns></returns>private Image DrawTranspar…

C语言-环境搭建

文章目录 内容Notepad的安装gcc编译工具的配置 编写软件的安装&#xff1a;软件传送门&#xff1a;Notepad软件选择一个合适的路径&#xff0c;一键傻瓜式安装即可 编译工具gcc在windows环境下的配置&#xff1a;解压gcc编辑工具包解压出来的mingw64文件放到一个合适的磁盘路径…

探索工业智能检测,基于轻量级YOLOv8开发构建焊接缺陷检测识别系统

焊接缺陷相关的开发实践在前面的博文中已经有所涉及了&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a;《探索工业智能检测&#xff0c;基于轻量级YOLOv5s开发构建焊接缺陷检测识别系统》 将智能模型应用和工业等领域结合起来是有不错市场前景的&#xff0c;比如&…

Java中实现百度浏览器搜索功能(windows/linux)

要在Java中实现百度浏览器搜索功能&#xff0c;你可以使用Selenium WebDriver。Selenium是一个用于自动化浏览器的工具&#xff0c;WebDriver是Selenium的一个子项目&#xff0c;它提供了一套API&#xff0c;可以直接与浏览器交互。 依赖: <dependencies><dependency…