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

合集下载

《数据库原理与应用》实验存储过程和触发器(部分答案)

《数据库原理与应用》实验存储过程和触发器(部分答案)

实验6存储过程和触发器1.实验目的(1)掌握通过SQL Server管理平台和Transact-SQL语句CREATE PROCEDURE创建存储过程的方法和步骤。

(2)掌握使用Transact-SQL语句EXECUTE执行存储过程的方法。

(3)掌握通过SQL Server管理平台和Transact-SQL语句ALTER PROCEDURE修改存储过程的方法。

(4)掌握通过SQL Server管理平台和Transact-SQL语句DROP PROCEDURE删除存储过程的方法。

(5)掌握通过SQL Server管理平台和Transact-SQL语句CREATE TRIGGER创建触发器的方法和步骤。

(6)掌握引发触发器的方法。

(7)掌握使用SQL Server管理平台或Transact-SQL语句修改和删除触发器。

(8)掌握事务、命名事务的创建方法,了解不同类型的事务的处理情况。

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

(1)在查询设计器中输入以下代码,创建一个利用流控制语句的存储过程letters_print,该存储过程能够显示个小写字母。

语句:CREATE PROCEDURE letters_printASDECLARE@count intSET@count=0WHILE@count<26BEGINPRINT CHAR(ASCII('a')+@count)SET@count=@count+1ENDexec letters_print(2)输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。

语句:create proc stu_info@name char(10)asbeginSELECT姓名,g.课程编号,分数FROM dbo.student_info s JOIN grade gON s.学号=g.学号WHERE s.姓名=@nameEndexec stu_info'马东'(3)使用系统存储过程sp_rename将存储过程stu_grade更名为stu_g。

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

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

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

存储过程和触发器实验

存储过程和触发器实验
CREATE OR REPLACE TRIGGER BeerTrig AFTER INSERT ON Sells FOR EACH ROW WHEN(new.beer NOT IN (SELECT name FROM Beers)) BEGIN INSERT INTO Beers(name) VALUES(:new.beer); END;
CREATE OR REPLACE TRIGGER trg_del_emp_info BEFORE DELETE ON emp FOR EACH ROW BEGIN
INSERT INTO emp3(autoid,deptno,empno,ename,del_rq) VALUES(seq_trg_del_autoid.NEXTVAL, :OLD.deptno,:OLD.empno,:OLD.ename,sysdate);
Example
Sells(bar, beer, price); Beers(name, manf)
Whenever a new tuple is inserted into Sells:
If the beer mentioned is not in Beers, then insert it (with a null manufacturer).
Oracle触发器实例二
CREATE TABLE emp3( autoid NUMBER PRIMARY KEY, deptno NUMBER, empno NUMBER, ename VARCHAR2(20), del_rq DATE ) CREATE SEQUENCE seq_trg_del_autoid; INSERT INTO emp (empno, ename, deptno) VALUES (114, '阿娇', 10);

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

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

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

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

二、存储过程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等操作,并在这些操作发生时自动触发执行一段预定义的代码。

实验教案—实验六(存储过程和触发器)(2005)

实验教案—实验六(存储过程和触发器)(2005)
[2]《数据库系统与应用》,赵致格,清华大学出版社,2005
[3]《SQL SEVER数据库原理及应用》,张莉,清华大学出版社,2005
下次实验内容
存储过程的建立、修改和执行,触发器的建立和修改,设计一组操作触发触发器的执行
在A中,提交事务
在A,B窗口分别察看customerid = 'ANTON’的记录,结果如何,为什么?
3、锁的模拟
启动两个查询分析器,分别叫(A,B)
在A中,显式启动事务,察看customerid = 'ANTON'的记录
在B中,显式启动事务,察看customerid = 'ANTON'的记录
在B中,将customerid = 'ANTON’地址更新为’AAAAAA’
1).通过试验,加深学生对事务的基本概念理解语掌握;
2).通过试验,加深学生对并发控制的基本概念理解,认识不正确的并发控制所带来的危害;
3).通过试验,加深学生对锁的基本概念的掌握与理解,认识锁带来的问题;
二、实验环境
硬件:奔腾4处理器,1.8GHz,512M内存
操作系统软件:WindowsXP
数据库系统:SQLServer 2000桌面版
(3)对视图的操作
2、难点:
设计一系列操作触发触发器的执行。
四、仪器设备及用具
硬件:每位同学分配PC机一台
软件:windows环境安装好SQL Server
五、教学过程
(一)实验预习
(1)熟悉SQL中的创建存储过程和触发器的SQL语句
(2)准备好实验所用的数据库及原始数据
(二)实验原理
在查询分析器下利用SQL命令完成对所要求的存储过程的创建和执行,完成触发器的执行和设计相应操作触发触发器的执行。

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

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

