存储过程

2023-11-04

好久没用过存储过程了,今天整理一下。

一、定义:存储过程是一组为了完成特定功能的SQL语句的集合,它经编译后存储在数据库中,用户通过指定的调用方法执行之。存储过程具有名称,参数及返回值,并且可以嵌套调用。

         存储过程是经过编译的,以可执行格式永久保存在数据库的SQL程序。

二、分类:系统存储过程、扩展存储过程、用户自定义存储过程

三、优点:快速执行、安全性好、访问统一、命名代码,允许延迟绑定、减少网络通信流量

四、存储过程与函数的区别

1.存储过程是预编译的,执行效率比函数高
2.存储过程可以不返回任何值,也可以返回多个输出变量,但函数有且必须有一个返回值。
3.存储过程必须单独执行,而函数可以嵌入到表达式中,使用更灵活。

4.存储过程主要是对逻辑处理的应用或解决,函数主要是一种功能应用。

SQL Server
(一)使用CREATE PROCEDURE语句创建存储过程

CREATE PROC[EDURE] procedure_name

[ {@paramenter data_type} [=default]

   [OUT|OUTPUT] [READONLY] [,...n] ]

[WITH[ENCRYPTION [,...n] ]

AS {<spl_statement> [ ; ] [...n] } [ ; ]


procedure_name:存储过程的名称
@ parameter:存储过程中的参数
data_type:参数的数据类型
Default:参数的默认值
OUTPUT:指示该参数是输出参数    
READONLY:指示该参数是只读的
ENCRYPTION:指示加密存储
sql_statement:包含在过程中的一个或多个 T-SQL 语句

通过检索数据库的系统表sysobjects以及syscomments,查看存储过程的代码
SELECT text FROM syscomments where id IN
    (SELECT id FROM sysobjects
     where name =’usp_Lend_Info’)
使用系统存储过程sp_helptext 来显示代码
sp_helptext usp_Lend_Info

1)如果在存储过程定义中使用了ENCRYPTION指示符则无法显示代码。

2)通过检索数据库的系统表sysobjects以及syscomments,查看存储过程的代码
SELECT text FROM syscomments where id IN
    (SELECT id FROM sysobjects
     where name =’usp_Lend_Info’)
使用系统存储过程sp_helptext 来显示代码
sp_helptext usp_Lend_Info

3)如果在存储过程定义中使用了ENCRYPTION指示符则无法显示代码。

4)使用 sysobjects 表查询法
IF NOT EXISTS (SELECT name FROM sysobjects
WHERE name ='procname' AND type='P')
CREATE PROCEDURE procname…

5)使用OBJECT_ID函数
IF OBJECT_ID('storename','P') IS NULL
CREATE PROCEDURE storename…


