实验10 存储过程

合集下载

存储过程及触发器实验报告

存储过程及触发器实验报告

存储过程及触发器实验报告实验目的:1、了解存储过程及其应用;2、了解触发器及其应用;3、掌握使用存储过程及触发器完成数据操作的方法。

实验过程:1、存储过程存储过程是指一组为了完成特定功能的SQL语句集合。

存储过程可以接收传入参数并返回处理结果。

存储过程的好处是可以减少网络流量,提高性能,增加安全性。

在本次实验中,我们将学习如何创建存储过程。

首先,在MySQL中打开MySQL Workbench,进入我们的实验数据库。

然后我们就可以创建一个存储过程了。

创建存储过程的语法如下:CREATE PROCEDURE procedure_name ()BEGIN-- SQL statementsEND;在这个语法中,procedure_name是我们想要创建的存储过程的名称。

在BEGIN和END 之间,我们可以输入一组SQL语句,这些语句将组成存储过程的主体内容。

我们可以以一个创建一个简单的存储过程作为例子,这个存储过程的作用是输出一条信息。

我们将这个存储过程命名为print_message。

在上面的语句中,我们定义了一个存储过程,它被命名为print_message。

它只包含一条SELECT语句,这条语句将输出Hello, World!这个字符串。

创建完存储过程之后,我们可以通过CALL语句来调用它:CALL print_message();执行这个语句后,我们将会看到Hello, World!这个字符串输出到屏幕上。

2、触发器触发器是一种被动的对象,它是由数据库管理系统在数据表上自动执行的一些操作。

当数据表中发生某些指定的操作时,触发器就会被调用执行。

触发器通常用于数据表中的数据变更操作,比如插入、更新和删除。

在本次实验中,我们将学习如何创建和使用触发器。

在MySQL中创建触发器的语法如下:CREATE TRIGGER trigger_name{BEFORE | AFTER} trigger_event ON table_nameFOR EACH ROW trigger_body;在这个语法中,trigger_name是我们想要创建的触发器的名称。

实验十 存储过程

实验十 存储过程

实验十存储过程【实验目的】理解存储过程概念、类型;掌握各种存储过程创建方法和查看、修改、删除存储过程方法。

【实验内容】1、使用T-SQL语句创建存储过程(1)创建不带参数存储过程1)创建一个从student表查询学号为95002学生信息的存储过程proc_1,其中包括学号、姓名、性别、出生日期、系别等;调用过程proc_1查看执行结果。

2)在选课系统数据库中创建存储过程proc_2,要求实现如下功能:产生学分为4的课程学生选课情况列表,其中包括学号、姓名、性别、课程号、学分、系别等。

调用过程proc_2查看执行结果。

(2)创建带参数存储过程创建一个从student表中按学生学号查询学生信息的存储过程proc_3.其中包括:学号、姓名、性别、出生日期、系别等。

查询学号通过执行语句中输入。

(3)创建带输出参数存储过程创建一个从sc表查询一门课程考试成绩总分存储过程proc_4,要求查询的课程号通过执行语句中的输入参数@course_no传递给存储过程,s@sum_grade 作为输出参数用来存放查询得到的总分。

执行此过程时用declare声明临时变量@sum_grade_output接收查询的总分。

参考:create proc student_proc4@startdate datetime,@enddate datetime,@recordcount int outputAsIf @startdate is null or @enddate is nullBeginRaiserror(‘null value are invalid’,5,5)ReturnEndSelect * from 学生信息表Where birthday between @startdate and @enddateSelect @recordcount=@@rowcountgo执行语句:declare @recordn intexec student_proc4 '01/01/1988','01/01/1990',@recordn outputprint 'the order count is:'+str(@recordn)(4)创建带重编译和加密的存储过程在sc表中创建一个带创建带重编译和加密的存储过程proc_exp5,要求实现如下功能:输入学生学号、根据该生选课的总学分显示提示信息,如果总学分<9,则显示“此学生学分不足”,否则显示“此学分已足”。

