数据库——实验9 存储过程的使用

news/2024/10/19 6:19:47/

1. 存储过程的定义

存储过程是一系列预先编辑好的、能实现特定数据操作功能的SQL 代码集,它与特定的数据库相关联,存储在SQL  Server服务器上。用户可以像使用自定义的函数一样重复调用这些存储过程,实现它所定义的操作。

2. 存储过程的类型

存储过程分为3类:系统存储过程、用户自定义存储过程和扩展存储过程。 

(1)系统存储过程主要存储在 master  数据库中并以 sp_ 为前缀。

(2)用户自定义存储过程是由用户创建并能完成某一特定功能(如查询用户所需数据信息)的存储过程,是封装了可重用代码的 SQL 语句模块。

(3)扩展存储过程允许使用高级编程语言(例如C 语言)创建应用程序的外部例程而使SQL   Server 的实例可以动态地加载和运行 DLL

3. 创建存储过程的步骤

一般来说,创建一个存储过程应按照以下步骤进行:

(1)编写SQL 语句。

(2)测试 SQL 语句是否正确,并能实现功能要求。

(3)若得到的结果数据符合预期要求,则按照存储过程的语法,创建该存储过程。 

(4)执行该存储过程,验证其正确性。

4. 使用 SQL 语句创建存储过程

创建存储过程的语法格式:

CREATE PROC [ EDURE ] procedure_name [ ;number ]

[ @parameter  data_type  [= default  ],…]

AS sql_statement

说明:

·procedure_name:给出存储过程名。

·Number:为可选的整数,对同名的存储过程指定一个序号。

·@parameter: 为存储过程的形参,@符号作为第一个字符来指定参数名。 

·data_type:指出参数的数据类型。

·=default:给出参数的默认值。

·sql_statement: 存储过程所要执行的 SQL 语句,它可以是一组 SQL 语句,可以包含流程控制语句等。

5. 创建、修改、调用、删除存储过程示例

在“学生管理”数据库中有“学生”表、“课程”表、“成绩”表结构如图1-20所示。 

1)创建存储过程

如果要通过SQL 语句创建一个存储过程,存储过程名为 student_grade,   要求现实如下功能:查询“学生管理”数据库中每个学生各门功课的成绩,其中包括每个学生的学号、姓名、课程名、分数,创建该存储过程的语句如下:

CREATE PROCEDURE student_grade

AS

SELECT 学号,姓名,课程名,分数

FROM 学生,课程,成绩

WHERE 学生.学号=成绩.学号 AND 成绩.课程号=课程.课程号

GO

2)修改存储过程

存储过程 student_grade 已创建,根据要求对它进行修改,只要使用 ALTER PROCEDURE 语句即可实现。

修改存储过程 student_grade,, 实现查询“学生管理”数据库中计算机系学生各门功课的成绩,其中包括每个学生的学号、姓名、课程名、学分、分数。

ALTER PROCEDURE student_grade

AS

SELECT 学号,姓名,课程名,学分,分数

FROM 学生,课程,成绩

WHERE 学生.学号=成绩.学号 AND 成绩.课程号=课程.课程号

AND学生.所在院系='计算机系'

GO

3)调用存储过程

EXEC student_grade

GO

4)删除存储过程

无用的存储过程可用 DROP 语句将其删除。

DROP PROCEDURE student_grade

GO


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

相关文章

声明式 GUI 工具包:响应式、跨平台、多语言 | 开源日报 No.230

slint-ui/slint Stars: 14.5k License: NOASSERTION slint 是一个声明式的 GUI 工具包,用于为 Rust、C 或 JavaScript 应用程序构建原生用户界面。 可扩展性:支持响应式 UI 设计,跨操作系统和处理器架构的跨平台使用,并支持多种…

具身智能的 Scaling Law

Scaling Law 具身智能的Scaling Law指的是一种理论,它探讨了具备智能的生物或机器系统随着规模的扩展而表现出的一些规律性变化。这个理论涵盖了许多方面,主要关注智能系统的不同尺度之间的相互关系。 具身智能是指生物或机器系统在其环境中感知、行动…

ASP.NET Core 标识(Identity)框架系列(四):闲聊 JWT 的缺点,和一些解决思路

前言 前面的几篇文章讲了很多 JWT 的优点,但作为技术人员都知道,没有一种技术是万能的 “银弹”,所谓有矛就有盾,相比 Session、Cookie 等传统的身份验证方式,JWT 在拥有很多优点的同时,也有着不可忽视的缺…

带头循环双向链表专题

1. 双向链表的结构 带头链表⾥的头节点,实际为“哨兵位”,哨兵位节点不存储任何有效元素,只是站在这⾥“放哨 的” “哨兵位”存在的意义: 遍历循环链表避免死循环。 2. 双向链表的实现 2.1双向链表结构 typedef int DataTyp…

Vue实现SM4加密

前端先看有无.eslintrc.js文件,添加 rules 和 ‘globals’ rules: {no-console: process.env.NODE_ENV production ? warn : off,no-debugger: process.env.NODE_ENV production ? warn : off,},"globals":{"base64js": true,}安装SM4 np…

ETL工具-nifi干货系列 第十六讲 nifi Process Group实战教程,一文轻松搞定

1、目前nifi系列已经更新了10多篇教程了,跟着教程走的同学应该已经对nifi有了初步的解,但是我相信同学们应该有一个疑问:nifi设计好的数据流列表在哪里?如何同时运行多个数据流?如启停单个数据流? 带着这些…

Android Compose页面跳转Demo

1.引入依赖 //jetpack compose导航 implementation("androidx.navigation:navigation-compose:2.5.3") 2.代码 import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundat…

Day43:LeedCode 1049. 最后一块石头的重量 II 494. 目标和 474.一和零

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…