【SQL 必知必会】- 第十九课 使用存储过程

news/2025/2/6 1:46:10/

目录

写在前面

19.1 存储过程

19.2 为什么要使用存储过程

19.3 执行存储过程

19.4 创建存储过程

        注释代码


        这一课介绍什么是存储过程,为什么要使用存储过程,如何使用存储过程,以及创建和使用存储过程的基本语法。

写在前面

        本课的内容主要是讲述【存储过程】,即常说的 procedure,在实际的工作中,国内的很多公司都会刻意避开这个方式(至少我了解的北京、上海、杭州等公司是如此的),并且本课的内容也是极其的枯燥,procedure 的语法我这都没有介绍,可以说很复杂,并且不那么容易理解。

        如果你同时会好几种语言,那么你一定感觉出来了,不同的语言之间存在细微的差异,甚至一个功能,每个语言的实现方式 / 名称都不同,语言的混杂会让你后续的工作 / 学习愈加艰难。

        建议不是工作需要,这节课可以跳过,或者只做了解。如果需要深入了解的话,本课是不能满足你的需求的,你需要去寻找更加合适的博客 / 课程。

19.1 存储过程

        迄今为止,我们使用的大多数 SQL 语句都是针对一个或多个表的单条语句。并非所有操作都这么简单,经常会有一些复杂的操作需要多条语句才能完成。

        简单来说,存储过程就是为以后使用而保存的一条或多条 SQL 语句。可将其视为批文件,虽然它们的作用不仅限于批处理。

        存储过程很复杂,全面介绍它需要很大篇幅。本课不打算讲解存储过程的所有内容,只给出简单介绍,让读者对它们的功能有所了解。


19.2 为什么要使用存储过程

        我们知道了什么是存储过程,那么为什么要使用它们呢?理由很多,下面列出一些主要的。

  • 通过把处理封装在一个易用的单元中,可以简化复杂的操作(如前面例子所述)。
  • 由于不要求反复建立一系列处理步骤,因而保证了数据的一致性。如果所有开发人员和应用程序都使用同一存储过程,则所使用的代码都是相同的。这一点的延伸就是防止错误。需要执行的步骤越多,出错的可能性就越大。防止错误保证了数据的一致性。
  • 简化对变动的管理。如果表名、列名或业务逻辑(或别的内容)有变化,那么只需要更改存储过程的代码。使用它的人员甚至不需要知道这些变化。这一点的延伸就是安全性。通过存储过程限制对基础数据的访问,减少了数据讹误(无意识的或别的原因所导致的数据讹误)的机会。
  • 因为存储过程通常以编译过的形式存储,所以 DBMS 处理命令所需的工作量少,提高了性能。
  • 存在一些只能用在单个请求中的 SQL 元素和特性,存储过程可以使用它们来编写功能更强更灵活的代码。

        换句话说,使用存储过程有三个主要的好处,即简单、安全、高性能。显然,它们都很重要。不过,在将 SQL 代码转换为存储过程前,也必须知道它的一些缺陷。

  • 不同DBMS 中的存储过程语法有所不同。
  • 一般来说,编写存储过程比编写基本 SQL 语句复杂,需要更高的技能,更丰富的经验。

        尽管有这些缺陷,存储过程还是非常有用的,并且应该使用。事实上,多数 DBMS 都带有用于管理数据库和表的各种存储过程。

        其实不然,现在有更好的解决方案。
        使用集算器 SPL 可以替代存储过程,实现“库外存储过程”又或者将逻辑处理放在前后端代码中而不是在 SQL中。想要替换存储过程的主要原因:

  1. 调试困难
  2. 编写困难
  3. 阅读困难

19.3 执行存储过程

        存储过程的执行远比编写要频繁得多,因此我们先介绍存储过程的执行。执行存储过程的SQL 语句很简单,即 EXECUTE。EXECUTE 接受存储过程名和需要传递给它的任何参数。

EXECUTE AddNewProduct( 'JTS01','Stuffed Eiffel Tower',
6.49,'Plush stuffed toy with the text LaTour Eiffel in red white and blue' );

        这里执行一个名为AddNewProduct 的存储过程,将一个新产品添加到Products 表中。AddNewProduct 有四个参数,分别是:供应商ID(Vendors 表的主键)、产品名、价格和描述。这4 个参数匹配存储过程中4 个预期变量(定义为存储过程自身的组成部分)。此存储过程将新行添加到Products 表,并将传入的属性赋给相应的列。

        我们注意到,在 Products 表中还有另一个需要值的列 prod_id 列,它是这个表的主键。为什么这个值不作为属性传递给存储过程?要保证恰当地生成此 ID,最好是使生成此 ID 的过程自动化(而不是依赖于最终用户的输入)。这也是这个例子使用存储过程的原因

        简单来说就是让主键自动生成。

        以下是存储过程所完成的工作:

  • 验证传递的数据,保证所有 4 个参数都有值;
  • 生成用作主键的唯一ID;

        将新产品插入Products 表,在合适的列中存储生成的主键和传递的数据。

  • 这就是存储过程执行的基本形式。对于具体的 DBMS,可能包括以下的执行选择:
  • 参数可选,具有不提供参数时的默认值;
  • 不按次序给出参数,以“参数=值”的方式给出参数值。
  • 输出参数,允许存储过程在正执行的应用程序中更新所用的参数。
  • 用 SELECT 语句检索数据。
  • 返回代码,允许存储过程返回一个值到正在执行的应用程序。