数据库技术与应用实验报告七班级:机械因材学号: 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.掌握编写数据库存储过程的方法。

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

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

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

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

1.分别执行存储过程getPractice,查询“法学院”和“材料科学与工程学院”的学生中参与“实践”课程的所有学生学号、姓名、所学课程编号和课程名称create procedure getPractice@D_Name varchar(30)outputasbegi nif not exists(select *from D_I nfowhere D_Name= @D_Name)print'对不起,该院系不存在’elseselect st_in fo.St_ID,C」n fo.C_No,C_Namefrom s_c_i nfo inner joi n st_i nfo on st_i nfo.St_ID=s_c_i nfo.st_id inner joi n C_I nfo on s_c_i nfo.c_ no=C_I nfo.C_Nowhere st_in fo.St_ID in(select St_IDfrom st_i nfo join D_I nfo on D_In fo.D_ID =left(st_i nfo.St_ID,2) where C」n fo.C_Type=' 实践'and D_ln fo.D_Name= @D_Name)endgo|D_常prxta ■疋不.起,该箱>-f琴址*al>d9al«e? aT_iK.fd Sc^ID. C_Inf5 ■,. C^Nasic-frcai. ■ c JJZ^O -~~-=r OJ_Z:ST LZL±== sz 3 5~. I^-.s c ZXJ E D. - z j-J.j.r-:er _ = IT.C_Inf D M aF_e_infQ B C_DO-C_1G£n C_Hcwmtre 4c_inro.sc_iDjpele = E TO±zcx sjm jciri D■ 二上u 匚二D o D_ID i 3Z _Z3Lt=-. =z_ZD^ 2 1rfbUI IJlBdEa. C_T J^P RE-' 1an± i&_lA£a.p)_JfadM" (C_lamE:«nc£print 'Xl'TiLH谪僥爲不存左"selcn a^intc-St^ID G^IinTo ■ C_IPo.ClausetTon 9 c info 1 -7 _'T at inf o ar into ■旨耳11^9 ? Into,卸睪Jt)丄2_:e J.J Jlr. C IaXg g s c l^Tg . c oo^C I D J LD.□K D■rh« z e st._j_ZL.f 3 . St_12> —njs-el—et St_£Df EMi st_infe -D 1 -1 D_Inf o> cm D_InfQ. D_IB ■ r r T■ j»e_i nf a. St_IB r 3 wn e re c_ in ire ・G_T snw 宴践-■ ru_ i ntc 匚D_NWIC- t D_w«e©口=Xed ^etfxaetlC- * 学帕g=*D皿,对不起.谨院枭序存在,s&Jec:!:ar.^inrc . Sr ID. C Tore C Eg C M址尼ircm s匚JL二£□ 丄旦二亡二二_i■二st ■L二f■口as s± zzs-fa.^" ■LAat u AEL£Q . st idC_lnf& on a_c_infc. e_nci&C_lntciX_Sowbsic f g.(Kiter s^.ezrziL rt i^.fc _ j_r. □ Xaf?1二口D Izifc Z ZZ —Left st 1E£G St _ ID 2wtie£e C_in« .C 巧!PL'实踐'二計戈ii_inro. D_»Hm±- ftijkscMendgs “心—IT科学宇目□O2.利用系统存储过程sp_rename 将getPractice 更名为getPctStuexecute sp_re name getPractice , getPctStu尹■ dbc/t_^infc JXXV417J9>tLJd«ntdb - SQLQutryl «qh 寺- ax-ac^t a vp gat Practice . 口3•修改存储过程getPctStu,返回指定院系中参与实践课程的学生人次数, 并利用该存储过程以“法学院”为输入参数验证执行的结果alter procedure getPctStu@D_Name varchar(30)asbegi nif not exists(select *from D_I nfowhere D_Name= @D_Nameprint'对不起,该院系不存在’elseselect st_in fo.St_ID,C」n fo.C_No,C_Name,co unt (st_i nfo.St_ID) as 次数from s_c_i nfo inner joi n st_i nfo on st_i nfo.St_ID=s_c_i nfo.st_id inner joi n C_I nfo on s_c_i nfo.c_ no=C_I nfo.C_Nowhere st_in fo.St_ID in(select St_IDfrom st_i nfo join D_I nfo on D_In fo.D_ID =left(st_i nfo.St_ID,2) where C」n fo.C_Type=' 实践'and D_ln fo.D_Name= @D_Name)group by st_i nfo.St_ID,C」n fo.C_No,C_NameendGoexec getPctStu '法学院'Go血十口辭皿啊砒-SQlQutryL科I" MV|print '对不I九i枣FR系尸存守"el«select 3t_lntd. 5t_I D■ &_In£o-C_Ha f C_N^me. .. ; t 3t_infO-St_lDi 璋E/•.制惜f rw >_c_info n- - JD1rt_in£o cn«t_i!nfci-3't_I&-i s i B_in.£a ■|b_Ldinjier3°in C_lnfQ OT ■.c.ipfg ・*.!^<.玉旳£.13口■where st_in.Eci 5t_ID 1 naclest 5t_lnE K=-cjkn D_ln£e g &_I K£Q■ 1>_ID *W・殆VK t'lsfc.t l¥Ft-J实霸■"二 D D W WK- St_y«icEzu—P L-J!“七_丄1让<Z 上二_丄0匕_1±注右.口C l-BJV:ttndl3UT-xec j-tBnt5tu '迭学【完・G£>□茁黑血:占豐5l」D C-Nsw ' *「企t i出:;血[5 72001 ] 如忖U (IB罷伸a i3 2KHD5-:H0~ 57ZO13. 犬宇计刘曲気14.再修改存储过程getPctStu,返回指定院系中参与实践课程的学生人数注:“人数”和“人次数”是不同的,对某一学生而言,如果参与了多门实践课程,则“人次数”是指其参与的课程门数,而“人数”仍为1。

