当前位置:文档之家› 数据库原理与应用(存储过程与触发器的应用)

数据库原理与应用(存储过程与触发器的应用)

数据库原理与应用(存储过程与触发器的应用)
数据库原理与应用(存储过程与触发器的应用)

《数据库原理与应用》实验报告

题目:实验七:存储过程与触发器的应用

学号:1148028

姓名:沈宇杰

日期:2013/5/30

实验预习情况:

一:实验目的:

①:掌握创建存储过程的方法和步骤

②:掌握存储过程的使用方法

③:掌握创建触发器的方法和步骤

④:掌握触发器的使用方法

二:实验内容:

①:存储过程的创建、执行和删除

②:触发器的创建、执行和删除

三:实验示例:

一:创建触发器:

对于STUDENT数据库,表STUDENT的CLASS_ID列与表CLASS的CLASS_ID满足下列参照完整性规则:

7.1创建触发器

A.向STUDENT插入或修改一记录时,该字段在STUDENT表中的对应值也做相应的修改

B.修改CLASS表的CLASS_ID字段值时,该字段在STUDENT表中对应值也做相应的修改

C.删除CLASS表中一记录的同时删除该记录CLASS_ID字段值在STUDENT表中对应的记录在查询分析器编辑窗口输入下列触发器的代码并执行。

①:向STUDENT表中插入或修改一记录时,通过触发器检查记录的CLASS_ID值在CLASS表中是否存在,若不存在,则取消插入或删除操

CREATE TRIGGER STUDENTINS ON DBO.STUDENT

FOR INSERT,UPDATE

AS BEGIN

IF(SELECT INS.CLASS_ID FROM inserted INS)NOT IN

(SELECT CLASS_ID FROM CLASS)

ROLLBACK

END

GO

AFTER指定DML触发器仅在触发SQL语句中指定的所有操作都已成功执行时才被触发。所有的引用级联操作和约束检查也必须在激发此触发器之前成功完成。

如果仅指定FOR关键字,则AFTER为默认值。

不能对视图定义AFTER触发器。

注意:书上的P162页的语法和SQL SERVER2008中的语法可能不大一样,SQL SERVER2008中并没有BEFORE、FOR EACH ROW等关键字。且语法变动较大。

②:修改CLASS表的CLASS_ID字段时候,该字段在STUDENT表中的对应值也做相应修改CREATE TRIGGER CLASSUPDATE ON DBO.CLASS

FOR UPDATE

AS BEGIN

IF(COLUMNS_UPDATED()&01)>0

UPDATE Student

SET CLASS_ID=(SELECT INS.CLASS_ID FROM INSERTED INS)

WHERE CLASS_ID=(SELECT CLASS_ID FROM DELETED)

END

GO

释:COLUMNS_UPDATED():返回一串二进制数,譬如:若要检查第2,3,4行是否被修改,则计算:

2^(2-1)+2^(3-1)+2^(4-1)=14,然后COLUMNS_UPDATED()&14即可。

此例题中&01则代表了查看CLASS表中的第一行有无被修改。

SET CLASS_ID=(SELECT INS.CLASS_ID FROM INSERTED INS)

WHERE CLASS_ID=(SELECT CLASS_ID FROM DELETED)

此语句的意思是:若是CLASS中的CLASS_ID被修改了(删除旧值插入新值,故只要被删除过则认为数据被更新),则相应地修改STUDENT表中CLASS_ID的值。

③:删除CLASS表中一记录的同时删除该记录CLASS_ID字段值在CLASS表中对应的记录CREATE TRIGGER CLASSDELETE ON DBO.CLASS

FOR DELETE

AS BEGIN

DELETE FROM Student

WHERE CLASS_ID=(SELECT CLASS_ID FROM DELETED)

END

GO

我觉得是“删除CLASS表中一记录的同时删除该记录CLASS_ID字段值在STUDENT表中对应的记录,实验册上写错了吧。

7.2创建存储过程

①:添加学生记录的存储过程STUDENTAdd

CREATE PROCEDURE STUDENTAdd

(

@Sno CHAR(9),@Sname CHAR(8),@Ssex CHAR(2),

@Sage SMALLINT,@Sdept CHAR(2),@CLASS_ID NCHAR(10)

)

AS BEGIN

INSERT INTO Student

VALUES(@Sno,@Sname,@Ssex,

@Sage,@Sdept,@CLASS_ID)

END

RETURN

GO

②:修改学生记录的存数过程STUDENTUpdate

CREATE PROCEDURE STUDENTUpdate