(二)用T-SQL的 EXECUTE 语句执行存储过程。
[EXEC[UTE]][@return_status=] procedure_name
[[@parameter=]{value|@variable[OUT[PUT]] [,…n ]]
[WITH RECOMPILE][;]
@return_status:保存存储过程的返回状态。
procedure_name:是要调用的存储过程名称。
value:传递给存储过程的参数值。可以按名称调用,也可以按在模块中定义的顺序提供。
@variable:是用来存储输入参数或输出参数的变量。
OUTPUT:指定存储过程将值送入输出参数。
WITH RECOMPILE:执行该存储过程时强制重新编译。
参数及保留字含义与CREATE PROCEDURE相同


(三)删除

使用DROP PROCEDURE 语句删除存储过程
DROP PROC[EDURE]  procedure_name

常用OBJECT_ID 函数检测存储过程存在后删除
IF OBJECT_ID('proceduere_name','P') IS NOT NULL
DROP PROCEDURE proceduere_name


(四)参数

1.输入参数:通过输入参数,调用程序可以将数据传送到存储过程中供存储过程使用,输入参数需要定义变量名及变量类型也可以根据需要设定其默认值,输入参数既可以将它们的值设置为常量,也可以使用变量的值。
2.输出参数:允许存储过程将数据或者游标变量传回给调用程序,输出参数使用OUTPUT关键字声明。
3.参数传递
(1)按参数位置传递
(2)按参数名字传递
* 参数执行可以由位置标识,也可以由名字标识,如果以位置标识,执行时按照参数的顺序依次填入;如果以名字传递参数,则参数的顺序是任意的。

4.使用常量调用
EXEC usp_Query_LendHistByPatronID 'T0101'或
EXEC usp_Query_LendHistByPatronID @PatronID ='T0101'
5.使用变量调用
--声明变量类型
DECLARE  @InputPatronID  VARCHAR(20)
--给变量赋值
SELECT @InputPatronID ='T0101 '
--执行
EXEC usp_Query_LendHistByPatronID @InputPatronID


例:如查询作者为姓周的图书信息,可以通过下列方法调用,未赋值的参数会启用默认值。
(1)按参数位置传递
EXEC usp_Query_BookInfo '','','周'
(2)按参数名字传递
EXEC usp_Query_BookInfo @Author='周'
按名字传递参数比按位置具有更大的灵活性,但是按位置传递参数速度更快。
例子:创建存储过程,通过输入读者证号,输出该读者的姓名,读者部门及读者类别。
CREATE PROCEDURE usp_Get_Patron_Info
  @PatronID VARCHAR(20),
  @Name VARCHAR(30) OUTPUT,
  @Department VARCHAR(40) OUTPUT,
  @Type VARCHAR(20) OUTPUT
AS
SELECT @Name=Name,@Department=department,@Type =Type
FROM Patron WHERE PatronID=@PatronID

调用该存储过程,查询读者证号为“T0101”读者的相关信息。
DECLARE @Name VARCHAR(30)
DECLARE @Department VARCHAR(40)
DECLARE @Type VARCHAR(20)
EXECUTE usp_Get_Patron_Info 'T0101',@Name OUTPUT,
                 @Department OUTPUT,@Type OUTPUT
SELECT  @Name,@Department,@Type --显示执行结果




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

存储过程 的相关文章

  • 不带 GROUP BY 的聚合查询

    这个查询似乎在我的旧机器上完美运行 但是 在我的 MySQL 5 7 14 和 PHP 5 6 25 的新机器上 它会抛出错误 致命错误 未捕获异常 PDOException 并带有消息 SQLSTATE 42000 语法错误或访问冲突 1
  • SQL 中基于下一条记录和上一条记录的复杂排序

    这是一个后续问题根据 SQL 中的下一条记录和上一条记录进行排序 https stackoverflow com questions 30477803 sorting based on next and previous records i
  • 可以使用表通配符创建 sql 查询吗?

    这可能是一个简单的问题 但我无法在网上找到解决方案 任何帮助将不胜感激 我正在尝试在 PHP 中创建一个 SQL 查询 并希望以某种方式将通配符应用于 TABLE 过滤器 可能是这样的 select from table 但是 到目前为止我
  • 通过 osql.exe 运行脚本时出现问题

    我尝试以这种格式运行我的软件的更新脚本 osql exe i path to script U 用户 P 密码 S sqlserver 位置 d 数据库名称 n b 大多数脚本的格式相同 并且都以 GO 结尾 其中很多都运行得很好 但随机脚
  • 加密数据库字段的好方法?

    我被要求加密数据库中的各种数据库字段 问题是这些字段在读取后需要解密 我在用着Django and SQL Server 2005 有什么好主意吗 See 在 SQL Server 2005 数据库中使用对称加密 https web arc
  • 检查两个“select”是否相等

    有没有办法检查两个 非平凡的 选择是否等效 最初我希望两个选择之间有形式上的等价 但是答案在证明 sql 查询等价性 https stackoverflow com questions 56895 proving sql query equ
  • 根据日期顺序排名

    我的数据如下 Heading Date A 2009 02 01 B 2009 02 03 c 2009 02 05 d 2009 02 06 e 2009 02 08 我需要如下排名 Heading Date Rank A 2009 02
  • st_intersects 与 st_overlaps

    这两个查询有什么区别 select a gid sum length b the geom from polygons as a roads as b where st intersects a the geom b the geom gr
  • 如何在MYSQL中将整个字符串小写并保持第一个大写[重复]

    这个问题在这里已经有答案了 我的表栏目 我预期的输出会在列中发生变化 Smith Allen Doyle Dennis Baker Waker 这是我尝试过的 但不起作用 UPDATE TABLE employee SET last nam
  • 如何从 SQL Server 2008 查询结果中删除“NULL”

    我有一个包含 59 列和超过 17K 行的表 很多行都有NULL在某些列中 我想删除NULL以便查询返回空白 而不是NULL 我可以运行一些更新功能来替换所有NULL with 使用 SQL Server 2008R2 Management
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • SELECT max(x) 返回 null;我怎样才能让它返回0?

    运行以下命令时如何返回 0 而不是 null SELECT MAX X AS MaxX FROM tbl WHERE XID 1 假设没有XID 1的行 or SELECT coalesce MAX X 0 AS MaxX FROM tbl
  • SQL查询查找表的主键?

    我怎样才能找到哪一列首要的关键使用查询来创建表 这是重复的question https stackoverflow com questions 893874 mysql determine tables primary key dynami
  • SELECT NULL、*、NULL、NULL 中令人困惑的 SQL 错误

    的背景我试图解决第四个现实任务 https www hackthissite org playlevel 4 在 hackthissite org 中 无法确切地弄清楚我应该在 URL 中注入什么 SQL 来检索电子邮件列表 浪费了几个小时
  • 基于多个表的数据更新单个表 SQL Server 2005,2008

    我需要更新表one使用表中的数据two 表一和表二没有任何公共列相关 桌子three与表相关two 例如 表一 reg det 表 reg det id reg id results 101 11 344 表二 临时表 venue resu
  • Oracle 中仅在一列上不同

    我想在下表中使用不同的值 但仅在 PlayerID 列上使用 这就是我现在所拥有的 MATCHID PLAYERID TEAMID MATCHDATE STARTDATE 20 5 2 14 JAN 12 01 JUN 11 20 5 4
  • Oracle SQL 分析查询 - 类似递归电子表格的运行总计

    我有以下数据 由A值 排序依据MM 月 The B列计算为GREATEST current value of A previous value of B 0 以类似电子表格的方式 我怎样才能计算B使用 SQL 查询 我尝试使用分析函数 但未
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • 可空数据类型与非空 varchar 数据类型 - 哪个查询速度更快?

    我们通常更愿意拥有我们所有的varchar nvarchar列不可为空使用空字符串 作为默认值 团队中有人建议nullable更好 因为 像这样的查询 Select From MyTable Where MyColumn IS NOT NU
  • 在查询中创建临时变量

    我希望能够在查询中创建一个临时变量 而不是存储过程或函数 它不需要声明和设置 这样我在调用它时就不需要传递查询参数 正在努力朝这个方向努力 Select field1 tempvariable 2 2 newlycreatedfield t

随机推荐

  • taro生命周期详解

    taro生命周期详解 taro介绍 生命周期 react的钩子函数 为兼容小程序的钩子函数 个别生命周期详解以及注意 1 render 函数 2 constructor 构造函数 3 在各个生命周期钩子函数中修改state的属性或者参数 4
  • 华为OD机试真题 (python)之支持优先级的队列

    题目描述 支持优先级的队列 实现一个支持优先级的队列 高优先级先出队列 同优先级时先进先出如果两个输入数据和优先级都相同 则后一个数据不入队列被丢弃 队列存储的数据内容是一个整数 输入描述 组待存入队列的数据 包含内容和优先级 输出描述 队
  • java corn 定时任务调度,每分钟执行一次,每半个小时执行一次

    java corn 表达式 每分钟执行一次 Scheduled cron 0 1 每半个小时执行一次 Scheduled cron 0 0 30 springboot 类 EnableScheduling Configuration Slf
  • 自定义截图方法,如何在RobotFrameWork的日志中显示

    用RobotFrameWork做UI自动化时 一般初学者都会选择第三方扩展库SeleniumLibrary进行UI自动化测试 随然已经封装许多浏览器操作方法 但在实际应用 某些方法还是不能满足我们的需求 于是乎 我们就舍弃SeleniumL
  • 以服务方式启动安防监控系统EasyNVR程序出现播放异常,是什么原因?

    EasyNVR安防视频监控平台的特点是基于RTSP Onvif协议 将前端设备统一接入 在平台进行转码 直播 处理及分发 在智慧安防视频监控场景中 EasyNVR可实现实时监控 云端录像 检索与回放 云存储 告警 级联等视频能力 极大满足行
  • 1.2 Ubauntu 使用

    一 完成VMware Tools安装 双击 VMwareTool 打开 Ubuntu 终端快捷键 Alt Control T 切换汉语的快捷键是Alt 空格 ls 打印出当前所在目录中所有文件和文件夹 cd 桌面 进入桌面文件夹 sudo
  • java生成有理数_第四届蓝桥杯Java B——有理数类

    有理数就是可以表示为两个整数的比值的数字 一般情况下 我们用近似的小数表示 但有些时候 不允许出现误差 必须用两个整数来表示一个有理数 这时 我们可以建立一个 有理数类 下面的 class Rational private long ra
  • Python-使用空值进行赋值-None

    0 摘要 在Python中 尤其是数组当中 对于一些异常值往往需要进行特殊处理 为了防止异常值与正常数据混淆 影响最终计算结果 常用的方法是将异常值置零或者置空 置零的方法较为简单 本文主要介绍如果对python中的数据进行置空 1 赋值为
  • 【TreeMap】-根据 key 或 value 排序

    1 根据 key 排序 引言 TreeMap 中key 可以自动对 String 类型或8大基本类型的包装类型进行排序 但是 TreeMap 无法直接对自定义类型进行排序 当我们想对对 TreeMap 中 key 中的自定义类型排序时 必须
  • 已解决:极品飞车9 Most Wanted无故跳出回桌面问题

    情况 1 可以进入游戏 2 新建用户 并可以进行第一项挑战赛 3 进行到某项赛事 生涯或挑战 时 再无法进去了 Loading 之后立即跳回桌面 程序结束 如果情况相同 那你可有救了 几经周折 找到这个地址 NEED For SPEED M
  • 使用io流一行一行读取txt文件

    io流分为字符流和字节流 字节流是万能流 可以处理任何数据 包含图片 视频 文字等 传输单位为字节 字符流只能读取文本数据 传输单位为字符 一 字节 的定义 字节 Byte 是一种计量单位 表示数据量多少 它是计算机信息技术用于计量存储容量
  • Linux系统与Windows系统之间的文件上传与下载

    Linux系统与Windows系统之间的文件上传与下载 在日常开发过程中 常常会遇到需要在Linux与Windows系统之间的文件的传输 有一些常用的方法与命令 在此记录 1 文件上传 从Windows系统上传文件到Linux系统中 有以下
  • 使用sklearn预处理数据之标准化、归一化、正则化

    文章目录 前言 二值化 最小最大化 属性缩放 正则化 标准化 前言 sklearn preprocessing是sklearn库中非常重要的一个module 集成了很多预处理数据的方法 今天对常用的几个加以解释说明 二值化 sklearn
  • 十年沉淀,回头发觉我当年面试 “Android” 竟然这么难!

    本文档收录了春招及秋招 含提前批 中能回忆起来的面试题 部分公司我既参加了春招也参加了秋招 将题目整合在了一起 所列题目不全 仅仅列出了我能回忆起来的部分题目 所列解答仅供参考 一 腾讯 春招 后台开发 二 阿里巴巴 秋招 阿里云 边缘计算
  • 在Windows下查看并设置CMD命令行字符编码格式,解决中文乱码问题。

    今天在复习java的时候 用cmd运行java文件时出现了中文乱码问题 其实这个问题我在大一下学期第一次上java课时就遇到了 可惜那时老师使用其他IDE来教学 我也懒得去解决这个问题 这个问题就不了了之了 今天又遇到这个问题 百度了相关资
  • Spring Boot自动配置

    原理是什么 原理就是通过loadFactoryNames读取实现配置好的spring factories 实例化其中的类 对于不同的实现有不同的处理逻辑 比如SpringBoot启动是需要的ApplicationContextInitial
  • postman 提交json中文乱码

    在headers中加 Content Type application json charset UTF 8 完美解决中文乱码问题
  • vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

    什么是postMessage postMessage是html5引入的API 它允许来自不同源的脚本采用异步方式进行有效的通信 可以实现跨文本文档 多窗口 跨域消息传递 多用于窗口间数据通信 这也使它成为跨域通信的一种有效的解决方案 vue
  • 渲染10w条数据怎么优化,虚拟列表技术上怎么实现,闪烁怎么解决

    当需要渲染大量数据时 可以采取以下优化措施 分批加载 将数据分批加载到页面上 而不是一次性加载所有数据 可以根据滚动位置或用户操作动态加载更多数据 以保持页面的响应性能 虚拟列表技术 虚拟列表技术是一种优化大量数据渲染的方法 它通过只渲染可
  • 存储过程

    好久没用过存储过程了 今天整理一下 一 定义 存储过程是一组为了完成特定功能的SQL语句的集合 它经编译后存储在数据库中 用户通过指定的调用方法执行之 存储过程具有名称 参数及返回值 并且可以嵌套调用 存储过程是经过编译的 以可执行格式永久