数据库实验存储过程、触发器和函数实验

数据库实验存储过程、触发器和函数实验

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

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

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

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

执行存储过程:exec countpeople(2)创建一个存储过程,该存储过程有一个参数用来接收课程号,该存储过程统计给定课程的平均成绩。

执行存储过程:exec avg_score'C602'(3)创建一个存储过程,该存储过程将学生选课成绩从百分制改为等级制(即A、B、C、D、E)。

执行存储过程:exec alterscore(4)创建一个存储过程,该存储过程有一个参数用来接收学生姓名,该存储过程查询该学生的学号以及选修课程的门数。

执行存储过程:exec select_courses'李强'(5)创建一个存储过程,该存储过程有两个输入参数用来接收学号和课程号,一个输出参数用于获取相应学号和课程号对应的成绩。

执行存储过程:declare@score smallintexec select_socre'98601','C602',@score outputprint'成绩是'+convert(char(2),@score)+'分'2、触发器(1)为study表创建一个UPDATE触发器,当更新成绩时,要求更新后的成绩不能低于原来的成绩。

创建完触发器尝试进行更新数据:update study set score=60 where sno='98601'and cno='C601'执行完之后查询结果发现成绩仍然是90select score from study where sno='98601'and cno='C601'再更新一个高于90分的成绩则可以成功update study set score=91 where sno='98601'and cno='C601'select score from study where sno='98601'and cno='C601'(2)为study表创建一个DELETE触发器,要求一次只能从study表中删除一条记录。

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

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

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

一、实验原理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 语句封装为一个可以重复调用的函数,使得程序更加简洁和高效。

数据库技术及应用 存储过程与触发器(6.3)--实验六

数据库技术及应用 存储过程与触发器(6.3)--实验六