数据库实验10存储过程

数据库实验10存储过程

实验10存储过程一、实验目的1. 掌握用户存储过程的创建操作。

2. 掌握用户存储过程执行操作。

3. 掌握用户存储过程的删除操作。

二、相关知识存储过程:SQL Server 提供的一种将一些固定操作集中起来,由SQL Server 数据库服务器来完成的功能。

存储过程是机构编译和优化后存储在数据库服务器中的SQL语句,只需要调试即可使用。

存储过程的优点有:1)让服务器端能够快速执行某些SQL语句。

2)减少了服务器和客户端之间的数据流的。

3)方便实施企业规则。

4)封装后的过程对数据库保护具有一定安全性。

三、实验内容1. 创建带输入参数的存储过程。

2. 执行所创建的存储过程。

3.删除所有新创建的存储过程。

四、实验步骤(一)1. 创建带输入参数的存储过程。

1)启动SQL Server Management Studio,选择要操作的数据库,如“学生选课”数据库,然后打开新建查询窗口。

2)在查询命令窗口中输入创建存储过程的CREATE PROCEDURE 语句,如图14.11.1所示:这里,我们创建一个带输入参数的存储过程proc_xsqk1,其中的输入参数用于接收课程号,默认值为“001”,然后在“选课表”中查询该课程成绩不及格的学生学号,接着在“学生表”中查找这些学生的基本信息,包括学号、姓名、性别和联系电话信息,最后输出。

图14.11.1在查询窗口中创建存储过程3)点击快捷工具栏上的快捷铵钮“√”,对输入的CREATE PROCEDURE 语句进行语法分析。

如果有语法错误,则进行修改,直到没有语法错误为止。

4)点击快捷工具拦上的快捷按钮“!”,执行CREATE PROCEDURE 语句。

5)查看生成的存储过程,如图14.11.2。

图14.11.2存储过程2.执行所创建的存储过程1)在查询命令窗口中输入以下EXECUTE 语句,执行存储过程proc_XSQK1。

EXECUTE proc_xsqk1 '001'2)点击快捷工具拦上的快捷按钮“!”,执行存储过程。

存储过程开发实验报告

存储过程开发实验报告

一、实验目的1. 掌握存储过程的基本概念和功能。

2. 熟悉存储过程的创建、调用和修改方法。

3. 了解存储过程中的流程控制语句、变量、函数等使用。

4. 学会存储过程在实际数据库应用中的优势。

二、实验环境1. 操作系统:Windows 102. 数据库管理系统:MySQL 5.73. 开发工具:MySQL Workbench三、实验内容1. 创建存储过程(1)创建一个名为get_employee_info的存储过程,用于查询员工的姓名、性别、年龄和部门信息。

```sqlDELIMITER //CREATE PROCEDURE get_employee_info(IN emp_id INT)BEGINSELECT name, gender, age, department FROM employees WHERE id =emp_id;END //DELIMITER ;```(2)调用存储过程查询员工信息。

```sqlCALL get_employee_info(1);```2. 流程控制语句(1)使用IF-ELSE语句实现一个简单的计算器功能,根据输入的两个数字和运算符,返回计算结果。

```sqlDELIMITER //CREATE PROCEDURE calculator(IN a INT, IN b INT, IN operator CHAR(1), OUT result INT)BEGINIF operator = '+' THENSET result = a + b;ELSEIF operator = '-' THENSET result = a - b;ELSEIF operator = '' THENSET result = a b;ELSEIF operator = '/' THENSET result = a / b;ELSESET result = NULL;END IF;END //DELIMITER ;```(2)调用存储过程进行计算。

储存过程实验报告

储存过程实验报告

一、实验背景随着数据库技术的不断发展,数据库管理系统(DBMS)的功能日益强大,存储过程作为一种重要的数据库对象,在数据库应用中扮演着越来越重要的角色。

存储过程能够封装复杂的业务逻辑,提高数据库性能,增强数据安全性。