(

@SnoN CHAR(9),@Sno CHAR(9),@Sname CHAR(8),@Ssex CHAR(2),

@Sage SMALLINT,@Sdept CHAR(2),@CLASS_ID NCHAR(10

)

AS BEGIN

UPDATE Student

SET Sno=@Sno,Sname=@Sname,Ssex=@Ssex,Sage=@Sage,

Sdept=@Sdept,CLASS_ID=@CLASS_ID

WHERE Sno=@SnoN

END

RETURN

GO

③:删除学生记录的存储过程STUDENTDelete

CREATE PROCEDURE STUDENTDelete

(

@Sno CHAR(9)

)

AS BEGIN

DELETE FROM Student

WHERE Sno=@Sno

END

RETURN

GO

调用三个存储过程:

EXEC STUDENTAdd@Sno='024632344',@Sname='张芸',@Ssex='女',

@Sage=16,@Sdept='CS',@CLASS_ID='0246323'

GO

EXEC STUDENTUpdate@Sno='02462344',@SnoN='024632344',@Sname='张芸',@Ssex='女', @Sage=16,@Sdept='CS',@CLASS_ID='0246323'

GO

EXEC STUDENTDelete@Sno='02462344'

GO

实验内容与完成情况:

实验步骤:

1.存储过程的创建、执行和删除

①:使用S-C数据库中的Student、Course、SC表创建一个带参数的存储过程——cjjicx。该存储过程的作用是:当任意输入一个学生的姓名时,将从三个表中返回学生的学号、选修的课程名称和课程成绩。

CREATE PROCEDURE cjjicx

(@Sname char(6))

AS

BEGIN

SELECT A.Sno,https://www.doczj.com/doc/e59616436.html,ame,B.Grade

FROM Student A,SC B,Course C

WHERE A.Sname=@Sname AND A.Sno=B.Sno AND https://www.doczj.com/doc/e59616436.html,o=https://www.doczj.com/doc/e59616436.html,o

END

RETURN

GO

②:执行cjjicx存储过程,查询刘永辉的学号选修课程和课程成绩

EXEC cjjicx@Sname='李勇'

GO

结果描述:

200215121数据库92

200215121数学85

200215121信息系统88

③:使用系统存储过程sp_helptext查看存储过程cjjicx的文本信息

sp_helptext cjjicx

GO

查看文本信息:

CREATE PROCEDURE cjjicx

(@Sname char(6))

AS

BEGIN

SELECT A.Sno,https://www.doczj.com/doc/e59616436.html,ame,B.Grade

FROM Student A,SC B,Course C

WHERE A.Sname=@Sname AND A.Sno=B.Sno AND https://www.doczj.com/doc/e59616436.html,o=https://www.doczj.com/doc/e59616436.html,o

END

RETURN

④:使用SC数据库中的student表,为其创建一个加密的存储过程—jmxs。该存储过程的作用是:当执行该存储过程时,将返回IS系学生的所有信息。

CREATE PROCEDURE jmxs

with encryption

AS

BEGIN

SELECT*

FROM Student

WHERE Sdept='IS'

END

RETURN

GO

⑤:执行jmxs存储过程,查看IS系学生的情况

执行语句:EXEC jmxs

结果描述:

200215125张立男19IS

⑥:删除jmxs存储过程

删除语句:DROP PROCEDURE jmxs

2.触发器的创建、执行和删除

①:在S-C数据库中建立一个名为insert_xh的INSERT触发器,存储在sc表中。该触发器的作用是:当用户向sc表中插入记录时,如果插入了在student表中没有的学生学号sno,则提示用户不能插入记录,否则提示记录插入成功。

Insert-xh的创建语句:

CREATE TRIGGER insert_xh ON dbo.SC

FOR INSERT

AS

BEGIN

IF((SELECT ins.Sno FROM inserted INS)NOT IN

(SELECT Sno FROM Student))

ROLLBACK

END

GO

系统会自动告知是否插入成功,当然也可用PRINT语句输出

②:为S-C数据库中的student表创建一个名为dele_stu的DELETE触发器,该触发器的作用是禁止删除student表中的记录。

CREATE TRIGGER dele_stu ON dbo.Student

AFTER DELETE

AS BEGIN

ROLLBACK

PRINT'禁止删除'

END

GO

③:为s_c数据库中的sc表创建一个名为update_grade的UPDATE触发器,该触发器的作用是禁止

新sc表中的grade字段的内容。

CREATE TRIGGER update_grade ON DBO.SC

FOR UPDATE

AS BEGIN

IF((SELECT ins.Grade FROM updated INS)<>

(SELECT Grade FROM SC))

ROLLBACK

END

GO

④:禁用update_grade触发器。

DISABLE TRIGGER update_grade ON dbo.SC

GO

⑤:删除update_grade触发器

DROP TRIGGER update_grade

GO

出现的问题:(正式实验中遇到的问题)

1.COLUMNS_UPDATED()

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

1.COLUMNS_UPDATED():返回一串二进制数,譬如:若要检查第2,3,4行是否被修改,则计算:2^(2-1)+2^(3-1)+2^(4-1)=14,然后COLUMNS_UPDATED()&14即可。

存储过程与触发器实验

第一章存储过程与触发器实验 实验目的 1.理解存储过程的工作原理和作用。 2.掌握存储过程设置和程序设计过程。 3.理解触发器的工作原理和作用。 4.掌握触发器编写方法。 实验环境 采用IBM DB2或Sybase数据库管理系统作为实验平台。其中,DB2可以采用DB2 Express-C或DB2 V8 Enterprise。 实验完成人:李肇臻,谢锦 实验内容 一、存储过程实验 1.针对下面2个完整性约束条件,建立存储过程,实现当数据导入或更新时,可以自动修改拥塞率、半速率话务量比例 (1)拥塞率=拥塞数量/呼叫数量 (2)半速率话务量比例=半速率话务量/全速率话务量 在DB2CMD中运行,win7用管理员权限。 create procedure M() language SQL begin update CALLDATA set "callcongs"="congsnum"/"callnum" where "congsnum"<>0 and "callnum"<>0; update CALLDATA set "rate"="thtraff"/"traff" where "thtraff"<>0 and "traff"<>0; end @ 2.将存储过程添加到数据库服务器上

3.在客户端编写调用存储过程的主程序 4.运行客户端程序,调用存储过程,观察存储过程执行过程和数据更新情况;调用就用db2 CALL M() 二、触发器实验 1. 针对下列约束条件,分别建立1个触发器: 1)每个小区/扇区最多占用14个TCH频点,合法频点范围在[1,60]之间。当向小区中新加入频点时,如果小区中现有频点数目已达到14个,则用新加入的频点替换现有频点中的最小频点;当修改或新加入频点时,如果发现频点不在合法范围内,则输出提示信息,并拒绝该操作。 create trigger first_1 after insert on FREQUENCY

