存储过程的学习

news2024/10/3 10:43:50

1,前言        

        这是实习期间学习的,我可能是在学校没好好听课,(或者就是学校比较垃,没教这部分,在公司经理让我下去自己学习,太难了,因为是公司代码很多部分都是很多表的操作,所以导致都是存储过程,我最开始一脸懵)

        存储过程适用于各种关系型数据库,它就相当于是多条sql语句写在一起,写成了一个程序,可以一起执行。(可能不准确,但是我觉得比较便于理解)

        百度百科解释:存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。在数据量特别庞大的情况下利用存储过程能达到倍速的效率提升。

        根据此解释,我们可以分析一下,抓住其中几个关键部分:

2,存储过程的优点
(1)重复使用,存储过程可以重复使用,从而可以减少数据库开发人员的工作量。
(2)一次编译后永久有效,能够实现较快的执行速度
(3)能够减少网络流量
(4)可被作为一种安全机制来充分利用,可以防止sql注入攻击

3,适用情况

        由此可见,存储过程优点还是很多的,虽然也有缺点,但是使用与否还是要看实际情况,存储过程适用于:

        复杂业务逻辑:涉及多个表、多次查询和更新操作的复杂业务流程

        批量操作:导入大量数据、批量更新或删除数据。

        提高性能。

        数据安全性和权限控制。

        数据一致性和事务管理:存储过程可以包含事务处理语句,确保一系列数据库操作的原子性和一致性。

        对于简单的数据库操作或只涉及单个查询的情况,直接在应用程序中执行SQL语句可能更为简洁和高效。(所以,会了存储过程可不能写一个简单的单表查询就用存储过程)

4,存储过程的分类

        存储过程可分为三类:系统提供的存储过程、用户自定义存储过程和扩展存储过程
        系统:系统提供的存储过程,sp_*
        扩展:SQL Server环境之外的动态链接库DLL,xp_
        远程:远程服务器上的存储过程
        用户:创建在用户数据库中的存储过程
        临时:属于用户存储过程,#开头(局部:一个用户会话),##(全局:所有用户会话)

5,创建用户存储过程

        首先,肯定是先找到位置,打开存储过程,下面是两个软件不同位置,一个是可编程性,一个是函数。

         下面就是最最最重要的了, 如何开始写存储过程

        例如我们创建一个存储过程(空):

CREATE PROCEDURE [dbo].[abc]
AS
BEGIN

END

格式
CREATE PROC 过程名
@形参名 类型
@变参名 类型 OUTPUT
AS SQL语句

        其中[abc]是存储过程的名字,可以就行更改,只要再次进行编译就可以。

        简单的写两个实例:

        1,创建一个多表查询的存储过程

USE ABC
GO
CREATE PROCEDURE [dbo].[abc]
AS
SELECT x.sid,x.sname,y.cid,y.grade
FROM student x INNER JOIN sc y
ON x.sid=y.sid
WHERE x.sid=‘101010’

        2,利用输出参数计算阶乘

USE ABC
IF EXISTS(SELECT name FROM sysobjects
WHERE name=‘bcd’ AND type=‘P’) --名称是bcd类型是procedure
DROP PROCEDURE factorial
GO
CREATE PROCEDURE [dbo].[bcd]
@in float , --输入形式参数
@out float OUTPUT --输出形式参数
AS
DECLARE @i int
DECLARE @s float
SET @i=1
SET @s=1
WHILE @i<=@in
BEGIN
SET @s=@s*@i
SET @i=@i+1
END
SET @out=@s --给输出参数赋值

由此可见,存储过程也不难理解,它还有另外几部分:

调用存储过程
DECLARE @ou float
EXEC factorial 5,@ou out --实参表
PRINT @ou

删除存储过程
语法:
Drop procedure 过程名
SSMS方式删除:右键点击该存储过程,删除

修改存储过程
语法:
Alter procedure 过程名
As
SQL 语句

        以上是对存储过程简单的介绍,具体还有在程序中使用的部分,如何调用,需要什么参数,这都是需要继续的学习

        最后给大家看一下我学习成果,我写的一段简单的存储过程:

