存储过程和触发器和用户自定义函数实验

合集下载

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

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

存储过程及触发器实验报告实验目的: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是我们想要创建的触发器的名称。

ch09自定义函数、存储过程和触发器

ch09自定义函数、存储过程和触发器

第9章 自定义函数、存储过程和触发器 教学提示:在数据库实际应用中,存在有带变量数据处理需求,如某班学生信息表、某老师带过的学生、某班某门课不及格学生等,还存在如某学生成绩录入时若该同学成绩不及格自动在[补考学生表]增加该同学的补考记录等。

本章介绍的自定义函数、存储过程、触发器是由一系列的Transact-SQL 语句组成的子程序,用来满足更高的应用需求,可以说是SQL Server程序设计的灵魂,掌握和使用好它们对数据库的开发与应用非常重要。

教学目标:通过本章的学习,要求掌握自定义函数、存储过程、触发器的概念、用途、创建方法,编写简单的自定义函数、存储过程、触发器。

9.1 自定义函数在SQL Server中,除了系统内置的函数外,用户在数据库中还可以自己定义函数,来补充和扩展系统支持的内置函数。

SQL Server用户自定义函数有标量函数、内嵌表值函数、多语句表值函数三种,本书只介绍最常用的前两种,且语法格式只给出常用的,完整语法格式请参看SQL Server帮助。

9.1.1 自定义函数的概念自定义函数是由一个或多个Transact-SQL语句组成的子程序,可用于封装代码以便重复使用。

自定义函数的输入参数可以为零个或最多1024个,输入的参数能够是除了时间戳(timestamp)、游标(cursor)和表(table)以外的其他变量。

9.1.2 创建自定义函数1. 用CREATE FUNCTION 语句创建自定义函数1) 标量函数标量函数返回RETURNS 子句中定义的类型的值,RETURN子句返回单个数据值,如同使用系统内置的函数一样。