存储过程和触发器(数据库实验5)

数据库基础与实践实验报告实验五存储过程和触发器 班级:惠普测试142 学号:1408090213 姓名:闫伟明 日期:2016-11-14

1 实验目的: 1)掌握SQL进行存储过程创建和调用的方法; 2)掌握SQL进行触发器定义的方法,理解触发器的工作原理; 3)掌握触发器禁用和重新启用的方法。 2 实验平台: 操作系统:Windows xp。 实验环境:SQL Server 2000以上版本。 3 实验内容与步骤 利用实验一创建的sch_id数据库完成下列实验内容。 1.创建存储过程JSXX_PROC,调用该存储过程时可显示各任课教师姓名及其所教课程名称。 存储过程定义代码: CREATE PROCEDURE JSXX_PROC AS SELECT tn 教师姓名,cn 所教课程FROM T,TC,C WHERE T.tno=TC.tno AND https://www.doczj.com/doc/e59616436.html,o=https://www.doczj.com/doc/e59616436.html,o 存储过程执行语句与执行结果截图: EXECUTE JSXX_PROC 2.创建存储过程XM_PROC,该存储过程可根据输入参数(学生姓名)查询并显示该学生的学号、 所学课程名称和成绩;如果没有该姓名学生,则提示“无该姓名的同学”。 存储过程定义代码:

CREATE PROCEDURE XM_PROC @sname VARCHAR(100) AS BEGIN IF EXISTS(SELECT NULL FROM S WHERE sn=@sname) SELECT S.sno 学号,cn 课程,score 成绩FROM S,SC,C WHERE https://www.doczj.com/doc/e59616436.html,o=https://www.doczj.com/doc/e59616436.html,o AND SC.sno=S.sno AND S.sn=@sname ELSE PRINT'无该姓名的同学。' END 运行截图: 3.创建存储过程XBNL_PROC,该存储过程可根据输入参数(专业名词,默认值为计算机专业), 统计并显示该专业各年龄段男、女生人数。如果没有该专业,则显示“无此专业”。 存储过程定义代码: CREATE PROCEDURE XBNL_PROC @departName VARCHAR(30)='计算机', @begin INT, @end INT AS

数据库原理课程设计实验[创建存储过程与触发器]

存储过程与触发器实验日期和时间: 2016 年 5 月13 日、 星 期五第节 实验室:DJ2-信息管理实验室 班级:学号:姓名: 实验环境: 1.硬件:笔记本电脑 2.软件:SQL Server 2012 实验原理: 存储过程概念:存储过程是事先编好的,存储在数据库中的一组被编译了的T-SQL命令集合,这些命令用来完成对数据库的指定操作。存储过程可以接受用户的输入参数、向客户端返回表格或标量结果和消息、调用数据定义语言(DDL)和数据操作语言(DML)语句,然后返回输入参数。 触发器概念:触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。

假定有学校的图书馆管理信息系统,可以用于日常管理书库和同学们的借还书工作。以下列出参考的库表情况: 根据管理的业务需求来分析,该管理信息系统的数据库应至少包括如下数据表:(打★号的是必须有的表) 1.★图书现有库存表。作用:记录图书的现有库存情况。至少包括:书号、书名、 作者、简介、类别、价格、出版社、出版日期、现有库存数量、最小库存量、库 存总量、库存位置等。 2.★读者信息表。作用:记录读者信息。至少包括:读者编号、证件类型、证件号 码、姓名、性别、职业(可填写教师、学生、教工、其它……)、所属单位、地 址、联系电话等。 3.★借书记录表。作用:记录借书情况,以及是否归还。至少包括:借阅ID(主 键,可设置为自动编号)、书号、读者编号、借阅数量、借阅日期、是否归还、 管理员编号……等。 4.★还书记录表。作用:记录还书情况。至少包括:还书ID(主键,可设置为自动 编号)、书号、读者编号、归还数量、归还日期、是否超期(超过假设45天为 超期)、超期天数、管理员编号……等。(附:为简化操作,续借可视为归还后 再借)。 5.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管 理员级别等……。 6.职工档案表表。作用:记录职工档案。至少包括: 职工编号、姓名、性别、单 位、职称、职务、出生日期、学历、……其它字段自拟。