“数据库技术及应用”教学单元6:存储过程与触发器实验本部分实验只适合SQL Server系统环境实验1: 使用企业管理器创建用户存储过程。

实验目的:掌握创建用户存储过程的方法;实现使用企业管理器创建用户存储过程,创建“男学员”存储过程,用于控制输入数据检验。

实验步骤:① 启动SQL Server企业管理器。

② 在“控制台目录”窗口左侧窗格中,首先,展开“SQL Server组”→“数据库”结点,然后,展开“Training”数据库→“存储过程”结点,单击鼠标右键,弹出快捷菜单,如下图所示。

③ 在快捷菜单中,选择“新建存储过程”菜单命令,打开“存储过程属性-新建存储过程”对话框,如下图所示。

④ 在“存储过程属性-新建存储过程”对话框的“文本”文本框中,输入下列存储过程代码:CREATE PROC 男学员AS SELECT stu_name,stu_sex,stu_phoneFROM tra_studentsWHERE stu_sex = '男'⑤ 在“存储过程属性-新建存储过程”对话框中,单击“检查语法”。

若没有错误,单击“确定”按钮,完成存储过程创建,如下图所示。

实验2:使用企业管理器创建触发器。

实验目的:掌握创建触发器的方法;实现使用企业管理器创建触发器,创建“学员_性别”触发器,用于控制输入数据检验。

实验步骤:① 启动SQL Server企业管理器。

② 在“控制台目录”窗口左侧窗格中,首先,展开“SQL Server组”→“数据库”结点,然后,展开“Training”数据库结点。

双击“表”子结点,在“控制台目录”的右侧窗格中选择要建立触发器的“Tra_students”表,单击鼠标右键,弹出快捷菜单,如下图所示。

③ 在快捷菜单中,选择“所有任务”→“管理触发器”菜单命令,打开“触发器属性”对话框。

在“触发器属性”对话框的“文本”文本框中输入下列触发器过程代码:CREATE TRIGGER 学员_性别 ON Tra_studentsFOR INSERT, UPDATEASIF EXISTS (SELECT * FROM tra_students WHERE stu_sex NOT IN ('男','女'))BEGINRAISERROR ('请输入合法性别!',16,1)ROLLBACK TRANSACTIONEND单击“确定”按钮,完成“学员_性别”触发器的创建。

数据库实验-存储过程、触发器

数据库实验-存储过程、触发器
from SC
group by Sno
order by sum(Grade)desc
exec total
drop proc total
执行结果:命令已成功完成。
如图:
(3)创建存储过程,查找某门课的最高分(带输入参数的存储过程)。
代码:
create proc grade1
@Cname char(20)
石家庄经济学院
实验报告
学院:信息工程学院
专业:网络工程
信息工程学院计算机实验中心制
学号
411109030110
姓名
马立杰
实验日期
2014.5.12
实验室
260
指导教师
张有华
设备编号
实验内容
实验6存储过程、触发器
一实验题目
1.存储过程的定义和使用
2.触发器的创建与使用
二实验目的
1.掌握存储过程的定义、执行和调用方法。
如图:
(5)创建存储过程,统计某门课选修的人数,将人数返回。(带返回值的存储过程)
代码:
create proc proc1
@Cno char(10),
@number int output
as
select @number=count(*)
from SC
where Cno=@Cno
group by Cno
where Sno=
(select top 1 Sno from SC
group by Sno
order by count(*) desc)
exec proc2
drop proc proc2
执行结果:命令已成功完成。
如图:
2.触发器的创建与使用

实验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 addresult1n 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 addresult2n 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的结果。

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

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

南昌航空大学实验报告二00 年月日课程名称:数据库概论实验名称:数据库存储过程与触发器班级:122031 姓名:同组人:指导教师评定:签名:一、实验环境1.Windows2000或以上版本;2.SQLServer 2005。

二、实验目的熟悉不同数据库的存储过程和触发器,重点实践SQL Server2005,掌握SQL Server2005中有存储过程与触发器的相关知识。

三、实验要求完成实验指导书中p115-7和p132 -4。