主要语法格式:CREATE FUNCTION [所有者].自定义函数名([参数[...n])RETURNS 返回参数的类型 ASBEGIN函数体RETURN 函数返回的标量值ENDSQL Server 数据库管理与开发教程与实训·180· ·180·【例9.1】 创建一个自定义函数[is 中文字符串],判断自变量是否是纯中文字符串,返回字符串:'是'或'否'。

存储过程和触发器(实验报告)

存储过程和触发器(实验报告)
CREATE PROCEDURE stu_en
WITH ENCRYPTION AS
SELECT*
FROM student_info
WHERE性别='男'
EXEC stu_en
DROP PROCEDURE stu_en
4.使用grade表。
(1)创建一个存储过程stu_g_r,当输入一个学生的学号时,通过返回输出参数获取该学生各门课程的平均成绩。
CREATE PROC stu_g_r @stu_no varchar(8)=NULL,
@stu_score real OUTPUT
AS
SELECT@stu_score=AVG(分数)
FROM grade
WHERE (学号=@stu_no)
(2)执行存储过程stu_g_r,输入学号0002。
DECLARE @score real
WHERE (a.姓名=@stu_name)
EXEC stu_g_p ‘刘卫平’
sp_helptext stu_g_p
3.使用student_info表。
(1)创建一个加密的存储过程stu_en,查询所有男学生的信息。
(2)执行存储过程stu_en,查看返回学生的情况。
(3)使用Transact-SQL语句DROP PROCEDURE删除存储过程stu_en。
(3)掌握通过SQL Server管理平台和Transact-SQL语句Alter procedure修改存储过程的方法;
(4)掌握通过SQL Server管理平台和Transact-SQL语句Drop procedure删除存储过程的方法;
(5)掌握通过SQL Server管理平台和Transact-SQL语句Create trigger创建触发器的方法和步骤;

实训4:存储过程和触发器

实训4:存储过程和触发器

实训4:存储过程和触发器一、实训目的1、了解存储过程、触发器的概念。

2、会运用T-SQL语句创建存储过程、触发器。

2、掌握如何调用存储过程。

二、实训工具及设备1、实训软件:SQL Server。

2、实训设备:安装Windows系统计算机一台。

三、实训预备知识1、存储过程我们曾经学习过C语言的函数,使用函数时需要两步。

第一步:定义函数,它允许包含参数和返回值。

第二步:调用函数。

函数可以反复的调用,它方便了程序的模块化设计,大大提高了执行效率。

存储过程类似于C语言中的函数,它是存储在SQL SERVER服务器中的一组预编译过的SQL语句,当第一次调用以后,就驻留在内存中,以后调用时不必再进行编译,因此它的运行速度比独立运行同样的程序要快。

在SQL SERVER中存储过程分为两类:系统存储过程和用户自定义存储过程。

系统存储过程存储在master数据库中并以sp_为前缀(用户创建存储过程的时候不要以sp_为前缀),在任何数据库中都可以调用系统存储过程。

除了使用系统存储过程,用户还可以创建自己的存储过程。

当创建存储过程时,需要确定存储过程的三个组成部分:所有的输入参数及执行后的输出结果(返回值);∙返回给调用者的状态值,以指明调用是否成功。

使用T-SQL语句创建存储过程的语法格式如下:CREATE PROCEDUER 存储过程名[@参数1 参数的数据类型][=默认值] [OUTPUT],……[@参数n 参数的数据类型][=默认值] [OUTPUT]ASSQL语句其中:使用OUTPUT选项可将@参数的值返回给调用语句。

(1)创建不带参数的存储过程代码清单4-1:在选课系统(ElectiveSystem)数据库中创建每门选修课的平均分use ElectiveSystemgocreate procedure proc_courseAvgasselect courseName,avg(grade) as '平均成绩'from course,scwhere course.courseNo=sc.courseNogroup by course.courseNamego在查询分析器中调用存储过程proc_courseAvg,结果如下图4-1所示。

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

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

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

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

二、存储过程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.在学生成绩数据库中建立表,并相应的导入数据create database学生成绩use学生成绩create table student(学号char(6)not null,姓名char(8)not null,性别bit not null,出生日期smalldatetime,专业名char(10),所在系char(10),联系电话char(11)null)create table course(课程号char(3)not null,课程名char(20)not null,教师char(10),开课学期tinyint,学时tinyint,学分tinyint not null)create table sc(学号char(6)not null,课程号char(3)not null,成绩smallint)2.(1)全局变量(2)if语句①②(3)循环语句①declare@i int,@sum int,@count intset@i=1set@sum=0set@count=0while (@i<100)beginif(@i%3=0)beginset@sum=@sum+@iset@count=@count+1endset@i=@i+1endprint'总和为:'+convert(varchar(10),@sum)print'个数为:'+convert(varchar(10),@count)②declare@i1int,@s1intset@i1=1set@s1=0beg:if(@i1<=5)beginset@s1=@s1+@i1set@i1=@i1+1goto begendprint@s1(4)waitfor 语句①waitfor delay'00:00:05'select*from studentgo②waitfor time'10:20'exec update_all_stats(5)case语句①select学号,性别=case性别when'1'then'男'when'0'then'女'endfrom studentgo②select学号,成绩=casewhen成绩IS NULL then'未考'when成绩<60 then'不及格'when成绩>=60 and成绩<70 then'及格'when成绩>=70 and成绩<90then'良好'when成绩>=90 then'优秀'endfrom sc3.存储过程(1)create proc proc1asselect学号,课程号from scwhere成绩between 60 and 80goexec proc1(2)①create proc proc21(@学号char(10))asdelete成绩from scwhere学号=@学号go②create proc proc22(@学号char(6),@课程号char(3),@成绩smallint)asinsert into scvalues(@学号,@课程号,@成绩)go(3)create proc proc3(@学号char(6),@课程号char(3),@成绩smallint output)asselect@成绩=成绩from scwhere学号=@学号and课程号=@课程号godeclare@成绩smallintexec proc3'020101','101',@成绩output select'成绩'=@成绩(4)create proc proc_t1(@专业名称char(10))asselect专业名,student.学号,姓名,course.课程号,course.课程名,成绩,学分from student,sc,coursewhere专业名=@专业名称and student.学号=sc.学号and sc.课程号=course.课程号goexec proc_t1'信息管理'go(5)alter proc proc_t1(@专业名称char(10))asselect专业名,student.学号,姓名,course.课程号,course.课程名,成绩,学分from student,sc,coursewhere专业名=@专业名称and student.学号=sc.学号and sc.课程号=course.课程号and student.性别=1goexec proc_t1'信息管理'go(6)drop proc proc_t1(7)create proc proc7(@课程名char(10))asbeginselect课程名,sum(case when成绩between 0 and 59 then 1 else 0 end)as'0-60分', sum(case when成绩between 60 and 79 then 1 else 0 end)as'60-79分', sum(case when成绩between 80 and 89 then 1 else 0 end)as'80-89分', sum(case when成绩between 90 and 100 then 1 else 0 end)as'90-100分' from sc,coursewhere课程名=@课程名and sc.课程号=course.课程号group by课程名endgoexec proc7'英语'go4.(1)create trigger tri_sc_insert on scafter insertasbegindeclare@sno char(6)select@sno=inserted.学号from insertedif not exists(select学号from student where学号=@sno) delete scwhere sc.学号=@snoendgo(2)create trigger tri_sc_upd on scafter updateasif UPDATE(成绩)beginprint'修改失败!!'raiserror ('不能修改SC表的成绩',16,10)rollback transactionendgo③create trigger trigger_1on Coursefor updateasif update(课程号)begin update SCset课程号=(select课程号from inserted)from SC,deletedwhere SC.课程号=deleted.课程号end④create trigger trigger_2on Studentfor deleteasbegindelete SCfrom SC,deletedwhere SC.学号=deleted.学号endgo⑤create trigger trigger_3on Studentfor updateasprint'学生表被修改了!'go⑥alter trigger trigger_3on Studentfor updateasdeclare@kch char(6)select@kch=学号from deletedprint'学生表中学号为'+@kch+'的记录被修改了' go⑦drop trigger trigger_3三、思考题1.存储过程的类型有哪些?分别有什么特征?类型:系统存储过程、扩展存储过程、用户定义存储过程特征:(1)系统存储过程:由系统创建、管理和使用;主要存储在master数据库,以sp_ 为前缀;用户只能对其调用,不能修改或删除;通过系统存储过程能够得到系统信息或为数据库系统管理员管理SQL Server提供支持。

实验六触发器、存储过程编程实验

实验六触发器、存储过程编程实验

实验六触发器、存储过程编程实验一、实验目的学习存储过程和触发器的创建和使用方法。

二、实验环境硬件:PC机软件:SQL Server 2000三、实验原理1.触发器触发器是一种特殊的过程,它不带参数,不被用户和程序调用,只能由用户对数据库中的表的操作(插入、删除、修改)触发。

因此,可以利用触发器来维护表间的数据一致性。

触发器只能在表上建立,一张表最多可有3个触发器,即插入触发器、删除触发器、修改触发器,分别由插入、删除、修改操作触发。

触发器可以查询其它表,而且可以包含复杂的SQL语句。

它们主要用于强制复杂的业务规则及数据完整性。

⑴创建触发器创建触发器时需指定:●名称。

●在其上定义触发器的表。

●触发器将何时激发。

●激活触发器的数据修改语句。

有效选项为INSERT、UPDATE或DELETE。

多个数据修改语句可激活同一个触发器。

例如,触发器可由INSERT或UPDATE语句激活。

●执行触发操作的编程语句。

语法:CREATE TRIGGER 触发器名ON {表名| 视图名}{ FOR | AFTER | INSTEAD OF } { [DELETE] [,] [INSERT] [,] [UPDATE] }ASSQL语句块RETURN⑵使用inserted和deleted表触发器语句中使用了两种特殊的表:deleted表和inserted表。

Microsoft SQL Server2000 自动创建和管理这些表。

可以使用这两个临时的驻留内存的表测试某些数据修改的效果及设置触发器操作的条件;然而,不能直接对表中的数据进行更改。

inserted 和deleted 表主要用于触发器中:●扩展表间引用完整性。

●在以视图为基础的基表中插入或更新数据。

●检查错误并基于错误采取行动。

●找到数据修改前后表状态的差异,并基于此差异采取行动。

Deleted表用于存储DELETE和UPDATE语句所影响的行的复本。

在执行DELETE 或UPDATE语句时,行从触发器表中删除,并传输到deleted表中。

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

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

存储过程与触发器实验报告本实验旨在探究存储过程与触发器的概念、作用、使用范围和创建过程,并且通过编写相关的示例代码来展示它们的实际应用。

一、实验原理1. 存储过程存储过程是一组预定义好的 SQL 语句,可以重复使用并且可以直接被调用。

它类似于程序中的函数,可以接受参数、返回值、流程控制等。

2. 触发器触发器是与数据库表相关的事件响应机制,可以在数据库表上定义一些触发条件,当满足这些条件时就会触发执行一些操作,比如插入、更新或删除数据。

二、实验步骤1. 存储过程的创建与使用(1)创建一个用于统计某个用户的订单数量的存储过程。

```DELIMITER //CREATE PROCEDURE `getOrderCount`(IN p_userid INT, OUTp_count INT)BEGINSELECT COUNT(*) INTO p_count FROM orders WHERE user_id = p_userid;END//DELIMITER ;```(2)调用这个存储过程,并输出结果。

```CALL getOrderCount(123, @count);SELECT @count AS 'order_count';```2. 触发器的创建与使用(1)创建一个在用户表中插入新记录时自动生成一个账户记录的触发器。

```DELIMITER //CREATE TRIGGER `insert_user_account` AFTER INSERT ON `users` FOR EACH ROWBEGININSERT INTO accounts (user_id, balance) VALUES (NEW.id, 0);END//DELIMITER ;```(2)在用户表中插入一条新记录,触发器会自动执行并在账户表中生成一条新记录。

```INSERT INTO users (name, email) VALUES ('Alice','***************');SELECT * FROM accounts WHERE user_id =LAST_INSERT_ID();```三、实验结论通过实验我们发现,存储过程可以将一些常用的 SQL 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。

实验八存储过程与触发器的应用实验报告

实验八存储过程与触发器的应用实验报告

实验八:存储过程与触发器的应用实验报告实验任务:1、存储过程的创建、执行和删除。

(1)使用学生选课数据库中的student 表、course 表;sc 表创建一个带参数的存储过程—cjjicx 。

该存储过程的作用是:该存储过程的作用是:当任意输入一个学生的姓名时,当任意输入一个学生的姓名时,当任意输入一个学生的姓名时,将从三个表中返回该学生的学号、将从三个表中返回该学生的学号、将从三个表中返回该学生的学号、选选修的课程名称和课程成绩。

Cjjicx 的创建语句:create procedure [dbo].[cjjicx]@sname nchar (1010) ) asselect s .sno ,c .cname ,sc .gradefrom student as s inner join sc as sc on s .sno =sc .sno inner join course as c on c .cno =sc .cno wheresname =@sname(2)执行cjjicx 存储过程,查询“XXX XXX””(自己选个名字)的学号、选修课程和课程成绩。