实验六 存储过程和触发器

实验六存储过程与触发器 一、目的与要求 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) output as begin if not exists (select * from D_Info where D_Name= @D_Name ) print '对不起,该院系不存在' else select st_info、St_ID,C_Info、C_No,C_Name from s_c_info inner join st_info on st_info、St_ID=s_c_info、st_id inner join C_Info on s_c_info、c_no=C_Info、C_No where st_info、St_ID in ( select St_ID from 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 ) end go

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

信息工程学院实验报告 课程名称:《数据库原理》 实验项目名称:存储过程与触发器 一、实验目的: (1)了解存储过程的概念 (2)掌握创建、执行存储过程的方法 (3)了解查看、修改和删除存储过程的方法 (4)了解触发器的概念 (5)掌握创建触发器的方法 (6)掌握查看、修改、删除触发器信息的方法 二、实验设备与器件 Win7 +Sql server 2008 三、实验内容与步骤 (一)存储过程 运行实验四附录中的SQL语句,准备实验数据。然后创建下列存储过程,并调试运行存储过程,查看运行结果。 1.在企业管理器中创建一个名为StuInfo的存储过程,完成的功能是在student表中查询系号为D2的学号、姓名、性别、年龄、系号的内容。 CREATE PROCEDURE StuInfo AS SELECT SNO AS学号, SNAME AS姓名, SSEX AS性别, SAGE AS年龄, DNO AS系号 FROM student WHERE DNO='D2' 结果: stuinfo 2.使用T_SQL语句创建存储过程,完成的功能是在表student,course和study中查询以下字段:学号、姓名、性别、课程名称、考试分数。

use mydb --查询是否已存在此存储过程,如果存在,就删除它 if exists(select name from sysobjects where name='StuScoreInfo'and type='P') drop procedure StuScoreInfo go --创建存储过程 CREATE PROCEDURE StuScoreInfo as select student.sno as学号, sname as姓名, ssex as性别, https://www.doczj.com/doc/e59616436.html,ame as课程名称, study.grade as考试分数 from student,course,study where student.sno=study.sno and https://www.doczj.com/doc/e59616436.html,o=https://www.doczj.com/doc/e59616436.html,o 结果: StuScoreInfo 3.使用T_SQL语句创建一个带有参数的存储过程stu_sno_info,该存储过程根据传入的学生编号,在student表中查询此学生的信息。 if exists(select name from sysobjects where name='stu_info'and type='P') drop procedure stu_info go --创建存储过程 create procedure stu_info @sno varchar(8) as select sno as学号, sname as姓名, ssex as性别, sage as年龄, dno as年级

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

实验6 存储过程与触发器 一、实验目的 1、加深与巩固对存储过程与触发器概念的理解。 2、掌握触发器的简单应用。 3、掌握存储过程的简单应用。 二、实验内容 一)存储过程: 1、创建一存储过程,求l+2+3+…+n,并打印结果。 CREATE PROCEDURE addresult AS DECLARE @n int=10,/*最后一个数*/ @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 2.调用上面的addresult存储过程,打印l十2+3+…+10的结果。EXEC addresult

3、修改上述存储过程为addresult1,使得@n为输入参数,其具体值由用户调用此存储过程时指定。 CREATE PROCEDURE addresult1 @n int=10 /*最后一个数*/ AS DECLARE @i int=0, @result int=0 /*结果*/ BEGIN WHILE(@i<=@n) BEGIN SET @result=@result+@i SET @i=@i+1 END PRINT'1+2+3+、、、+n的结果就是:' PRINT @result RETURN(@result) END GO 4、调用上面修改后的addresult1存储过程,打印l+2+3+…+100的结果。 EXEC addresult1 100 5.修改上述存储过程为addresult2,将@n参数设定默认值为10,并改设@sum为输出参数,让主程序能够接收计算结果。

实验五:触发器和存储过程

实验五:触发器和存储过程 一.实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二.实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state);--图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 三、操作与运行 1.创建图书数据库: create table bookstore (bookid int not null primary key, bookname char(20), bookauthor char(20),

purchasedate datetime, state char(4) ) create table borrowcard (cardid int not null primary key, ownername char(20) ) create table borrowlog (cardid int not null, bookid int not null, borrowdate datetime, returndate datetime, primary key(cardid,bookid), ---foreign key(cardid)references borrowcard(cardid), ---foreign key(bookid)references bookstore(bookid) ) 通过以上语句,可以看到数据库中的表建立成功。 2.创建存储过程: create proc book_borrow @mycardid_in int, @mybookid_in int, @str_out char(30) output

MySQL存储过程实例教程