四、实验步骤及参考源代码1.创建与执行存储过程create procedure C_P_Proc asselect distinct o,cna,pna,numfrom paper,customer,cpwhere o=o and paper.pno=cp.pno and cna='李涛' or cna='钱金浩' goexecute C_P_Proc2.删除存储过程drop procedure C_P_Proc3.创建插入触发器create trigger TR_PAPER_I ON PAKER12203125FOR INSERT ASDECLARE @appr floatDECLARE @apno intSELECT @appr=ppr,@apno=pno from insertedbeginif @appr<0 or @appr is nullbeginraiserror('报纸的单价为空或小于!',16,1)update paper set ppr=10where paper.pno=@apnoendend4.创建删除触发器create Trigger TR_PAPER_D on PAKER12203125after delete asdeclare @ipno char(6)declare @icount int;select @icount= count(*) from deleted,cpwhere deleted.pno=cp.pnoif @icount>=1beginselect @ipno=pnofrom deletedraiserror('级联删除cp表中的数据',16,1)delete from cp where cp.pno=@ipnoend5.创建修改触发器create trigger TR_PAPER_U ON PAKER12203125for update asdeclare @ippr floatselect @ippr=ppr from insertedif @ippr<0 or @ippr is nullbeginraiserror('输入单价不正确',16,1)rollback transactionend6. 分别对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'五、实验结果123.4.56六、实验体会试验过后,巩固了自己在课堂上所学的知识,并加深了记忆与了解,对以后的使用有很大作用在实验过程中,遇到一些困难,经过自己不断查找书籍并询问老师来解决问题,提高了自己的逻辑思维能力和动手能力。

实验6 游标、存储过程和触发器

实验6 游标、存储过程和触发器

实验六游标、存储过程与触发器
一、实验目的
掌握使用T-SQL实现游标、存储过程和触发器的创建,使用方法。

二、实验内容
在实验一、实验二创建的表中用T-SQL语句完成以下内容:
1.使用游标实现将及格的选课信息输出。

2.使用游标将SPJ表中的偶数行输出。

3.创建存储过程,查询赵永亮所修课程的课程信息,将课程号和课程名输出。

4.创建存储过程,统计指定学生修课的平均成绩和选课门数,将统计的结果用输出参数返回。

5.创建存储过程,在学生表Student中插入一条完整的元组。

6.创建存储过程,根据用户指定的供应商号删除SPJ表中相应的供货信息。

7.创建存储过程,将指定零件的重量增加指定的值。

8.用触发器实现约束:如果是北京的供应商,供应任何零件的数量不能少于300,如果少于则自动改为300。

9.在SC关系中增加新属性列Status,用来记录课程成绩的等级,0-59分为“不合格”,60-69为“合格”,70-89为“良好”,90以上为“优秀”。

要求status属性列的值由用户在插入、更新选课成绩时系统自动填写和更新。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

SQL数据库实验报告实验六

SQL数据库实验报告实验六

第1部分实验8 存储过程和触发器1.实验目的(1)掌握通过SQL Server 管理平台和Transact-SQL 语句CREA TE PROCEDURE 创建存储过程的方法和步骤。

(2)掌握使用Transact-SQL 语句EXECUTE 执行存储过程的方法。

(3)掌握通过SQL Server 管理平台和Transact-SQL 语句ALTER PROCEDURE 修改存储过程的方法。

(4)掌握通过SQL Server 管理平台和Transact-SQL 语句DROP PROCEDURE 删除存储过程的方法。

(5)掌握通过SQL Server 管理平台和Transact-SQL 语句CREA TE TRIGGER 创建触发器的方法和步骤。

(6)掌握引发触发器的方法。

(7)掌握使用SQL Server 管理平台或Transact-SQL 语句修改和删除触发器。

2.实验内容及步骤(1)在查询设计器中输入以下代码,创建一个利用流控制语句的存储过程letters_print ,该存储过程能够显示26个小写字母。

CREATE PROCEDURE letters_print ASDECLARE @count int SET @count=0 WHILE @count<26 BEGINPRINT CHAR(ASCII('a')+ @count) SET @count=@count +1 END单击查询分析器的“执行查询”按钮,查看studentsdb 数据库的存储过程是否有letters_print 。

使用EXECUTE 命令执行letters_print 存储过程。