执行语句:execute cjjicx '李勇'结果描述:(3)使用系统存储过程sp_helptext查看存储过程cjjicx的文本信息。

使用系统存储过程sp_depends查看存储过程cjjicx中所涉及的对象信息。

中所涉及的对象信息。

执行语句:执行语句:(i)EXEC sp_helptext cjjicx(ii)EXEC sp_depends cjjicx查看结果描述:查看结果描述:(i)(ii)(4)使用学生选课数据库中的student表,为其创建一个存储过程—jmxs。

该存储过程的作用是:当执行该存储过程时,将返回计算机系学生的所有信息。

是:当执行该存储过程时,将返回计算机系学生的所有信息。

Jmxs创建语句:创建语句:CREATE PROCEDURE jmxsASSELECTStudent.Sno,Student.Sname,Student.Ssex,Student.Sage,Student.Sdept FROM StudentWHERE Sdept='CS'GO结果描述:存储过程jmxs已成功建立:右侧“系统存储过程”下拉列表中显示(5)执行jmxs存储过程,查看计算机系学生的情况。

数据库触发器与存储过程的开发实践

数据库触发器与存储过程的开发实践

数据库触发器与存储过程的开发实践在数据库开发的过程中,触发器(Trigger)与存储过程(Stored Procedure)起着至关重要的作用。