MySQL存储过程实例教程 MySQL 5.0以后的版本开始支持存储过程,存储过程具有一致性、高效性、安全性和体系结构等特点,本节将通过具体的实例讲解PHP是如何操纵MySQL存储过程的。 实例261:存储过程的创建 这是一个创建存储过程的实例 录像位置:光盘mingrisoft9?lt;/p> 实例说明 为了保证数据的完整性、一致性,提高应用的性能,常采用存储过程技术。MySQL 5.0之前的版本并不支持存储过程,随着MySQL技术的日趋完善,存储过程将在以后的项目中得到广泛的应用。本实例将介绍在MySQL 5.0以后的版本中创建存储过程。 技术要点 一个存储过程包括名字、参数列表,以及可以包括很多SQL语句的SQL语句集。下面为一个存储过程的定义过程: create procedure proc_name (in parameter integer)begindeclare variable varchar(20);if parameter=1 thenset variable='MySQL';elseset variable='PHP';end if;insert into tb (name) values (variable);end; MySQL中存储过程的建立以关键字create procedure开始,后面紧跟存储过程的名称和参数。MySQL的存储过程名称不区分大小写,例如PROCE1()和proce1()代表同一个存储过程名。存储过程名不能与MySQL数据库中的内建函数重名。 存储过程的参数一般由3部分组成。第一部分可以是in、out或inout。in表示向存储过程中传入参数;out表示向外传出参数;inout表示定义的参数可传入存储过程,并可以被存储过程修改后传出存储过程,存储过程默认为传入参数,所以参数in可以省略。第二部分为参数名。第三部分为参数的类型,该类型为MySQL数据库中所有可用的字段类型,如果有多个参数,参数之间可以用逗号进行分割。 MySQL存储过程的语句块以begin开始,以end结束。语句体中可以包含变量的声明、控制语句、SQL查询语句等。由于存储过程内部语句要以分号结束,所以在定义存储过程前应将语句结束标志“;”更改为其他字符,并且该字符在存储过程中出现的几率也应该较低,可以用关键字delimiter更改。例如: mysql>delimiter // 存储过程创建之后,可用如下语句进行删除,参数proc_name指存储过程名。 drop procedure proc_name 实现过程

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

南昌航空大学实验报告 二00 年月日 课程名称:数据库概论实验名称:数据库存储过程与触发器 班级:122031 姓名:同组人: 指导教师评定:签名: 一、实验环境 1.Windows2000或以上版本; 2.SQLServer 2005。 二、实验目的 熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。 三、实验要求 完成实验指导书中p115-7和p132 -4。 四、实验步骤及参考源代码 1.创建与执行存储过程 create procedure C_P_Proc as select distinct https://www.doczj.com/doc/e59616436.html,o,cna,pna,num from paper,customer,cp where https://www.doczj.com/doc/e59616436.html,o=https://www.doczj.com/doc/e59616436.html,o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' go execute C_P_Proc 2.删除存储过程 drop procedure C_P_Proc 3.创建插入触发器 create trigger TR_PAPER_I ON PAKER12203125 FOR INSERT AS DECLARE @appr float DECLARE @apno int SELECT @appr=ppr,@apno=pno from inserted begin if @appr<0 or @appr is null begin

raiserror('报纸的单价为空或小于!',16,1) update paper set ppr=10 where paper.pno=@apno end end 4.创建删除触发器 create Trigger TR_PAPER_D on PAKER12203125 after delete as declare @ipno char(6) declare @icount int; select @icount= count(*) from deleted,cp where deleted.pno=cp.pno if @icount>=1 begin select @ipno=pno from deleted raiserror('级联删除cp表中的数据',16,1) delete from cp where cp.pno=@ipno end 5.创建修改触发器 create trigger TR_PAPER_U ON PAKER12203125 for update as declare @ippr float select @ippr=ppr from inserted if @ippr<0 or @ippr is null begin raiserror('输入单价不正确',16,1) rollback transaction end 6. 分别对PAKER12203125表进行插入、修改、删除操作 insert into PAKER12203125 (pno,pna,ppr)values('000006','江西日报','1') insert into PAKER12203125 (pno,pna,ppr)values('000007','江南都市报','15.5') delete from PAKER12203125 where pno='000001' update PAKER12203125 set ppr=12.5 where pno='000002' update PAKER12203125 set ppr=-2 where pno='000004' 五、实验结果

MySQL存储过程简单入门

MySQL存储过程语法 1、概念 存储过程就是能完成一定操作的一组SQL语句。 2、作用 大大提高效率(存储过程本身执行速度非常快,而且,调用存储过程大大减少数据库交互次数);提高重用性。 3、使用方法 1、创建: create procedure sp_name() begin …… end 注意:可能有参数。 2、调用: call sp_name() 注意:括号不能省略。 3、删除: drop procedure sp_name 注意:没有括号,不能在一个存储过程中删除另一个存储过程,只能调用。 4、语句: 条件语句, if 条件then statement else statement end if while循环语句, [label:] while expression do statement end while [label]; loop循环语句, [label:] loop statement end loop [label];