本实验旨在通过实际操作,掌握存储过程的创建、执行和管理方法,提高数据库应用开发能力。

二、实验目的1. 理解存储过程的概念和作用。

2. 掌握存储过程的创建、执行和管理方法。

3. 学会使用存储过程优化数据库性能。

4. 提高数据安全性。

三、实验环境1. 操作系统:Windows 102. 数据库:MySQL 5.73. 编程语言:MySQL四、实验内容1. 创建存储过程2. 调用存储过程3. 管理存储过程4. 优化存储过程性能五、实验步骤1. 创建存储过程(1)创建一个名为“get_user_info”的存储过程,用于查询用户信息。

```sqlDELIMITER //CREATE PROCEDURE get_user_info(IN user_id INT)BEGINSELECT FROM users WHERE id = user_id;END //DELIMITER ;```(2)创建一个名为“update_user_info”的存储过程,用于更新用户信息。

```sqlDELIMITER //CREATE PROCEDURE update_user_info(IN user_id INT, IN username VARCHAR(50), IN email VARCHAR(100))BEGINUPDATE users SET username = username, email = email WHERE id = user_id;END //DELIMITER ;```2. 调用存储过程(1)调用“get_user_info”存储过程查询用户信息。

```sqlCALL get_user_info(1);```(2)调用“update_user_info”存储过程更新用户信息。

存储过程的使用 实验报告

存储过程的使用   实验报告
GO
USEypp7
--声明四个变量,用于保存输入和输出参数
DECLARE@KECHENGMINGvarchar(20)
DECLARE@AVGCHENGJI1tinyint
DECLARE@MAXCHENGJI1tinyint
DECLARE@MINCHENGJI1tinyint
--为输入参数赋值
SELECT@KECHENGMING='高等数学'
--声明四个变量,用于保存输入和输出参数
DECLARE@KECHENGMINGvarchar(20)
DECLARE@AVGCHENGJI1tinyint
DECLARE@MAXCHENGJI1tinyint
DECLARE@MINCHENGJI1tinyint
--为输入参数赋值
SELECT@KECHENGMING='计算机基础'
1.使用if exists语句,如果存储过程“单科成绩分析”存在,就将其删除;
2.使用create proc语句创建存储过程;
3.定义所需要的输入参数和输出参数;
4.声明4个变量来保存输入和输出参数;
5.执行存储过程并显示结果。
同时,值得注意的是,在创建存储过程时,应该注意一些细节,如单词的拼写要准确无误,程序中用的是单引号而不是双引号等等。
--执行存储过程
EXEC单科成绩分析@KECHENGMING,
@AVGCHENGJI1OUTPUT,
@MAXCHENGJI1OUTPUT,
@MINCHENGJI1OUTPUT
--显示结果
SELECT@KECHENGMINGAS课程名,@AVGCHENGJI1AS平均成绩,@MAXCHENGJI1AS最高成绩,

存储过程与触发器实验报告

存储过程与触发器实验报告

存储过程与触发器实验报告一、引言存储过程和触发器是数据库中常用的高级功能,它们能够提高数据库的性能、数据一致性和安全性。

本实验报告将详细介绍存储过程和触发器的概念、用途以及实际应用。

二、存储过程2.1 概念存储过程是一组预定义的SQL语句集合,它们被命名并存储在数据库中,可以作为一个单元来调用和执行。

存储过程可以接受参数,并返回一个或多个结果集。

存储过程可以在应用程序层面减少网络传输,提高数据库性能。

2.2 用途存储过程的应用非常广泛,主要用于以下几个方面: 1. 数据库业务逻辑封装:将复杂的业务逻辑封装到存储过程中,使应用程序只需调用存储过程而不需要编写大量的SQL语句,简化应用程序的开发。

2. 数据库性能优化:通过存储过程可以减少网络传输,提高数据库性能。

3. 数据库安全性:通过存储过程,可以实现对数据库的访问权限控制,提高数据库的安全性。

2.3 示例下面以一个简单的示例来说明存储过程的使用。