它们是数据库中存储的一段预定义的代码逻辑,可以在特定的数据库操作触发时执行相应的任务。

本文将介绍数据库触发器和存储过程的开发实践,包括定义及创建触发器和存储过程、数据库操作触发时的执行流程、使用场景等内容。

1.触发器的定义与创建触发器是与表相关联的一段代码,当满足特定的操作条件时,数据库就会自动执行相应的触发器代码。

触发器通常定义在表的插入(INSERT)、更新(UPDATE)或删除(DELETE)操作上。

创建触发器的语法一般如下:```sqlCREATE TRIGGER trigger_name{BEFORE|AFTER}{INSERT|UPDATE|DELETE}ON table_nameFOR EACH ROWBEGINtrigger_bodyEND;```其中:- `trigger_name`为触发器的名称;- `BEFORE|AFTER`用于指定触发器的执行时机,BEFORE表示在触发操作发生之前执行,AFTER表示在触发操作发生之后执行;- `INSERT|UPDATE|DELETE`用于指定触发器与哪种数据库操作相关联;- `table_name`为触发器所属的表名;- `FOR EACH ROW`表示触发器将对每一行进行操作;- `trigger_body`是触发器的主体代码,即在特定操作发生时执行的逻辑。

2.存储过程的定义与创建存储过程是一段预定义的可由数据库调用执行的代码集合。

与触发器不同,存储过程不会自动触发执行,而需要显式地由数据库开发人员调用。

创建存储过程的语法一般如下:```sqlCREATE PROCEDURE procedure_name(argument1 datatype, argument2 datatype,...)BEGINprocedure_bodyEND;```其中:- `procedure_name`为存储过程的名称;- `argument1, argument2,...`为存储过程的参数,可选;- `procedure_body`为存储过程的主体代码,即存储过程执行的逻辑。

实验6 数据库实验——存储过程和触发器

实验6 数据库实验——存储过程和触发器

实验6 存储过程和触发器一、实验目的1、加深和巩固对存储过程和触发器概念的理解。

2、掌握触发器的简单应用。

3、掌握存储过程的简单应用。

二、实验内容一)存储过程:1. 创建一存储过程,求l+2+3+…+n,并打印结果。

CREATE PROCEDURE addresultASDECLARE @n int=10,/*最后一个数*/@i int=0,@result int=0 /*结果*/BEGINWHILE(@i<=@n)BEGINSET @result=@result+@iSET @i=@i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT @resultRETURN(@result)ENDGO2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。

EXEC addresult3. 修改上述存储过程为addresult1,使得@n为输入参数,其具体值由用户调用此存储过程时指定。

CREATE PROCEDURE addresult1@n int=10 /*最后一个数*/ASDECLARE @i int=0,@result int=0 /*结果*/BEGINWHILE(@i<=@n)BEGINSET @result=@result+@iSET @i=@i+1ENDPRINT'1+2+3+...+n的结果是:'PRINT @resultRETURN(@result)ENDGO4. 调用上面修改后的addresult1存储过程,打印l+2+3+ (100)结果。

EXEC addresult1 1005.修改上述存储过程为addresult2,将@n参数设定默认值为10,并改设@sum为输出参数,让主程序能够接收计算结果。

CREATE PROCEDURE addresult2@n int=10,/*最后一个数*/@sum int out/*结果*/ASDECLARE @i int=0BEGINset @sum=0WHILE(@i<=@n)BEGINSET @sum=@sum+@iSET @i=@i+1ENDENDGO6.调用上面修改后的addresult2存储过程,设置变量@s接收计算l+2+3+…+10的结果。

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

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