USE [XXX]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:
-- Last Date:   
-- Description:  数据校验
-- =============================================
ALTER PROCEDURE [dbo].[XXX_OfflineDataCheck2]
@EngineSerialNo NVARCHAR(255) = NULL,
@EngineType NVARCHAR(255) = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @QCOUNT INT, @TCOUNT INT, @Result INT, @TYPE NVARCHAR(255)
SET @Result = 0
SELECT @TYPE = LocationNo FROM Mst_Product WHERE @EngineType = @EngineType
IF @TYPE = '33'
BEGIN
	SELECT @TCOUNT = COUNT(*) FROM Trn_InspectionConfig WHERE EngineType = @EngineType AND StationCode NOT IN ('F01-3','F03-3','M15-2','S04-2','S13-2','S14-2','S15-2','F06','F07','F08')
END
ELSE
BEGIN
	SELECT @TCOUNT = COUNT(*) FROM Trn_InspectionConfig WHERE EngineType = @EngineType AND StationCode NOT IN ('F01-3','F03-3','M15-2','S04-2','S13-2','S14-2','S15-2')
END
SELECT @QCOUNT = COUNT(*) FROM Tmp_QualityDatas WHERE EngineSerialNo = @EngineSerialNo
SELECT @TCOUNT,@QCOUNT
IF @QCOUNT < @TCOUNT
BEGIN
	SELECT @QCOUNT = COUNT(*) FROM (SELECT * FROM Trn_QualityDatas UNION ALL SELECT * FROM Tmp_QualityDatas) A WHERE EngineSerialNo = @EngineSerialNo
END
SELECT @TCOUNT,@QCOUNT
IF @QCOUNT < @TCOUNT SET @Result = 21
RETURN @Result
SET NOCOUNT OFF;
END

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UI美工设计岗位的工作职责

UI美工设计岗位的工作职责1 职责&#xff1a; 1、负责软件界面的美术设计、创意工作和制作工作; 2、根据各种相关软件的用户群&#xff0c;提出构思新颖、有高度吸引力的创意设计; 3、对页面进行优化&#xff0c;使用户操作更趋于人性化; 4、维护现有的应用产品; 5、收集和…

MySQL SUBSTRING_INDEX() 函数的详细介绍

MySQL SUBSTRING_INDEX() 从给定字符串中返回指定数量的分隔符出现之前的子字符串。 当指定数字为正数时从最终分隔符的左侧返回子字符串&#xff0c;当指定数字为负数时从最终分隔符的右侧返回子字符串。 如果指定的次数大于分隔符的出现次数&#xff0c;则返回的子字符串将…

项目经理一起趟过的那些“坑”

大家好&#xff0c;我是老原。 在项目管理这行&#xff0c;有很多项目经理的前身都是搞技术的&#xff0c;他们大多数是因为技术工作做得好而走上管理岗位。 然而&#xff0c;这样走来的技术领导&#xff0c;在刚晋升时&#xff0c;往往会面临很多问题&#xff0c;经历痛苦的…

【Opencv入门到项目实战】(九):项目实战|信用卡识别|模板匹配|(附代码解读)

所有订阅专栏的同学可以私信博主获取源码文件 文章目录 0.背景介绍1.模板处理1.1模板读取1.2预处理1.3轮廓计算 2.输入图像处理2.1图形读取2.2预处理2.3轮廓计算2.4计算匹配得分 3.小结 0.背景介绍 接下来我们正式进入项目实战部分&#xff0c;这一章要介绍的是一个信用卡号识…

TDesign中后台管理系统-用户登录

目录 1 创建用户表2 开发后端接口3 测试接口4 修改登录页面调用后端接口最终效果总结 中后台系统第一个要实现的功能就是登录了&#xff0c;我们通常的逻辑是让用户在登录页面输入用户名和密码&#xff0c;调用后端接口去验证用户的合法性&#xff0c;然后根据接口返回的结果进…

Qt 8. UDP客户端通信

1. 代码 //UdpClient.h #ifndef UDPCLIENT_H #define UDPCLIENT_H#include <QtNetwork>class Ex2; // 声明类 class UdpClient : public QObject {Q_OBJECT public:explicit UdpClient(Ex2 *ui nullptr);~UdpClient();void Send(QByteArray buf,QHostAddress addr…

腾讯云服务器远程连接的方法大全

腾讯云服务器怎么连接登录&#xff1f;腾讯云服务器支持多种远程连接方法&#xff0c;可以使用腾讯云管理控制台自带的远程连接工具&#xff0c;也可以使用第三方远程连接工具&#xff0c;如如PuTTY、Xshell等&#xff0c;Linux操作系统可以SSH登录&#xff0c;Windows可以使用…