(2)输入以下代码,创建存储过程stu_info,执行时通过输入姓名,可以查询该姓名对应的学生的各科成绩。

CREATE PROCEDURE stu_info @name varchar(40)ASSELECT a.学号,姓名,课程编号,分数FROM student_info a INNER JOIN grade taON a.学号= ta.学号WHERE 姓名= @name使用EXECUTE命令执行存储过程stu_info,其参数值为“马东”。

实验:存储过程与触发器

实验:存储过程与触发器

实验名称:存储过程与触发器实验目的:掌握SQLSERVER存储过程与触发器的定义、调用操作数据库结构关系:语法规定:(1)存储过程定义语法:CREATE PROC 过程名@parameter 参数类型……@parameter 参数类型outputASBegin命令块End利用TSQL调用存储过程:Execute 过程名[参数值,……][Output]如果没有参数,直接调用过程名(2)创建事后触发器的语法:CREATE TRIGGER 触发器名ON 表名For Insert [,Update,Delete] AsBegin命令块End(3)创建替代触发器的语法:CREATE TRIGGER 触发器名ON 表名Instead of Insert [,Update,Delete] AsBegin命令块End实验内容:(一)存储过程(1)创建带输入参数的存储过程,输入查询的工资范围,输出查询到的职工信息Create proc Myproc1@mingzint,@maxgzintasselect * from 职工表where 工资between @mingz and @maxgz 调用该过程execute Myproc1 1000,4000(2)使用Transact-SQL语言创建带输入输出参数的存储过程。

输入仓库号,输出该仓库的职工信息、职工最高工资、最低工资Create proc Myproc2@cangkuhaovarchar(50),@maxgzint output,@avggzint outputasbeginselect * from 职工表where 仓库号=@cangkuhaoSelect @maxgz=max(工资) from 职工表where 仓库号=@cangkuhaoSelect @avggz=avg(工资) from 职工表where 仓库号=@cangkuhaoEnd调用存储过程。

数据库实验6触发器实验报告

数据库实验6触发器实验报告

淮海工学院计算机工程学院实验报告书课程名:《数据库原理及应用》题目:存储过程和触发器班级:软件132学号: 2013122907姓名:孙莹莹一.目的与要求1.掌握存储过程的创建方法;2.掌握存储过程的执行、修改和删除等操作;3.掌握触发器的创建方法;4.掌握触发器的使用、修改和删除等相关内容二.实验内容基于前面建立的factory数据库,使用T-SQL语句完成如下各小题的功能:1.创建一个为worker表添加职工记录的存储过程Addworker;2.创建一个存储过程Delworker删除worker表中指定职工号的记录。