存储过程与触发器实验报告存储过程与触发器实验报告概述:本实验旨在探究数据库中存储过程与触发器的概念、作用以及使用方法。

通过编写实例代码并进行实验,深入理解存储过程与触发器在数据库管理系统中的重要性和应用场景。

一、存储过程存储过程是一组预定义的SQL语句集合,可以被多次调用。

存储过程通常用于执行一系列复杂的数据库操作,如数据的插入、更新、删除等。

它们可以被视为一种封装了业务逻辑的数据库对象,提供了更高效、更安全的数据处理方式。

在实验中,我首先创建了一个名为"AddEmployee"的存储过程,用于向员工表中插入新的员工信息。

该存储过程接受参数,包括员工姓名、性别、年龄等。

在存储过程中,我使用了INSERT INTO语句将参数值插入到员工表中。

通过调用该存储过程,可以方便地插入新员工的信息,减少了编写重复SQL语句的工作量。

二、触发器触发器是与数据库表相关联的特殊类型的存储过程,当表中的数据发生变化时,触发器会自动执行相应的操作。

触发器可以在数据的插入、更新、删除等操作前后触发,用于实现数据的自动验证、补充以及其他业务逻辑的处理。

在本次实验中,我创建了一个名为"UpdateStock"的触发器,用于在产品表中更新库存信息时自动更新库存变动记录表。

当产品表中的库存字段发生变化时,触发器会自动将相关信息插入到库存变动记录表中。

这样,无论是手动更新库存还是通过其他方式更新库存,库存变动记录都能够及时准确地被记录下来,方便后续的数据分析和追溯。

三、实验结果与总结通过本次实验,我深入学习了存储过程与触发器的概念、作用和使用方法。

通过编写实例代码并进行实验验证,我进一步认识到存储过程与触发器在数据库管理系统中的重要性和应用场景。

存储过程的使用可以提高数据库操作的效率和安全性,尤其适用于需要执行复杂业务逻辑的场景。

通过将一系列SQL语句封装成存储过程,可以减少网络传输的开销,提高数据库操作的性能。

第十章_存储过程触发器及自定义函数

第十章_存储过程触发器及自定义函数

数据库实用技术
存储过程
第十章 存储过程、触发器、自定义函数
使用SSMS创建与管理存储过程
利用对象资源管理器修改存储过程:

⑴ 在对象资源管理器窗口中,找到需要修改的存储过程节点, 在其上右击选择“修改”命令,打开“查询编辑器”,其中出 现要修改的存储过程代码。


⑵ 对现有的存储过程迚行修改。
SQL Server 2008
数据库实用技术
存储过程
第十章 存储过程、触发器、自定义函数
使用SSMS创建与管理存储过程
使用存储过程模板创建存储过程:

⑶ 单击工具栏上的“执行”按钮,即可创建该存储过程。 此时,刷新对象资源管理器,重新展开“存储过程”节点,可 以看到刚建立的存储过程。
SQL Server 2008
SQL Server 2008
数据库实用技术
存储过程
第十章 存储过程、触发器、自定义函数
使用SSMS创建与管理存储过程
使用存储过程模板创建存储过程:

⑵ 修改存储过程的编程模板,插入需要的T-SQL代码。
• ① 存储过程编程模板。 • 说明: − 参数按以下格式包括在尖括号(< >)中: <parameter_name, data_type, default_value>。其中尖括 号内是参数的三个元素:参数的名称、该参数的数据类型以及 该参数的默讣值。 − parameter_name:列出存储过程或凼数中的参数。此字段是 叧读的。 − data_type:模板中参数的数据类型。此字段是叧读的。若要 更改数据类型,请更改模板中的参数。 − default_value:为所选参数指定值。默讣值。

存储过程、触发器和用户自定义函数(存储过程)实验

存储过程、触发器和用户自定义函数(存储过程)实验

存储过程、触发器和用户自定义函数实验实验内容一练习教材中存储过程、触发器和用户自定义函数的例子。

教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。

实验内容二针对附件1中的教学活动数据库,完成下面的实验内容。