19.4 创建存储过程

        正如所述,存储过程的编写很重要。为了获得感性认识,我们来看一个简单的存储过程例子,它对邮件发送清单中具有邮件地址的顾客进行计数。下面是该过程的 Oracle 版本:

CREATE PROCEDURE MailingListCount (ListCount OUT INTEGER
)
IS
v_rows INTEGER;
BEGIN
SELECT COUNT(*) INTO v_rows
FROM Customers
WHERE NOT cust_email IS NULL;
ListCount := v_rows;
END;

        这个存储过程有一个名为 ListCount 的参数。此参数从存储过程返回一个值而不是传递一个值给存储过程。关键字OUT 用来指示这种行为。Oracle 支持 IN(传递值给存储过程)、OUT(从存储过程返回值,如这里)、INOUT(既传递值给存储过程也从存储过程传回值)类型的参数。存储过程的代码括在 BEGIN 和 END 语句中,这里执行一条简单的 SELECT 语句,它检索具有邮件地址的顾客。然后用检索出的行数设置 ListCount(要传递的输出参数)。

        调用 Oracle 例子可以像下面这样:

var ReturnValue NUMBER EXEC MailingListCount(:ReturnValue);
SELECT ReturnValue;

        这段代码声明了一个变量来保存存储过程返回的任何值,然后执行存储过程,再使用 SELECT 语句显示返回的值。


        注释代码

        应该注释所有代码,存储过程也不例外。增加注释不影响性能,因此不存在缺陷(除了增加编写时间外)。注释代码的好处很多,包括使别人(以及你自己)更容易地理解和更安全地修改代码。对代码进行注释的标准方式是在之前放置--(两个连字符)。


http://www.ppmy.cn/news/48062.html

相关文章

5.2、Unix/Linux上的五种IO模型

5.2、Unix/Linux上的五种IO模型 1.阻塞blocking2.非阻塞non-blocking(NIO)3.IO复用(IO_multiplexing)4.信号驱动(signal-driven)5.异步(asynchronous)①异步函数介绍 1.阻塞blocking…

领跑行泊一体,纵目科技剑指自动驾驶L2到L4的规模化商业落地机遇

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 2019年,通用、丰田、特斯拉等11家车企承诺自动驾驶时间表,他们大都表示在2020年底实现高级别自动驾驶。以特斯拉为例,其CEO埃隆马斯克曾承诺在2020年实现自动驾驶食言后,随后在…

295-光纤数据收发 隔离卡 加速计算卡 基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡

基于 Kintex-7 XC7K325T的半高PCIe x4双路万兆光纤收发卡 一、板卡概述 板卡采用Xilinx公司的XC7K325T-2FFG900I芯片作为主处理器,可应用于万兆网络、高速数据采集、存储;光纤隔离网闸等领域。 二、功能和技术指标: 板卡功能 参…

核心业务8:提现+展示还款信息和回款信息

核心业务8:提现+展示还款信息和回款信息 1.提现(同理充值) 2.管理端显示投资记录 3.管理员显示还款计划 4.网站端显示投资记录 5.网站端显示还款记录 6.网站端显示回款记录 核心业务8:提现+展示还款信息和回款信息 1.提现(同理充值) ①controller com/atguigu…

苹果手机网速慢怎么办?这些方法帮你解决网速慢的问题!

案例:苹果手机数据网络信号差,怎么解决? 【家人们,苹果手机不知咋回事,网速很慢,想要在某宝买个东西都得卡个半天。哭了!有没有什么方法解决?】 苹果手机作为一款高端智能手机&…

Python OpenCV 3.x 示例:6~11

原文:OpenCV 3.x with Python By Example 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,你最…

什么牌子的蓝牙耳机音质最好?盘点2023音质最好的蓝牙耳机

近几年,蓝牙耳机在日常生活中的出现频率越来越高,不管是运动、听歌、追剧、玩游戏等等都能看到蓝牙耳机的身影。接下来,我来给大家盘点几款音质好的蓝牙耳机,感兴趣的朋友可以了解一下。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

融云出海赋能会干货回顾(二)| 地区、赛道选择和避坑攻略

“出海是这个时代给我们的机遇。”这是很多互联网出海人的心声。关注【融云全球互联网通信云】了解更多 走过跌宕起伏的 15 年出海历程,中国出海人现在面对与此前截然不同的市场环境,很多地区蓝海不再,也有不少赛道变得拥挤。 一体两面&…