repeat until循环语句, [label] repeat statement until expression end repeat [label]; 5、常用命令: show procedure status:显示数据库所有存储过程基本信息。 show create procedure sp_name:显示一个存储过程详细信息。 关于运算符和基本函数与Java有些区别,用时注意就行。 4、实例 1、创建: create procedure proc_name (in parameter integer) begin declare variable varchar(20); if parameter=1 then set variable='MySQL'; else set variable='PHP'; end if; insert into tb (name) values (variable); end; 注意:代码不区分大小写;存储过程之间以及存储过程与内建函数不能同名; 存储过程参数(in传入,out传出,inout可传入,修改后传出,缺省是in); 由于存储过程内部要以分号结束,需要delimiter进行更改。 2、实现: ⑴、mysql –u用户名–p用户密码 ⑵、delimiter //(将结束符号“;”改成“//”,避免与存储过程冲突) ⑶、use 数据库名 ⑷、……(创建存储过程) ⑸、call proc_name(5)//(调用存储过程) -------------------------------------------- call proc_name(@para)//(对应存储过程定义中out的输出) select @para// ⑹、show procedure status//与show create procedure proc_name// 3、程序代码调用:(out型的部分代码) try{ //调取out型的存储过程P(计算记录总数) stmt = conn.prepareCall("{call p(?)}"); //读取所有OUT型的存储过程的返回参数数据 stmt.registerOutParameter(1, Types.INTEGER); stmt.execute(); int i= stmt.getInt(1);

第6章_存储过程与触发器练习题

有教师表(教师号,教师名,职称,基本工资),其中基本工资的取值与教师职称有关。实现这个约束的可行方案是( )。 A 在教师表上定义一个视图 B 在教师表上定义一个存储过程 C 在教师表上定义插入和修改操作的触发器 D 在教师表上定义一个标量函数 参考答案 C 在SQL SERVER中,执行带参数的过程,正确的方法为()。 A 过程名参数 B 过程名(参数) C 过程名=参数 D ABC均可 参考答案 A 在SQL SERVER服务器上,存储过程是一组预先定义并()的Transact-SQL语句。 A 保存 B 解释 C 编译 D 编写 参考答案 C 在SQL Server中,触发器不具有()类型。 A INSERT触发器 B UPDATE触发器 C DELETE触发器 D SELECT触发器 参考答案 D

()允许用户定义一组操作,这些操作通过对指定的表进行删除、插入和更新命令来执行或触发。 A 存储过程 B 规则 C 触发器 D 索引 参考答案 C 为了使用输出参数,需要在CREATE PROCEDURE语句中指定关键字( )。 A OPTION B OUTPUT C CHECK D DEFAULT 参考答案 B 下列( )语句用于创建触发器。 A CREATE PROCEDURE B CREATE TRIGGER C ALTER TRIGGER D DROP TRIGGER 参考答案 B 下列( )语句用于删除触发器。 A CREATE PROCEDURE B CREATE TRIGGER C ALTER TRIGGER D DROP TRIGGER 参考答案 D

MySQL存储过程练习

存储过程实验 一、实验要求: 1.理解存储过程的概念 2.掌握存储过程的语法格式、使用方法 3.掌握存储过程的创建、执行 二、实验内容: (注意:做一下实验需要首先建立数据及其相应的表,并输入一些记录) 1.实验1:创建一个存储过程,实现查询表student中的记录信息,并执行存储过 程 (1)创建存储过程: begin select * from student end (2)执行存储过程:运行 sp_liststudent (3)执行结果如下:

2.实验2.创建一个存储过程,根据给定的学生学号返回该学生的姓名(1)创建存储过程:

CREATE PROCEDURE test5( IN id int) BEGIN SELECT * from student s WHERE s.id=id; END (2)执行存储过程:CALL test5(2) 执行结果如下: 3.实验3. 创建一个存储过程,根据班级的编号,统计该班人数,并将人数以输出 变量返回给用户。 (1)创建存储过程: CREATE PROCEDURE test00( IN roomidint) BEGIN SELECT COUNT(*) from student s WHERE s.roomid=9; END (2)执行存储过程:CALL test00(2) (3)执行结果如下:

4.实验4:创建一个存储过程查询学号为“020101”的学生的平均分是否超过了85 分,若超过则输出“ X X考出了高分”,否则输出“XX 考的一般”。 (1)创建存储过程: CREATE PROCEDURE test05() BEGIN IF (SELECT score from student WHERE id=1)>85 THEN SELECT '考得好'; ELSE SELECT '考得不好'; END IF; END

实验八 存储过程和触发器_参考答案

实验八存储过程和触发器 一、目的与要求 1. 正确理解存储过程和触发器的概念、功能和类型; 2. 掌握使用SSMS和T-SQL语句创建和管理存储过程和触发器。 二、上机准备 利用教师提供的XSGL数据库,该库中有3个表:student,course,sc。 三、实验内容 1. 将教师提供的XSGL数据库附加到本地数据库中。 2. 分别使用SSMS和T-SQL语句创建和管理存储过程和触发器。 (1)创建一个存储过程proc_stud_sc_info,查询学号、姓名、性别、系、课程号和成绩等信息。 use xsgl go create procedure proc_stud_sc_info as select student.sno,sname,sex,dept,cno,grade from student left join sc on student.sno=sc.sno go (2)创建一个存储过程proc_stud_info,根据输入的学号,查询学生的基本信息。 use xsgl go create procedure proc_stud_info @sno char(5)='95001' as select * from student where sno=@sno go (3)创建一个存储过程proc_stud_birth_year,根据输入的学生姓名,计算该学生的出生年份。 use xsgl go create procedure proc_stud_birth_year @sname varchar(6)='张立' as select sname,year(getdate())-age as 出生年份 from student where sname=@sname go