2.3.1 创建存储过程CREATE PROCEDURE `get_employee_by_department` (IN department_id INT)BEGINSELECT * FROM employee WHERE department_id = department_id;END2.3.2 调用存储过程CALL `get_employee_by_department`(1);2.4 优化技巧为了进一步提高存储过程的性能,可以采用以下优化技巧: 1. 减少存储过程的参数:过多的参数会增加网络传输的负担,应尽量减少存储过程的参数数量。

2. 避免长时间占用资源:存储过程应尽量快速执行,避免长时间占用数据库资源。

三、触发器3.1 概念触发器是与表相关联的特殊类型的存储过程,它在表的数据发生变化时自动执行。

触发器可以监视INSERT、UPDATE或DELETE等操作,并在这些操作发生时自动触发执行一段预定义的代码。

存储过程操作实验报告

存储过程操作实验报告

一、实验模块数据库原理与应用二、实验标题存储过程操作实验三、实验内容1. 实验目的(1)掌握存储过程的概念和作用。

(2)学会创建和使用存储过程。

(3)了解存储过程与触发器的区别。

2. 实验原理存储过程是一组为了完成特定功能的SQL语句集,存储在数据库中供应用程序调用。

它可以提高数据库性能,简化代码编写,提高安全性。

3. 实验步骤(1)创建数据库```sqlCREATE DATABASE IF NOT EXISTS experiment;USE experiment;```(2)创建表```sqlCREATE TABLE IF NOT EXISTS employee (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,department_id INT);CREATE TABLE IF NOT EXISTS department (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50));```(3)插入数据```sqlINSERT INTO employee (name, age, department_id) VALUES ('张三', 25, 1),('李四', 30, 2),('王五', 28, 3);INSERT INTO department (name) VALUES ('技术部'),('业务部'),('售后部');```(4)创建存储过程```sqlDELIMITER //CREATE PROCEDURE get_department_name(IN emp_id INT, OUT dept_name VARCHAR(50))BEGINSELECT INTO dept_name FROM employee e INNER JOIN department d ON e.department_id = d.id WHERE e.id = emp_id;END //DELIMITER ;```(5)调用存储过程```sqlCALL get_department_name(1, @dept_name);SELECT @dept_name AS department_name;```(6)创建触发器```sqlDELIMITER //CREATE TRIGGER before_employee_insertBEFORE INSERT ON employeeFOR EACH ROWBEGINIF NEW.age < 20 THENSIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '年龄不能小于20岁'; END IF;END //DELIMITER ;```(7)尝试插入年龄小于20岁的数据```sqlINSERT INTO employee (name, age, department_id) VALUES ('赵六', 18, 1);```4. 实验结果与分析(1)成功创建存储过程和触发器。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验10 存储过程
1.实验目的
(1)掌握使用SQL Server管理平台和Transact-SQL语句创建存储过程、执行存储过程、修改存储过程、删除存储过程的用法。

(2)理解使用SQL Server管理平台和Transact-SQL语句查看存储过程定义、重命名存储过程的用法。

2.实验内容及步骤
请先附加studentsdb数据库,然后完成以下实验。

(1)CREATE PROCEDURE st_g
AS
BEGIN
SELECT x.学号,x.姓名,y.分数
FROM student_info x ,grade y
Where x.学号=y.学号
END
该程序完成的功能是创建一个存储过程,存储过程的功能是对student_info和grade表进行查询,然后输出学号,姓名和分数信息。

(2)设计一个存储过程proc_grade完成这样的功能:查询grade表中课程编号为’k002’的学号、分数信息,并使存储过程不能使用sp_helptext
查看(即加密),请编写程序实现。

答:create procedure proc_grade
with encryption
as
select学号,分数
from grade
where课程编号='k002'
--执行存储过程,进行验证
exec proc_grade
(3)修改存储过程proc_grade,查询grade表中课程编号为’k001’的学号、
分数信息,去掉proc_grade加密性,使其在运行时重新编译。