1、存储过程(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。

CREATE Proc MATH_NUM @MATH CHAR(20)='高等数学'ASSELECT @MATH as canme,count(case when score>=90 then 1 end)as[90以上],count(case when score>=80 and score<90 then 1 end)as[80-90],count(case when score>=70 and score<80 then 1 end)as[70-80],count(case when score>=60 and score<70 then 1 end)as[60-70],count(case when score<60 then 1 end)as[60以下] FROM study,course WHERE o=o and ame=@MATHGROUP BY ame(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。

CREATE Proc AVG_SCORE @cno CHAR(20)ASSELECT @cno as 课程号,ame as 课程名,STR(AVG(score),5,2) as 平均成绩FROM study,courseWHERE o=o and o=@cno GROUP BY ame(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。

计算机软件及应用数据库函数存储过程触发器数据库安全的实验

计算机软件及应用数据库函数存储过程触发器数据库安全的实验

实验十函数一、实验目的与要求⏹理解什么是标量函数、内嵌表值函数及多语句表值函数。

⏹熟练掌握标量函数、内嵌表值函数、多语句表值函数的定义和调用。

⏹基表如下所示:⏹二、实验内容和步骤1、函数的定义对于CPXS数据库,定义完成如下功能的函数:(1)据产品名称,查询该产品的相关信息;(函数名为FU_CP)use cpxs1gocreate function FU_CP(@productname char(30))returns tableasreturn(select * from CPXSB right join XSS on CPXSB.客户编号=XSS.客户编号right join CP on CPXSB.产品编号=CP.产品编号where 产品名称=@productname)Gouse cpxs1goselect * from FU_CP('彩色电视机')go(2)按某年某季度统计给定产品名称的销售数量及销售金额;分别用名为FU1_CPXS内嵌表值函数和名为FU2_CPXS的多语句表值函数。

use cpxs1gocreate function FU12_CPXS(@year int ,@quarter int, @cpmc char(10))returns tableasreturn(select 产品名称, sum(数量) as 销售数量, sum(销售额) as 销售总额from cpxsb,cpwhere cpxsb.产品编号=cp.产品编号and 产品名称=@cpmcand datepart(year ,销售日期)=@yearand datepart(quarter,销售日期)=@quarter)Gouse cpxs1gocreate function FU2_SPXS(@year int ,@quarter int ,@cpmc char(10)) returns @xsqk table(产品名称char (10),销售数量int ,销售金额int)asbegin insert into @xsqkselect 产品名称,sum(销售额)as 销售总额,sum(数量)as 销售数量from cpxsb,cpwhere cpxsb.产品编号=cp.产品编号and 产品名称=@cpmcand datepart (year ,销售日期)=@yearand datepart (quarter, 销售日期)=@quartergroup by 产品名称returnendgo(3)根据销售商名称,统计其在某年某季度内销售商品名称、数量及金额。

数据库原理 实验四 存储过程与触发器、函数

数据库原理 实验四 存储过程与触发器、函数

《数据库原理》实验报告题目:实验四 存储过程与触发器、函数 学号: 成 绩班级: 计算12 日期:2014.05 姓名: 指导老师:林颖贤一、实验目的:1、掌握创建存储过程的方法和步骤;2、掌握创建触发器的方法和步骤;3、掌握用户自定义函数的类型及使用方法。

二、实验使用环境:Windows 7 x64、SQL Server 2005三、实验内容与完成情况:1、增加一张库存表Inventoy,包括:商品编号、价格、库存数量、入库时间(默认值为系统时间)。

create table Inventory (Goo_no char (8) not null, Inv_num int null, Inv_date datetime not null, primary key (Goo_no ,Inv_date ));ALTER TABLE Inventory ADD CONSTRAINT Inv_datedefault getdate () for Inv_date ;select * from Inventory2、从Purchase (进货表)和Sell(销售表)中备份空记录表: PurchaseBak 和Sell1Bak 。

if (not exists(select name from sysobjects where name ='PurchaseBak')) ( select * into PurchaseBak from Purchase where (1=0))if (not exists(select name from sysobjects where name ='SellBak')) ( select * into SellBak from Sellwhere (1=0))3、创建一个触发器。

向进货表中插入一条记录时,这个触发器都将更新库存表。

如果库存有该类商品时,那么该商品的进价即为两次进价的平均值(因为每次的进价可能会不相同),库存量为原有库存加该次进货数量;(算法为:(库存商品进价*库存量+进货价*进货量)/(库存量+进货量);如果没有该商品,则插入到库存表中。

实验六存储过程和触发器

实验六存储过程和触发器

实验六存储过程与触发器一、目的与要求1.掌握编写数据库存储过程的方法。

2.掌握建立数据库触发器的方法,通过实验观察触发器的作用与触发条件设置等相关操作。

二、实验准备1.了解编写存储过程与调用的T-SQL语法;2.了解触发器的作用;3.了解编写触发器的T-SQL语法。

三、实验内容(一)存储过程在studentdb数据库中建立存储过程getPractice,查询指定院系(名称)(作为存储过程的输入参数)中参与“实践”课程学习的所有学生学号、姓名、所学课程编号与课程名称,若院系不存在,返回提示信息。

提示:D_Info表中存储了院系代码D_ID,而St_Info表中学号字段St_ID的前两位与之对应,则D_Info表与St_Info表之间的联系通过这两个字段的运算构成连接条件。

1.分别执行存储过程getPractice,查询“法学院”与“材料科学与工程学院”的学生中参与“实践”课程的所有学生学号、姓名、所学课程编号与课程名称。

create procedure getPractice@D_Name varchar(30)outputasbeginif not exists(select *from D_Infowhere D_Name= @D_Name)print '对不起,该院系不存在'elseselect st_info、St_ID,C_Info、C_No,C_Namefrom s_c_info inner join st_info on st_info、St_ID=s_c_info、st_idinner join C_Info on s_c_info、c_no=C_Info、C_Nowhere st_info、St_ID in( select St_IDfrom st_info join D_Info on D_Info、D_ID =left(st_info、St_ID,2)where C_Info、C_Type='实践' and D_Info、D_Name= @D_Name)endgo2.利用系统存储过程sp_rename将getPractice更名为getPctStuexecute sp_rename getPractice , getPctStu3.修改存储过程getPctStu,返回指定院系中参与实践课程的学生人次数,并利用该存储过程以“法学院”为输入参数验证执行的结果alter procedure getPctStu@D_Name varchar(30)asbeginif not exists(select *from D_Infowhere D_Name= @D_Name)print '对不起,该院系不存在'elseselect st_info、St_ID,C_Info、C_No,C_Name,count (st_info、St_ID) as 人次数from s_c_info inner join st_info on st_info、St_ID=s_c_info、st_idinner join C_Info on s_c_info、c_no=C_Info、C_Nowhere st_info、St_ID in( select St_IDfrom st_info join D_Info on D_Info、D_ID =left(st_info、St_ID,2)where C_Info、C_Type='实践' and D_Info、D_Name= @D_Name)group by st_info、St_ID,C_Info、C_No,C_NameendGoexec getPctStu '法学院'Go4.再修改存储过程getPctStu,返回指定院系中参与实践课程的学生人数。

存储过程与用户自定义函数(精)

存储过程与用户自定义函数(精)

实验报告课程名称:数据库系统概论实验时间:2012.5.10学号:姓名:班级:一、实验题目:存储过程与用户自定义函数二、实验目的:1)掌握SQLServer中存储过程的使用方法。

2)掌握SQLServer中用户自定义函数的使用方法。

三、实验内容:(记录每个实验步骤内容、命令、截屏结果)(一存储过程1、对学生课程数据库,编写2个存储过程,分别完成下面功能:1)统计某一门课的成绩分布情况,即按照各分数段统计人数,要求使用游标。

create proc TotalByCnoNum(@cno varchar(6asbegindeclare @num1 int,@num2 int, @num3 int,@num4 int,@num5 int,@grade int,@cname char(20select @num1=0,@num2=0,@num3=0,@num4=0,@num5=0declare cur_cno cursor for select grade from sc where cno=@cnoopen cur_cnofetch next from cur_cno into @gradewhile@@fetch_status=0beginif @grade between 90 and 100set @num1=@num1+1else if @grade between 80 and 89set @num2=@num2+1else if @grade between 70 and 79set @num3=@num3+1else if @grade between 60 and 69set @num4=@num4+1elseset @num5=@num5+1fetch next from cur_cno into @gradeendclose cur_cnodeallocate cur_cnoselect @cname=cname from course where cno=@cno print'课程:'+@cnameprint'分数段人数统计'print'=========================='print' 90-100 : '+convert(varchar(3,@num1print' 80-89 : '+convert(varchar(3,@num2print' 70-79 : '+convert(varchar(3,@num3print' 60-69 : '+convert(varchar(3,@num4print' 不及格: '+convert(varchar(3,@num5print'=========================='end执行以下语句,显示课程号为3的成绩情况:exec TotalByCnoNum '3'运行结果如下:2)将学生选课成绩从百分制改为等级制(即A、B、C、D、E五级)。

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

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

数据库技术与应用实验报告七班级:机械因材学号: 16 姓名:高永吉一:实验名称:存储过程及触发器二,实验目的:⑴ 使用系统常用的存储过程;⑵ 掌握存储过程的创建及应用(3) 理解触发器的概念;(4) 掌握触发器的创建及应用。

三.实验内容、过程和结果:存储过程1创建一个存储过程,查看学号为1(根据实际情况取)的学生的信息,包括该学生的学号,班级编号,姓名。

(提示:查询涉及到表Student)2执行1中创建的存储过程。

3使用输入参数创建题1中的存储过程。

题1中所创建的存储过程只能学号为1的学生信息进行查看,要想对其他学生进行查看,需要进行参数传递。

4执行3中创建的存储过程,(1)按位置传递参数;(2)通过参数名传递参数;5触发器1)在课程表Course上创建一个触发器,该触发器被操作DELETE所触发,且要求触发触发器的DELETE语句在执行被取消。

2)在表Student中建立插入触发器, 插入一条记录时,若年龄>100或者年龄<=0,拒绝插入记录并显示:“年龄不符合规定,无法插入此记录!”;3)创建一个触发器,如果在Student表中添加或更改数据,向客户端显示一条消息“你正在插入或修改学生表的数据”,要求触发触发器的DELETE、UPDATE语句被执行。

4 )为Course表创建一个名称为my_trig的触发器,当用户成功删除该表中的一条或多条记录时,触发器自动删除Student表中与之有关的记录。

5 )使用系统存储过程查看创建的触发器。

图一:创建一个存储过程,查看Tno为1(根据实际情况取)的教师的信息,包括该教师的姓名,sal图二执行1中创建的存储过程。

图三使用输入参数创建题1中的存储过程。

图四执行3中创建的存储过程,(按位置传递参数)图五执行3中创建的存储过程通过参数名传递参数;图六使用系统存储过程查看3中创建的存储过程图七删除3中创建的存储过程。

图八在Teacher上创建一个触发器,该触发器被操作DELETE所触发,且要求触发触发器的DELETE语句在执行被取消。

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

存储过程和触发器和用户自定义函数实验
实验内容一
练习教材中存储过程、触发器和用户自定义函数的例子。

教材中的BookSales数据库,在群共享中,文件名为BookSales.bak。

实验内容二
针对附件1中的教学活动数据库,完成下面的实验内容。

1、存储过程
(1)创建一个存储过程,该存储过程统计“高等数学”的成绩分布情况,即按照各分数段统计人数。

CREATE Proc MATH_NUM@MATH CHAR(20)='高等数学'
AS
SELECT@MATH as canme,count(case when score>=90 then 1 end)as[90以上], count(case when score>=80 and score<90 then 1
end)as[80-90],
count(case when score>=70 and score<80 then 1
end)as[70-80],
count(case when score>=60 and score<70 then 1
end)as[60-70],
count(case when score<60 then 1 end)as[60以下]
FROM study,course
WHERE o=o and ame=@MATH
GROUP BY ame
运行结果:
(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。

CREATE Proc AVG_SCORE@cno CHAR(5)
AS
SELECT@cno as课程号,ame as课程名,STR(AVG(score),5,2)as平均成绩
FROM study,course
WHERE o=o and o=@cno
GROUP BY ame
运行结果:
(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。

CREATE Proc SCORE_CHANGE
AS
SELECT ame as课程名,study.sno as学号,o as课程
号,study.score as成绩,
case
when score>=90 and score<=100 then'A'
when score>=80 and score<90 then'B'
when score>=70 and score<80 then'C'
when score>=60 and score<70 then'D'
when score<60 then'E'
end as'等级'
from study,course
where o=o
运行结果:
(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。

CREATE Proc STUDENT_STUDY@name char(8)
AS
select@name as姓名,study.sno as学号,count(cno)as选修门数
from study,student
where study.sno=student.sno and sname=@name
group by study.sno
运行结果:
(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。

CREATE Proc STU_COR_SCORE@sno char(5),@cno char(4),@word smallint output AS
select@word=score
from study
where sno=@sno and cno=@cno
运行结果:
2、触发器
(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。

CREATE TRIGGER UPDATE_SCORE ON study
instead of update
as
declare@sno2char(5),@cno2char(4),@score1smallint,@score2smallint select@sno2=sno,@cno2=cno,@score2=score
from inserted
select@score1=score
from deleted
if(@score2>=@score1)
update study set score=@score2
where o=@cno2and study.sno=@sno2
go
运行结果:
按要求sno=98604 cno=C604 score=85 改成89 不能改成85了
(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。

CREATE TRIGGER DEL_STUDY ON study
instead of DELETE
AS
begin
declare@num int,@sno char(5),@cno char(4)
select@num=COUNT(*)from deleted
if@num=1
begin
select@sno=sno,@cno=cno from deleted
delete from study where@sno=study.sno and@cno=o
end
else print'一次不能删除多条记录'
end
运行结果:
(3)为course表创建一个INSERT触发器,要求插入的课程记录中任课教师不能为空。

CREATE TRIGGER INSERT_COR ON course
instead of insert
AS
declare@cno char(4),@cname char(20),@teacher char(8)
select@cno=cno,@cname=cname,@teacher=teacher from inserted
if(@teacher is null)
print'注意:任课教师不能为空!'
else
insert course values(@cno,@cname,@teacher)
运行结果:
3、用户自定义函数
(1)创建一个返回标量值的用户定义函数 RectangleArea:输入矩形的长和宽就能计算矩形的面积。

CREATE function RectangleArea(@a int,@b int)returns int
AS
begin
return@a*@b
end
运行结果:
(2)创建一个用户自定义函数,功能为产生一张有关学生成绩统计的报表。

该报表显示每一门课程的课程号、课程名、选修人数、本门最高分、最低分和平均分。

调用这个函数,生成相应的报表并给用户浏览。

CREATE function STUDENT_TABLE()returns table
AS
return(
select student_o课程号,ame课程
名,COUNT(student_course.sno)选修人数,
max(student_course.score)最高分,min(student_course.score)最低
分,AVG(student_course.score)平均分
from student_course,course
where student_o=o
group by student_o,ame
)
运行结果:
实验数据库说明
教学活动数据库包括student、course和study三个基本表,三个基本表的结构说明和数据如下:
(1)学生表(student)
说明:sno为主键,age的范围为15~35之间,sex只能为“男”或“女”。

学生表的记录
(2)课程表(course)
课程表的结构
说明:cno为主键。

课程表的记录
(3)选课表(study)
说明:sno和cno为主键,sno为外键(参照student表的sno),cno为外键(参照course表的cno),score的范围为0~100之间。

选课表的记录。

相关文档
最新文档