创建存储过程与触发器

实验7 创建存储过程与触发器 实验日期和时间:2011-11-11 实验室:2#206 班级:09计本(4)学号:2009810182 姓名:周伟 实验环境: 1.硬件:1G内存 1.73GHz 2.软件:SQL server2008 实验原理: 创建存储过程,执行存储 通过建立触发器实现对数据库的更新。 实验任务: 此作业成绩得分根据你完成的任务的难度和数量评分,完成后在实验室给老师演示验收,课后提交电子版报告。如额外完成自拟题目应当事先将所拟题目提交给老师或在报告中明确标注题意。 假定有某个企业(或公司,或代理商)经销某类产品,需要用一个信息系统对销售业务和库存进行管理。 首先,他们得在数据库中存储所有经营过的产品的信息,并建立现有库存的信息表; 其次,对于每次销售或者进货,他们都得记录下来以便进行管理,将来对这些信息进行统计或财务管理;再次,在每笔销售记录中需要记录相关客户信息,在进货时需要记录相关供应商的信息,也为了与不同的供应商和客户进行联系,需要分别建立二者的信息表。综上所述,在以上建立的数据库中我们至少需要以下几个基本表: 1.产品表(记录公司曾经经营的所有产品信息) 2.现有库存表(记录公司目前经营的产品的现有库存信息) 3.出库单表(记录产品销售出库时的情况:时间、销售员、客户、商品编码、 商品数量等) 4.入库单表(记录公司每次产品进货入库时的信息) 5.供应商表(记录为公司供货的主要供应商信息) 6.客户表(记录公司的所有客户信息) 以下是供参考的表结构的部分信息,同学们可以根据题意自行修改表的结构 1.产品表(记录公司的产品信息) 字段名数据类型长度备注 产品编号文本主键 产品名称文本非空 类别文本 供应商编号文本外键(来自供应商表) 产地文本 最新参考单价货币

mysql存储过程.详细说明,java代码调用过程

Mysql存储过程调用 说明: 由括号包围的参数列必须总是存在。如果没有参数,也该使用一个空参数列()。每个参数默认都是一个IN参数。要指定为其它参数,可在参数名之前使用关键词OUT或INOUT 在mysql客户端定义存储过程的时候使用delimiter命令来把语句定界符从;变为//。 当使用delimiter命令时,你应该避免使用反斜杠(‘"’)字符,因为那是MySQL的转义字符。 1、创建过程格式: Mysql> drop procedure if exists user_findById; Mysql> delimiter // Create procedure user_findById(in n int) Begin Select * from user where id= n; End // 调用过程: Mysql> set @n=1; --定义变量 Call user_findById(@n);--调用过程 // --显示结果 ======================================================

例2: Mysql> drop procedure if exists user_count; Mysql> delimiter // Create procedure user_count(out count int) Begin Select count(*) into count from user; End // --结束 注意: MySQL存储过程 “in”参数: 跟 C语言的函数参数的值传递类似, MySQL存储过程内部可能会修改此,参数,但对 in类型参数的修改,对调用者(caller)来说是不可见的(not visible)。 “out”参数: 从存储过程内部传值给调用者。在存储过程内部,该参数初始值为 null,无论调用者是否给存储过程参数设置值inout参数跟 out类似,都可以从存储过程内部传值给调用者。不同的是:调用者还可以通过 inout参数传递值给存储过程。 总结:如果仅仅想把数据传给MySQL存储过程,那就使用“in”类型 参数;如果仅仅从MySQL存储过程返回值,那就使用“out”类型参数;如果需要把数据传给MySQL存储过程,还要经过一些计算后再传回给我们,

MySQL存储过程实例教程2

MySQL存储过程详解 1.存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。 一个存储过程是一个可编程的函数,它在数据库中创建并保存。它可以有SQL语句和一些特殊的控制结构组成。当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有用的。数据库中的存储过程可以看做是对编程中面向对象方法的模拟。它允许控制数据的访问方式。 存储过程通常有以下优点: (1).存储过程增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的运算。 (2).存储过程允许标准组件是编程。存储过程被创建后,可以在程序中被多次调用,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,对应用程序源代码毫无影响。 (3).存储过程能实现较快的执行速度。如果某一操作包含大量的Transaction-SQL代码或分别被多次执行,那么存储过程要比批处理的执行速度快很多。因为存储过程是预编译的。在首次运行一个存储过程时查询,优化器对其进行分析优化,并且给出最终被存储在系统表中的执行计划。而批处理的Transaction-SQL语句在每次运行时都要进行编译和优化,速度相对要慢一些。 (4).存储过程能过减少网络流量。针对同一个数据库对象的操作(如查询、修改),如果这一操作所涉及的Transaction-SQL语句被组织程存储过程,那么当在客户计算机上调用该存储过程时,网络中传送的只是该调用语句,从而大大增加了网络流量并降低了网络负载。 (5).存储过程可被作为一种安全机制来充分利用。系统管理员通过执行某一存储过程的权限进行限制,能够实现对相应的数据的访问权限的限制,避免了非授权用户对数据的访问,保证了数据的安全。 2.关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣。好在MySQL 5.0终于开始已经支持存储过程,这样即可以大大提高数据库的处理速度,同时也可以提高数据库编程的灵活性。 3.MySQL存储过程的创建 (1). 格式