3.显示存储过程Delworker;4.删除存储过程Addworker和Delworker.三.实验步骤1 .(1)建立存储过程USE factoryGOCREATE PROCEDURE Addworker@no int=NULL,@name char(10)=NULL,@sex char(2)=NULL,@birthday datetime=NULL,@na char(2)=NULL,@wtime datetime=NULL,@depno int=NULLASIF @no IS NULL OR @name IS NULL OR @sex IS NULL OR@birthday IS NULL OR @depno IS NULLBEGINPRINT '请重新输入该职工信息!'PRINT '你必须提供职工号、姓名、性别、出生日期、部门号'RETURNENDBEGIN TRANSACTIONINSERT INTO workerVALUES(@no,@name,@sex,@birthday,@na,@wtime,@depno)IF @@error<>0BEGINROLLBACK TRANRETURNENDCOMMIT TRANSACTIONPRINT '职工'+@name+'的信息成功添加到表worker中'(2)验证存储过程USE factoryGOAddworker 20,'陈立','女','55/03/08','否','75/10/10',4GOSELECT 职工号,姓名,性别,党员否 FROM workerGO2.(1)建立存储程序USE factoryGOCREATE PROCEDURE Delworker@no int=NULLASIF @no IS NULLBEGINPRINT '必须输入职工号!'RETURNENDBEGIN TRANSACTIONDELETE FROM worker WHERE 职工号=@noIF @@error<>0BEGINROLLBACK TRANRETURNENDCOMMIT TRANSACTIONPRINT '成功删除职工号为'+CAST(@no AS CHAR(2))+'的职工记录' 执行下列语句,可验证存储过程的正确性:USE factoryGODelworker 20GOSELECT 职工号,姓名,性别,党员否 FROM workerGO3.USE factoryGOEXEC sp_helptext DelworkerGO4.USE factoryGOIF EXISTS (SELECT name FROM sysobjectsWHERE name = 'Addworker' AND type ='P') DROP PROCEDURE AddworkerGOIF EXISTS (SELECT name FROM sysobjectsWHERE name = 'Delworker' AND type ='P') DROP PROCEDURE DelworkerGO5.建立触发器depart_update的程序如下:USE factoryGOIF EXISTS (SELECT name FROM sysobjectsWHERE type='TR' AND name='depart_update')DROP TRIGGER depart_updateGOCREATE TRIGGER depart_update ON departAFTER UPDATEASDECLARE @olddepno int,@newdepno intSELECT @olddepno=部门号FROM deletedSELECT @newdepno=部门号FROM inserted UPDATE workerSET 部门号=@newdepnoWHERE 部门号=@olddepnoGO执行下列语句,可验证存储过程的正确性:USE factoryGOPRINT '将部门号改为'UPDATE departSET 部门号=105WHERE 部门号=101GOSELECT 职工号,姓名,部门号FROM workerGOPRINT '将部门号改为'UPDATE departSET 部门号=101WHERE 部门号=105GOSELECT 职工号,姓名,部门号FROM workerGO6.建立触发器worker_delete的程序如下:USE factoryGOIF EXISTS(SELECT name FROM sysobjectsWHERE type='TR'AND name='worker_delete')DROP TRIGGER worker_deleteGOCREATE TRIGGER worker_delete ON workerFOR DELETEASDECLARE @no intSELECT @no=职工号FROM deletedDELETE FROM salaryWHERE职工号=@noGO执行下列语句,可验证存储过程的正确性:USE factoryGOPRINT'删除前的工资记录'SELECT*FROM salaryGODELETE FROM workerWHERE职工号=15GOPRINT'删除职工号为的职工记录后的工资记录'SELECT*FROM salaryGO7.删除触发器depart_update的程序如下:USE factoryGODROP TRIGGER depart_updateGO8.删除触发器worker_delete的程序如下:USE factoryGODROP TRIGGER worker_deleteGO四.测试数据与实验结果第1题图第2题图第3题图第5题图第6题图五.结果分析与实验体会CREATE PROCEDURE语句允许创建、编译并在MS-SQL Server上保存存储过程。

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

实验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的结果。

DECLARE @s intset @s=0EXEC addresult2 10,@sum=@s outPRINT'1+2+3+...+n的结果是:'PRINT @s7.创建一存储过程Proc_Student,用于显示学号为“0102”的学生基本信息(包括学号、姓名、性别和系)。

CREATE PROCEDURE Proc_StudentASBEGINselect*from Swhere S.sno=0102ENDGOEXEC Proc_Student8.创建一存储过程Stu_grade,通过读取某门课的编号,求出不及格的学生的学号。

CREATE PROCEDURE Stu_grade@n char(10)ASBEGINselect snofrom SCwhere cno=@n and grade<60ENDGO9.调用上面的存储过程Stu_grade,求出课程编号为“0101”的不及格的学生。

EXEC Stu_grade 010110.创建一存储过程avgGrade,通过读取学生的学号,以参数形式返回该学生的平均分。

CREATE PROCEDURE avgGrade@n char(10)ASBEGINselect AVG(grade)平均分from SCwhere sno=@ngroup by snoENDGO11.调用上面的存储过程avgGrade,求出学号为“990102014”的平均分。

EXEC avgGrade 99010201412.删除上述存储过程avgGrade。

drop procedure avgGrade13.创建存储过程search,该存储过程有三个参数,分别为@t、@p1,@p2,根据这些参数,找出书名与@t有关,价格在@p1与@p2(@p2>=@p1)之间的书的编号,书名,价格,出舨日期。

如果用户调用时没有指定@t参数的值.则表示可为任意值,如用户没有指定@p2,则书本价格没有上限。

用到的关系为:titles (title_id,title,price,pubdate)。

