存储过程

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(使用前将#替换为@)

存储过程 的相关文章

  • 不使用窗口函数实现 SQL 查询

    我读过 可以通过创造性地使用连接等来实现在 SQL 窗口函数中可以执行的任何操作 但我不知道如何实现 我在这个项目中使用 SQLite 它目前没有窗口函数 我有一个有四列的表 CREATE TABLE foo id INTEGER PRIM
  • SQL查询多行变成单行

    有什么方法可以将通常返回具有相同值的多行的 SQL 查询更改为单行吗 例如 如果我现有的查询返回以下内容 ColA ColB 1 AA 1 BB 1 CC 2 AA 3 AA 我可以将查询更改为仅返回 3 行 并将 1 的第二个和第三个结果
  • 在触发器中记录更新操作

    我有一个 UPDATE 触发器 它生成 INSERTED 和 DELETED 表 如下所示 INSERTED Id Name Surname 1 Stack Overflow 2 Luigi Saggese DELETED Id Name
  • 如何授予用户访问 SQL Server 中的 sys.master_files 的权限?

    我需要授予数据库用户读取权限sys master files桌子 我怎样才能做到这一点 目前用户拥有以下权限 Calling SELECT on sys master files返回空结果 我还使用以下命令测试了相同的查询sa用户按预期工作
  • 如何终止正在运行的 SELECT 语句

    如何通过终止会话来停止正在运行的 SELECT 语句 该命令不断根据 SELECT 语句向我提供输出 我想在其间停止它 As you keep getting pages of results I m assuming you starte
  • 游标与更新

    一家公司使用 SQL Server 数据库来存储有关其客户及其业务交易的信息 您所在的城市引入了新的区号 对于前缀小于 500 的电话号码 区号 111 保持不变 前缀为 500 及以上的号码将分配区号 222 客户表中电话列中的所有电话号
  • 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵

    我想将大量数据从 F 传输到 SQL 表 基本上我的 F 代码创建了一个三列矩阵 UserID ProductID and price 和N行 我想将其 复制 粘贴 到数据库中 我尝试了多种选择 但最终 从 F 传输数据非常慢 10000
  • 在 SQL Server 中选择条件的值[重复]

    这个问题在这里已经有答案了 在查询选择中 我想显示字段是否满足条件的结果 想象一下我有一张名为stock 该表有一列告诉我库存中每种商品的数量 我想做的是这样的 SELECT stock name IF stock quantity lt
  • 从 ISO 周中提取日期 (201905) BigQuery

    我需要从 ISO 周数中提取星期日的日期 即 201905 它需要位于 standardSQL 中 因为它将使用不支持旧版本的脚本进行调度 我尝试从 Google Sheets 调整工作公式 但无法弄清楚 Google Sheets 的原始
  • 动态SQL生成列名?

    我有一个查询 我正在尝试将行值转换为列名称 目前我正在使用SUM Case As ColumnName 声明 像这样 SELECT SKU1 SUM Case When Sku2 157 Then Quantity Else 0 End A
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • 将两个sql查询合并为一个查询

    如何组合以下 2 个查询以便获得两列 PAYMODE 和付款类型 两个查询都很相似 并且针对同一个表 将两个 sql 查询合并为一个查询 这样我就不需要执行两个单独的查询 SELECT ETBL DESC TXT as PAYMODE FR
  • 获取 Postgres 数据库中每个表的行数

    获取数据库中所有表的行数的最有效方法是什么 我正在使用 Postgres 数据库 结果示例 table name row count some table 1 234 foobar 5 678 another table 32 如果您想要特
  • 使用子查询与 LEFT JOIN 一起选择 MAX 值

    我有一个获取搜索结果的查询 效果很好 查询成功示例 SELECT individuals individual id individuals unique id TIMESTAMPDIFF YEAR individuals day of b
  • PHP 中的 SQL 语句与 phpmyadmin 中的 SQL 语句的行为不同

    I have form store sql INSERT INTO myodyssey myaccount id email username password VALUES NULL email unixmiah formtest woo
  • 将 copyfromrecordset 写入范围

    我有以下 vba 它从单元格 C10 开始读取 MCO 直到其为空 并将从 SQL 数据库获取机器数量 解密和升级机器数量 这工作正常 但我在获取相应行中的数据时遇到问题 目前它总是将数据写入 D10 因为我已经对其进行了硬编码 但我不确定
  • Oracle 查询向上或向下舍入到最近的 15 分钟间隔

    08 SEP 20 08 55 05 08 SEP 20 15 36 13 下面的查询对于 15 36 13 可以正常工作 因为它四舍五入到 15 30 但 8 55 05 向下舍入到 08 45 而它应该四舍五入到 09 00 selec
  • 使用 SQL 确定子网掩码的 cidr 值

    我想找到一种方法来执行 SQL 查询 该查询将计算存储在数据库中的子网掩码的 cidr 位表示 例如 我在数据库中存储了 255 255 255 0 或其十进制值 4294967040 我想通过查询进行选择并返回 24 表示 我已经执行了类
  • 为什么 Clojure MySQL 查询结果中出现“M”

    我有一个返回一行的 Clojure 查询 下面是返回行 映射 的部分打印输出 employer percent 0 00M premium 621 44M 这两列在mysql表中分别是decimal 5 2 和decimal 7 2 为什么
  • 多个数据库连接

    我有三张桌子 categories content info and content The categories表包含类别的id及其 IDparent类别 The content info包含两列 entry id帖子的 ID 和cat

随机推荐

  • 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语句的集合 它经编译后存储在数据库中 用户通过指定的调用方法执行之 存储过程具有名称 参数及返回值 并且可以嵌套调用 存储过程是经过编译的 以可执行格式永久