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

news/2024/5/19 19:34:59/

目录

写在前面

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 年出海历程,中国出海人现在面对与此前截然不同的市场环境,很多地区蓝海不再,也有不少赛道变得拥挤。 一体两面&…

AI风范,院士点赞丨北京人工智能峰会暨AI金雁奖颁奖典礼成功举办,实在智能再获AI金雁奖

4月14日,由中国电子商会人工智能委员会主办,中国创业者俱乐部、北京集智未来人工智能产业创新基地联合主办的“2023北京人工智能峰会暨AI金雁奖颁奖典礼”举行,汇聚了人工智能各领域的产学研专家、院士、人工智能企业代表近300人,…

简单六步,帮助HR高效管理零工

AIHR发布的《2023人力资源趋势》中提到,过去HR往往只关注全职员工,忽略了其他劳动力生态系统成员,比如零工、外包员工和临时工等,而如今这些劳动力生态系统的成员在公司的服务交付中发挥着越来越重要的作用。 △ 传统劳动力生态系…

一文带你快速了解业务流程分析和流程建模

🔥业务流程分析与建模 01业务流程分析要了解的问题 有哪些业务流程?业务流程如何完成?业务流程有谁参与?流程中有哪些控制流(如判断、 同步分支和会合)?多个不同流程建的关系?完成…

【观察】解读新一代戴尔AMD服务器:场景优化为先,筑牢数字化底座

毫无疑问,今天算力就是生产力已成为业界共识,特别是算力作为数字经济时代的关键生产力要素,更成为了挖掘数据要素价值,推动数字经济发展的核心支撑力和驱动力。 在此过程中,由算力驱动的数字经济除了以信息产业这一独立…

Self-supervised learning of a facial attribute embedding from video

Self-supervised learning of a facial attribute embedding from video 译题:视频中人脸属性嵌入的自监督学习 论文题目Self-supervised learning of a facial attribute embedding from video译题视频中人脸属性嵌入的自监督学习时间2018年开源代码地址https://…

VLAN与access接口、hybrid接口实验

[r1]dhcp enable //开启DHC0功能P [r1-GigabitEthernet0/0/0]int g 0/0/0.1 [r1-GigabitEthernet0/0/0.1]ip add 192.168.1.1 24 [r1-GigabitEthernet0/0/0.1]dhcp select interface //接口地址池 [r1-GigabitEthernet0/0/0.1]dhcp server dns-list 8.8.8.8 [r1-GigabitEthern…

网络安全-网站后台的寻找+网页JS文件信息收集

网络安全-网站后台的寻找网页JS文件信息收集 前言 一,我也是初学者记录的笔记 二,可能有错误的地方,请谨慎 三,欢迎各路大神指教 四,任何文章仅作为学习使用 五,学习网络安全知识请勿适用于违法行为 学习网…

【Unity】基于AVFoundation开发MacOS摄像头(一)

起因:unity的自带WebCamTexture在mac上使用导致崩溃或花屏 复现步骤: mac里要有多个摄像头实例(包括自带摄像头、虚拟摄像头、外接usb摄像头);启动自己的app;启动会议软件或其他任何一个可以切换摄像头的…

Window下编译PJSIP,不编译Media模块

Windows系统下使用VS2017进行编译PJSIP。 下载地址 PJSIP的地址:https://github.com/pjsip/pjproject 在线clone太慢的话,可以直接在这里下载比clone会快很多: https://github.com/pjsip/pjproject/releases 安装OpenSSL 直接安装已经编译…

Blender3.5 视图切换

目录 1. 数字小键盘切换视图1.1 正交顶视图1.2 正交前视图1.3 正交右视图1.4 透视图1.5 四格视图 2. 鼠标点击切换视图2.1 点击视图,根据需求选择对应视图2.2 点导航栏的坐标轴切换 3. 启用字母区数字键3.1 编辑——偏好设置——输入——勾选“模拟数字键” 1. 数字…

Downie 4 4.6.14 MAC上最新最好用的一款视频下载工具

Downie for Mac 简介 Downie是Mac下一个简单的下载管理器,可以让您快速将不同的视频网站上的视频下载并保存到电脑磁盘里然后使用您的默认媒体播放器观看它们。 Downie 4 下载 Downie 4 for Mac Downie 4 for Mac软件特点 支持许多站点 -当前支持1000多个不同的…

使用计算机视觉实战项目精通 OpenCV:1~5

原文:Mastering OpenCV with Practical Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线…