半导体学习入门书籍推荐之《Verilog数字系统设计教程》

Verilog HDL&#xff08;简称 Verilog &#xff09;是一种硬件描述语言&#xff0c;用于数字电路的系统设计。可对算法级、门级、开关级等多种抽象设计层次进行建模。 Verilog 继承了 C 语言的多种操作符和结构&#xff0c;与另一种硬件描述语言 VHDL 相比&#xff0c;语法不是…

JavaScript 操作历史记录api怎样使用 JavaScript

JavaScript 操作历史记录api怎样使用 JavaScript History 是 window 对象中的一个 JavaScript 对象&#xff0c;它包含了关于浏览器会话历史的详细信息。你所访问过的 URL 列表将被像堆栈一样存储起来。浏览器上的返回和前进按钮使用的就是 history 的信息。 History 对象包含…

数据库信息速递 -- MariaDB 裁员后,前景不确定 (翻译)

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请加 liuaustin3微信号 &#xff0c;在新加的朋友会分到3群&#xff…

【算法挨揍日记】day01——双指针算法_移动零、 复写零

283.移动零 283. 移动零https://leetcode.cn/problems/move-zeroes/ 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

C语言之位运算

一、什么是位运算 所谓位运算是指进行二进制位的运算 在系统软件中&#xff0c;常要处理二进位的问题 例如&#xff0c;将一个存储单元中的各二进位左移或右移一位&#xff0c;两个数按位相加等 二、位运算符和位运算 1、按位与 运算符(&) 参加运算的两个数据&#xff…

单志刚的七年联盟链之路:在正确的方向,同行者总会相遇丨对话MVP

单志刚在联盟链的道路上已经坚守了7年。 从最初创业时期的“用字节开发”&#xff0c;到现在作为数金公共服务 (青岛) 有限公司&#xff08;下称“数金公服”&#xff09;区块链研发中心产品总监&#xff0c;落地全国首个以数字人民币结算的碳普惠平台“青碳行”App&#xff0…

PhotoShop2023 Beta AI版安装教程

从 Photoshop 开始&#xff0c;惊艳随之而来​ 从社交媒体贴子到修饰相片&#xff0c;设计横幅到精美网站&#xff0c;日常影像编辑到重新创造 – 无论什么创作&#xff0c;Photoshop 都可以让它变得更好。​ Photoshop2023 Beta版本安装教程和软件下载 地址&#xff1a;点击…

Redis:揭秘高效缓存与数据存储利器

Redis&#xff08;Remote Dictionary Server&#xff09;是一款开源的、内存数据结构存储系统&#xff0c;广泛应用于高性能缓存、消息队列、实时分析和计数器等场景。本文将深入探索Redis的重要概念、底层架构实现原理&#xff0c;指导程序员如何部署和使用Redis&#xff0c;并…

力扣70.爬楼梯(动态规划)

/*** author Limg* date 2023/08/11* 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。* 每次你可以爬 1 或 2 个台阶。* 你有多少种不同的方法可以爬到楼顶呢&#xff1f; */#include<iostream> using namespace std; int climbStairs(int n); int main() {int n0;cin>&…

每天一道leetcode:139. 单词拆分(动态规划中等)

今日份题目&#xff1a; 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例1 输入: s "leetcode", …

Floyd算法

正如我们所知道的&#xff0c;Floyd算法用于求最短路径。Floyd算法可以说是Warshall算法的扩展&#xff0c;三个for循环就可以解决问题&#xff0c;所以它的时间复杂度为O(n^3)。 Floyd算法的基本思想如下&#xff1a;从任意节点A到任意节点B的最短路径不外乎2种可能&#xff…

FreeRTOS(消息队列)

资料来源于硬件家园&#xff1a;资料汇总 - FreeRTOS实时操作系统课程(多任务管理) 目录 一、消息队列的基本概念 1、消息队列的基本概念 2、消息队列的通信机制 3、FreeRTOS中消息队列特性 4、消息队列应用场景 二、消息队列常用API 1、使用消息队列的典型流程 三、消…

烘焙光照贴图,模型小部分发黑

1.首先确定创建了光照贴图UV&#xff0c;其次确定不是溢色&#xff0c;这个最简单&#xff0c;所有模型材质设置为双面就可以&#xff0c;URP材质球的话这里就是设置双面 在scence界面Texel Validity模式里查看溢色&#xff0c;红色表示有溢色&#xff0c;绿色表示正常 2. 光照…