答:alter procedure proc_grade
with recompile
as
select学号,分数
from grade
where课程编号='k001'
--执行存储过程,进行验证
exec proc_grade
(4)在student_info 表中增加一列名为“手机号”,数据类型char(11)。

设计一个存储过程proc_tel,查询student_info表中末尾数字为5的手
机号码。

答:
craeate table student_info
add手机号char(11)
go
create procedure proc_tel
as
select手机号from student_info
where手机号like'%5'
--执行存储过程,进行验证
exec proc_tel
(5)设计一个存储过程proc_avg,输出grade表中每个学生的平均成绩。

答:create procedure proc_avg
as
select学号,avg(分数)as平均成绩
from grade
group by学号
--执行存储过程,进行验证
exec proc_avg
(6)设计一个存储过程,用于修改指定学生(参数@sid char(4))指定课程(参数为@cid char(4))的分数(@score decimal(3,1)),编写并调用该存储过程,修改学号’0002’的学生的修读课程‘K003’的成绩改为96。

编写并调用存储过程。

答:create procedure proc_modifyscore
@sid char(4),
@cid char(4),
@score decimal(3,1)
as
update grade set分数=@score
where学号=@sid and课程编号=@cid
--执行存储过程,进行验证
exec proc_modifyscore'0002','k003',96
(7)设计一个存储过程proc_list,查询grade表中指定课程(参数@cid
char(4))的成绩排名前3的学生成绩信息。

编写程序并调用该存储过程。

答:
alter procedure proc_list
@cid char(4)
as
select top 3 学号,分数
from grade
where课程编号=@cid
order by分数desc
--执行存储过程,进行验证
exec proc_list'k004'
(8)设计一个存储过程proc_credit完成这样的功能:输入学号@sid、课程名称@cname参数值,将查询curriculum、grade表,并从输出参数
@score、@credit获取该学生该课程的成绩和学分,如果分数大于等于60,
则返回对应课程的学分,否则返回学分值0,请编写程序并调用该存储过程。

答:
方案一:利用set进行赋值(SET是SQL Server 中对已经定义的变量赋值的
方式)
create procedure proc_credit
@sid char(4),
@cname nchar(10),
@score decimal(3,1)output,
@credit int output
as
SELECT @score = grade.分数, @credit = curriculum.学分
FROM curriculum
JOIN grade ON curriculum.课程编号= grade.课程编号
WHERE grade.学号= @sid
AND curriculum.课程名称= @cname;
if (@score<60)
begin
--通过set进行赋值
set @credit=0
end
--执行查询
declare@score int,@credit int
exec proc_credit'0001','c语言程序设计',@score output,@credit output
select@score,@credit
方案二:利用case when 语法
create procedure proc_credit
@sid char(4),
@cname nchar(10),
@score decimal(3,1)output,
@credit int output
as
select@score=grade.分数,@credit=case
when grade.分数<60 then 0
when grade.分数>=60 then curriculum.学分
end
from curriculum join grade on curriculum.课程编号=grade.课程编号
where grade.学号=@sid and curriculum.课程名称=@cname
--执行查询
declare@score int,@credit int
exec proc_credit'0001','c语言程序设计',@score output,@credit output
select@score,@credit
(9)创建一个自定义函数maxscore,用于计算指定课程号的最高分。

答:create function maxscore(@cid char(4))
returns int
as
begin
declare@score int
select@score=max(分数)from grade where课程编号=@cid
return@score
end
print dbo.maxscore('k001')
(10)创建一个自定义函数tscore,用于计算指定学生(姓名)所读的课程编
号、课程名、分数。

答:CREATE FUNCTION tscore(@sname char(8))
RETURNS Table
AS
RETURN (SELECT b.课程编号,c.课程名称,b.分数FROM student_info a join grade b on a.
学号=b.学号
join curriculum c on b.课程编号=c.课程编号
WHERE a.姓名=@sname)
select*from dbo.tscore('刘东')。

相关文档
最新文档