CREATE PROCEDURE search@t char(10)="%",@p1 char(10),@p2 char(10)=NULLASBEGINselect title_id,title,price,pubdatefrom titleswhere title=@t and price<=@p2 and price>=@p1ENDGO14.调用上面的存储过程search,求出书名与computer有关,而且价格小于$20大于$10的书。

EXEC search "computer",10,20二)触发器:1、在学生成绩库中创建触发器trigger1,实现如下功能:当在学生成绩表(xscj)中插入一条学生选课信息后,自动实现更新该学生在学生情况表(xsqk)中的总学分信息。

分析:根据题意,也即要求在学生成绩表中插入一条记录时,自动更新学生情况表中的相应记录信息。

可以通过在学生成绩表中定义INSERT类型的触发器,触发器中语句要完成的功能是更新学生情况表中的相应学生的总学分信息。

其实,只要在该生原总学分基础上加上新选课程的学分就可以了。

create trigger trigger1on xscjafter insertasdeclare @credit int;select @credit=credit from inserted xscj;update xsqk set allcredit=allcredit+@credit;go2、创建触发器trigger2,实现当修改学生课程表(xskc)中的数据时,显示提示信息“学生课程表被修改了”。

create trigger trigger2on xskcafter updateasprint'学生课程表被修改了';go3、创建触发器trigger3,实现当删除学生课程表中某门课程的记录时,对应学生成绩表中所有有关此课程的记录均删除。

create trigger trigger3on xskcafter deleteasdeclare @cname char(10);select @cname=cname from deleted xsks;delete xscj where cname=@cname;go4、创建触发器trigger4,实现当修改学生课程表(xskc)中的某门课的课程号时,对应学生成绩表(xscj)中的课程号也作相应修改。

create trigger trigger4on xskcafter updateasdeclare @cno char(10);declare @cname char(10);select @cname=ame,@cno=o from updated xsks;update xscj set o=@cno where ame=@cname;go5、创建触发器trigger5,实现当向学生成绩表(xscj)中插入一条选课记录时,查看该学生的信息是否存在在学生信息表中,如果不存在,则把该学生的基本信息加入到学生信息表中。

create trigger trigger5on xscjafter insertasdeclare @sname1 char(10);declare @sname2 char(10)=NULL;select @sname1=xscj.sname from updated xscj;select @sname2=xsqk.sname from xsqk where xsqk.sname=@sname1;if @sname2=NULLinsert into xsqk values(NULL,@sname1);go6、在学生成绩库中创建触发器trigger6,实现如下功能:当在学生成绩表(xscj)中插入一条学生选课信息后,查看该学生的信息是否存在在学生信息表中,如果不存在,则给出“该记录不能被插入!”的错误提示,并撤销插入操作;同样,如果课程信息在课程信息表中不存在,给出“该记录不能被插入!”的错误提示,并撤销插入操作。

create trigger trigger6on xscjfor insertasbeginif not exists(select xsqk.sname from xsqk where xsqk.sname in(select xscj.snamefrom inserted xscj))beginraiserror('该记录不能被插入!',16,1)rollbackreturnendendgo7、创建触发器trigger7,强制实现业务规则:当向学生成绩表中插入一条记录时,自动修改学生情况表中该学生的总学分,要求总学分为该学生所有已修课程的学分总和。

create trigger trigger7on xscjfor insertasbegin transactiondeclare @credit int;select @credit=credit from inserted xscj;update xsqk set allcredit=allcredit+@credit;commit transactiongo8、分别用触发器和存储过程实现对学生情况表(xsqk)和学生成绩表(xscj)表的级联删除。

create trigger trigger8on xsqkafter deleteasdelete from xscjwhere xscj.sname in(select xsqk.sname from deleted xsqk)goCREATE PROCEDURE del_qk_cj@sname char(10)=NULLASBEGINdelete from xscjwhere xscj.sname=@sname;delete from xsqkwhere xsqk.sname=@sname;ENDGO9、创建触发器8,要求实现:当向xscj表插入一条记录时,判断该学生的总学分,如果总学分大于等于25,则给出“该学生已修满,不需要再选修!”的提示信息;否则,自动更新该学生的总学分。

相关文档
最新文档