实验五 存储过程和触发器(计科)

实验五:触发器和存储过程 一、实验目的:理解触发器和存储过程的含义,掌握用SQL语句实现触发器和存储过程的编写,并初步掌握什么情况下使用事务。 二、预习要求:存储过程和触发器的相关概念,事务的相关概念,编写相应的SQL语句。 三、实验内容: 有一个小型的图书管理数据库,包含的表为: bookstore(bookid,bookname,bookauthor,purchasedate,state); --图书库存表 borrowcard(cardid,ownername);--借书证表 borrowlog(cardid,bookid,borrowdate,returndate);--借书记录表 写一个存储过程,实现借书操作,要求有事务处理。(1)读者借书,要先设置书籍不在库标志state(借出),然后增加借书记录,在同一事务中完成。(2)要求在事务执行过程中引入错误触发事件,以此体会事务的错误保护机制和事务编程的作用。(3)要求用触发器实现表的完整性控制。 四、完成情况(附上设计的SQL语句)。 ------触发器和存储过程 ------触发器和存储过程 CREATE DATABASE BOOK1 go use BOOK1 CREATE TABLE BOOKSTORE(Bookid nvarchar(10),Bookname nvarchar(10),Bookauthor nvarchar(10),purchasedate datetime,state Nvarchar(10),primary key(Bookid)) Create table Borrowcard(Cardid int,ownername nvarchar(10),primary key(Cardid)) Create table Borrowlog(Cardid int,Bookid nvarchar(10),borrowdate datetime,returndate datetime ,primary key(Cardid,Bookid))

MySQL存储过程基础教程

MySQL 5.0 存储过程 MySQL 5.0 新特性系列第一部分 MySQL 技术白皮书 Peter Gulutzan March, 2005 翻译:陈朋奕 西安电子科技大学 2005-5-6 (声明:属于个人翻译,不涉及任何商业目的,支持国内MySQL发展,请转载时注明出处,谢谢)Copyright 2005, MySQL AB 第1 页 如有错误请来信chenpengyi_007@https://www.doczj.com/doc/e59616436.html,,谢谢您的支持和阅读,同时感谢您对MySQL事业的关注请转载时保留这些信息

Table of Contents 目录(目录不做翻译了,因为基本都是专有名词) Introduction (3) A Definition and an Example (3) Why Stored Procedures (4) Why MySQL Statements are Legal in a Procedure Body (8) Characteristics Clauses (10) Parameters (13) The New SQL Statements (15) Scope (16) Loops (21) Error Handling (29) Cursors (35) Security (41) Functions (43) Metadata (44) Details (48) Style (52) Tips when writing long routines (63) Bugs (64) Feature Requests (65) Resources (65) Conclusion (66) About MySQL (66) Copyright 2005, MySQL AB 第2 页 如有错误请来信chenpengyi_007@https://www.doczj.com/doc/e59616436.html,,谢谢您的支持和阅读,同时感谢您对MySQL事业的关注请转载时保留这些信息

mysql存储过程

目录 1.1 CREATE PROCEDURE (创建)----------------------------------------------------2 1.2 ALTER PROCEDURE (修改)-------------------------------------------------------2 1.3 DROP PROCEDURE (删除)-------------------------------------------------------2 1.4 SHOW CREA TE PROCEDURE(类似于SHOW CREA TE TABLE,查看一个已存在的存储过程)--------------------------------------------------------------------------------2 1.5 SHOW PROCEDURE STATUS (列出所有的存储过程)----------------------3 1.6 CALL语句(存储过程的调用)---------------------------------------------------------3 1.7 BEGIN ... END(复合语句)--------------------------------------------------------------3 1.8 DECLARE语句(用来声明局部变量)-------------------------------------------------3 1.9 存储程序中的变量---------------------------------------------------------------------------3 1.10 MySQL 存储过程参数类型(in、out、inout)----------------------------------------4 1.11 例子:-----------------------------------------------------------------------------------------4 1.12 Java代码调用存储过程(JDBC)------------------------------------------------------------5 1.13 声明:----------------------------------------------------------------------------------------6 冯靖 联系方式 sxyx2008@https://www.doczj.com/doc/e59616436.html, https://www.doczj.com/doc/e59616436.html,/sxyx2008

相关主题
文本预览
相关文档 最新文档