实验16 游标、存储过程和函数参考答案

合集下载

实验游标和存储过程

实验游标和存储过程

实验九游标与存储过程1 实验目的与要求(1) 掌握游标的定义和使用方法。

(2) 掌握存储过程的定义、执行和调用方法。

(3) 掌握游标和存储过程的综合应用方法。

2 实验内容请完成以下实验内容:(1) 创建游标,逐行显示Customer表的记录,并用WHILE结构来测试@@Fetch_Status的返回值。

输出格式如下:'客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码'(2) 利用游标修改OrderMaster表中orderSum的值。

(3) 创建游标,要求:输出所有女业务员的编号、姓名、性别、所属部门、职务、薪水。

(4) 创建存储过程,要求:按表定义中的CHECK约束自动产生员工编号。

(5) 创建存储过程,要求:查找姓“李”的职员的员工编号、订单编号、订单金额。

(6) 创建存储过程,要求:统计每个业务员的总销售业绩,显示业绩最好的前3位业务员的销售信息。

(7)创建存储过程,要求将大客户(销售数量位于前5名的客户)中热销的前3种商品的销售信息按如下格式输出:=======大客户中热销的前3种商品的销售信息================商品编号商品名称总销售数量P2******* 120GB硬盘 21.00P2******* 3.5寸软驱 18.00P2******* 网卡 16.00(8) 创建存储过程,要求:输入年度,计算每个业务员的年终奖金。

年终奖金=年销售总额×提成率。

提成率规则如下:年销售总额5000元以下部分,提成率为10%,对于5000元及超过5000元部分,则提成率为15%。

(9) 创建存储过程,要求将OrderMaster表中每一个订单所对应的明细数据信息按规定格式输出,格式如图7-1所示。

存储过程、函数与触发器操作答案

存储过程、函数与触发器操作答案

《存储过程、函数与触发器操作》实验一、实验目的与要求1、掌握存储过程的使用。

2、掌握函数的使用。

3、掌握触发器操作。

三、实验内容一、存储过程1、在“教务管理系统”数据库中创建一个名为ProcStudentInfo的存储过程,它返回学生的学号、姓名、性别、班级编号、年级和籍贯信息。

CREATE PROCEDURE Proc_StudentInfoASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息2、用EXECUTE执行Proc_StudentInfo存储过程。

EXECUTE Proc_StudentInfo3、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息。

CREATE PROCEDURE Proc_GetClassStudent1@ClassID varchar(14)ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassID4、创建一个存储过程,用于返回“教务管理系统”数据库上某个班级中所有学生的信息,默认班级编号为'20031340000102' 。

CREATE PROCEDURE Proc_GetClassStudent2@ClassID varchar(14)= '20031340000102'ASSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDEXECUTE Proc_GetClassStudent2 '20031340000103'5、创建一个返回执行代码为100的存储过程。

CREATE PROCEDURE Proc_GetClassStudent4@ClassID varchar(14)ASBEGINSELECT 学号,姓名,性别,班级编号,年级,籍贯FROM 学生信息WHERE 班级编号=@ClassIDRETURN 100END6、执行存储过程Proc_GetClassStudent2和Proc_GetClassStudent4,并定义两个个变量存储执行返回代码。

数据库-存储过程-游标-函数

数据库-存储过程-游标-函数

数据库-存储过程-游标-函数⼀、存储过程SQL99标准提出的SQL-invoked-rountines的概念,它开分为存储过程与函数,这⾥⾸先介绍存储过程存储过程分为三类:系统存储过程(如:sp_help)、⾃定义存储过程、扩展存储过程存储过程可以理解为⼀个SQL语句块,完成⼀些复杂的功能,当然可以包含应⽤程序的业务,⽐如:分页,⽣成订单号等,存储过程可以接收应⽤程序传递的参数,并将查询的结果返回给应⽤程序1、存储过程的优点:1)、运⾏效率⾼,因为存储过程不会在每⼀次调⽤时都解释执⾏,随便说⼀句,SQL执⾏后的执⾏计划会放在缓存中,这样下⼀次相同的SQL执⾏就不⽤再次优化了,从⽽加快速度2)、存储过程降低了客户机与服务器的通信量,使⽤存储过程,就不⽤在应程序中拼SQL传回服务器,只须要存储过程名与参数就可以了3)、⽅便实施企业规则,可以在存储过程⾥加⼊业务逻辑2、存储过程的使⽤(重复使⽤)创建:create proc pc_whcasselect * from whc/*执⾏*/exec pc_whc⼆、游标游标可以理解为⼀个"指针",其指向的是⼀条记录,当⽤select语句得到⼀个结果集时,我们可以将它放到⼀个游标中,然后通过移动游标来读取每⼀条数据,并进⾏处理,感觉有点"遍历"数据游标的使⽤:1、定义游标:declare cursor_name cursorFor select 语句;2、打开游标:open cursor_name3、循环访问游标中的每⼀⾏数据:Fetch next from cursor_name into @参数列表4、游标的状态:@@fetch_status,⽤于判断游标fetch的状态,当为0时正常,不为⼀时异常5、关闭并释放资源例:declare @whcId nchar(5),@whc int;/*定义⼀个游标*/declare whc_cursor cursorfor select CustomerID,EmployeeID from dbo.Orders/*打开⼀个游标*/open whc_cursor/*移动指针,将数据放到变量中*/fetch next from whc_cursor into @whcId,@whcwhile @@fetch_status = 0beginprint @whcid+' '+convert(nchar(5),@whc)fetch next from whc_cursor into @whcId,@whcendclose whc_cursordeallocate whc_cursor三、函数函数相信⼤家都很清楚了,传递参数,然后返回⼀个结果,SQL中的函数也⼤致差不多,返回时使⽤ruturn,可以是int、varchar,table等类型,有了函数就可以把⼀些功能在⼀起,⽐如对数据的处理等函数的创建(例⼦说明):create function fun_whc(@str varchar(50))returns varchar(100)asbegindeclare @List varchar(200)set @List=@str+'My friend'--返回值return @Listend--调⽤select DemoName,dbo.fun_whc(DemoName) from whc最后要说明的是,⼩弟初学,哪⾥有不对的请指出,感激不尽。

数据库中的游标存储过程和触发器

数据库中的游标存储过程和触发器

数据库中的游标存储过程和触发器游标、存储过程和触发器是数据库中常用的三种特殊对象。

游标用于在数据库管理系统中对查询结果进行逐行处理,存储过程是一组预定义的SQL语句集合,可以被重复调用执行,而触发器则是在数据库中的特定事件发生时自动执行的一段代码。

首先,我们来了解一下游标。

游标是一个数据库概念,它可以被看作是一个指向查询结果集的指针。

通过游标,我们可以在数据库内部对查询结果集进行逐行处理,从而实现对数据的操作。

游标的使用可以有效地减少数据库服务器的负担,提高数据库性能。

在一些需要对批量数据进行处理的场景下,游标可以发挥重要作用。

例如,当需要对查询结果逐行进行计算、更新或者删除时,可以使用游标定位到每一条记录,并对其进行操作。

接下来,我们了解一下存储过程。

存储过程是一组预定义的SQL语句的集合,它们一起执行一些特定的任务。

存储过程可以包含流程控制、循环结构、条件判断等逻辑,还可以接受参数并返回结果。

存储过程的好处在于可以实现代码复用,提高数据库的性能和可维护性。

通过存储过程,我们可以将常用的SQL操作封装起来,减少了网络传输的开销,提高了数据访问的效率。

另外,存储过程还可以实现权限控制,通过调用存储过程来间接访问数据库,可以避免直接在应用程序中操作数据库,增强了数据的安全性。

最后,我们来了解一下触发器。

触发器是在数据库中特定的事件发生时自动执行的一段代码。

这些事件可以是INSERT、UPDATE或者DELETE操作。

触发器通常被用来在数据库表的数据发生变化时执行相应的操作。

它可以用来保证数据库的数据一致性和完整性,触发器能够在数据被修改之前或之后自动执行,并且可以在代码中加入逻辑判断和业务处理。

例如,在一个订单表中,我们可以定义一个触发器,在插入一条新订单数据时,自动计算订单总金额并更新到订单的总金额字段中。

总结一下,游标、存储过程和触发器是对数据库进行处理和控制的重要工具。

游标可以让我们逐行处理查询结果集,存储过程可以定义逻辑处理、实现代码的复用,而触发器则可以在数据库表的特定事件发生时自动执行一段代码。

《MySQL数据库原理、设计与应用》第10章课后习题答案

《MySQL数据库原理、设计与应用》第10章课后习题答案

第十章一、填空题1.92. e3.@,变量名4.REPEAT5.DELIMITER二、判断题1.错2.错3.对4.对5.对三、选择题1. A2. D3. D4. C5. B四、简答题1.请简述存储过程和函数的区别。

答:(1)语法中实现的标识符不同,存储过程使用PROCEDURE,函数为FUNCTION。

(2)存储过程在创建时没有返回值,而函数在定义时必须设置返回值。

(3)存储过程没有返回值类型,且不能将结果直接赋值给变量;而函数定义时需要设置返回值类型,且在调用时除在SELECT中,必须将返回值赋给变量。

(4)存储过程必须通过CALL进行调用,不能使用SELECT调用;而函数则可在SELECT语句中直接使用。

2.请说一说触发器以及其作用。

答:概念:触发器可以看作是一种特殊类型的存储过程,在预先定义好的事件(如INSERT、DELETE等操作)发生时,才会被MySQL自动调用。

作用:①触发器可以通过数据库中的相关表实现级联无痕更改操作。

②保证数据安全,进行安全校验五、实训题11. 请在shop数据库中创建一个存储过程,以订单编号为参数,输出该订单的商品信息。

mysql> DELIMITER $$mysql> CREATE PROCEDURE shop.order_proc(IN order_id INT )-> BEGIN-> SELECT g.id, FROM sh_goods g-> LEFT JOIN sh_order_goods og ON g.id = og.goods_id-> WHERE og.order_id = order_id;-> END-> $$Query OK, 0 rows affected (0.01 sec)mysql> DELIMITER ;2. shop.sh_order_goods表上创建一个触发器,当添加订单-商品信息时,修改sh_goods表中对应商品的库存量。

存储过程的面试题

存储过程的面试题

存储过程的面试题在数据库管理系统(DBMS)中,存储过程是一组预定义的SQL语句集合,可以在数据库中存储并且以单个单元的形式进行调用。

它们可以完成复杂的操作并且提供了许多好处,如简化数据库操作、提高性能和安全性等。

当你准备参加存储过程的面试时,可能会面临一些与存储过程相关的问题。

本文将介绍一些常见的存储过程面试题,并提供了详细的解答。

问题一:什么是存储过程?存储过程是一组预定义的SQL语句集合,存储在数据库中。

它们可以被视为一个函数,接收输入参数并且返回结果。

存储过程可以由应用程序通过调用数据库的API调用。

问题二:存储过程和函数之间有什么区别?存储过程和函数之间的主要区别在于函数返回一个值给调用者,而存储过程不返回值给调用者。

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

另外,存储过程可以接收输出参数,这些参数可以在存储过程执行完毕后传递给调用者。

问题三:存储过程的优点是什么?存储过程有以下几个优点:1. 提高性能:存储过程可以在数据库中进行预编译,这意味着当存储过程被调用时,它们已经被编译并且存储在内存中。

这样可以节省解析和编译的时间,从而提高性能。

2. 简化复杂的操作:存储过程可以执行复杂的操作,如事务处理和错误处理。

它们可以将复杂的业务逻辑封装在一个单独的单元中,并且可以在多个地方进行调用。

3. 提高安全性:存储过程可以限制对数据库的直接访问,只允许通过存储过程访问数据库。

这样可以提高数据的安全性,防止恶意操作和注入攻击。

4. 降低维护成本:存储过程可以在数据库中进行维护和更新,这样可以方便地对其进行修改和调整,而不需要修改应用程序的代码。

问题四:存储过程如何调用?存储过程可以通过数据库的API调用或者SQL语句进行调用。

以下是两种常见的调用方法:1. 使用数据库的API调用:不同的数据库提供了不同的API来调用存储过程。

例如,在MySQL中可以使用CALL语句调用存储过程,而在Oracle中可以使用EXECUTE语句调用存储过程。

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

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

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

教材中的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表中删除一条记录。

游标与存储过程

游标与存储过程

Байду номын сангаас
存储过程
sql语句执行的时候要先编译,然后执行。存储过程就是编译好了的一些sql语句。应用程序需要用的时候直接调用就可以了,所以效率会高。 存储过程介绍 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE中,若干个有联系的过程可以组合在一起构成程序包。 使用存储过程有以下的优点: * 存储过程的能力大大增强了SQL语言的功能和灵活性。存储过程可以用流控制语句编写,有很强的灵活性,可以完成复杂的判断和较复杂的 运算。 * 可保证数据的安全性和完整性。 # 通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。 # 通过存储过程可以使相关的动作在一起发生,从而可以维护数据库的完整性。 * 再运行存储过程前,数据库已对其进行了语法和句法分析,并给出了优化执行方案。这种已经编译好的过程可极大地改善SQL语句的性能。 由于执行SQL语句的大部分工作已经完成,所以存储过程能以极快的速度执行。 * 可以降低网络的通信量。 * 使体现企业规则的运算程序放入数据库服务器中,以便: # 集中控制。 # 当企业规则发生变化时在服务器中改变存储过程即可,无须修改任何应用程序。企业规则的特点是要经常变化,如果把体现企业规则的运算程序放入应用程序中,则当企业规则发生变化时,就需要修改应用程序工作量非常之大(修改、发行和安装应用程序)。如果把体现企业规则的 运算放入存储过程中,则当企业规则发生变化时,只要修改存储过程就可以了,应用程序无须任何变化。 数据库存储过程的实质就是部署在数据库端的一组定义代码以及SQL。 利用SQL的语言可以编写对于数据库访问的存储过程,其语法如下: CREATE PROC[EDURE] procedure_name [;number] [ {@parameter data_type} ][VARYING] [= default] [OUTPUT] ] [,...n] [WITH { RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION } ] [FOR REPLICATION] AS sql_statement [...n] [ ]内的内容是可选项,而()内的内容是必选项, 例: 若用户想建立一个删除表tmp中的记录的存储过程Select_delete可写为: Create Proc select_del As Delete tmp 例:用户想查询tmp表中某年的数据的存储过程 create proc select_query @year int as select * from tmp where year=@year 在这里@year是存储过程的参数 例:该存储过程是从某结点n开始找到最上层的父亲结点,这种经常用到的过程可以由存储过程来担当,在网页中重复使用达到共享。 空:表示该结点为顶层结点 fjdid(父结点编号) 结点n 非空:表示该结点的父亲结点号 dwmc(单位名称) CREATE proc search_dwmc @dwidold int,@dwmcresult varchar(100) output as declare @stop int declare @result varchar(80) declare @dwmc varchar(80) declare @dwid int set nocount on set @stop=1 set @dwmc="" select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold set @result=rtrim(@dwmc) if @dwid=0 set @stop=0 while (@stop=1) and (@dwid<>0) begin set @dwidold=@dwid select @dwmc=dwmc,@dwid=convert(int,fjdid) from jtdw where id=@dwidold if @@rowcount=0 set @dwmc="" else set @result=@dwmc+@result if (@dwid=0) or (@@rowcount=0) set @stop=0 else continue end set @dwmcresult=rtrim(@result) 使用exec pro-name [pram1 pram2.....]
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验十六游标、存储过程和函数
一、目的与要求
1.了解游标的概念和工作原理;
2.了解存储过程的分类和使用方法;
3.了解触发器的概念;
4.学习编写和执行自定义过程;
5.学习编写和执行自定义函数;
6.学习创建和使用触发器。

二、实验准备
1.首先要了解游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。

将游标放置到某行后,即可对该行数据进行操作,最常见的操作是提取当前行数据。

2.使用显式游标的步骤:
(1)说明游标。

(2)打开游标。

(3)读取数据。

(4)关闭游标。

3.了解PL/SQL包括3种存储过程,即过程、函数和程序包。

4.了解触发器是一种特殊的存储过程,当指定表中的数据发生变化时自动运行。

三、实验内容
1.练习书上的例子10.1—10.24。

2.以上机实验经常用到的数据库LIB为例,编写过程P_ResetPrice,此过程的功能是将表图书中指定书号的单价更改为10.0,调用该过程将书号为’TP311.13/CM3’的单价更改为10.0,将程序写在实验报告中。

create or replace procedure P_ResetPrice
(vBno in varchar2)
as
begin
update 图书 set 单价=10.0 where 图书号=vBno;
end;
execute P_ResetPrice(‘TP311.13/CM3’);
3.编写一函数F_GetBName,该函数的功能是在图书中根据指定的书号,返回该书的书名,并在匿名块中调用函数F_GetBName找出编号为“TP311.132/ZG1”的书名,将程序写在实验报告中。

create function F_GetName
(vtno IN 图书.图书号%Type)
return 图书.书名%Type
as
outname 图书.书名%Type;
begin
select 书名 into outname
from 图书
where 图书号=vtno;
return outname;
end;
set ServerOutPut on;
declare
varName 图书.书名%Type;
begin
varName:=F_GetName('TP311.132/ZG1');
dbms_output.put_line(varName);
end;
4.创建一程序包MyPack,包含以上的过程P_ResetPrice和函数F_GetBName,并在匿名块中调用Mypack包中的过程和函数进行测试,将程序写在实验报告中。

CREATE PACKAGE MyPack
IS
PROCEDURE P_ResetPrice
(vBno in varchar2);
FUNCTION F_GetName
(vtno IN 图书.图书号%Type)
return 图书.图书号%Type;
END MyPack;
CREATE PACKAGE BODY MyPack
IS
PROCEDURE P_ResetPrice
(vBno in varchar2)
AS
begin
update 图书 set 单价=10.0 where 图书号=’’||vBno||’’;
end;
function F_GetName
(vtno IN 图书.图书号%Type)
return 图书.图书号%Type
as
outname 图书.图书号%Type;
begin
select 书名 into outname
from 图书
where 图书号=’’||vtno||’’;
return outname;
end;
END MyPack;
SET ServerOutput ON;
declare
varName 图书.图书号%Type;
begin
/* 测试包中的过程*/
MyPack.P_ResetPrice(‘TP311.13/CM3’);
/* 测试包中的函数*/
varName:=MyPack.F_GetName('TP311.132/ZG1');
dbms_output.put_line(varName);
end;
5.编写一数据库触发器,当任何时候读者书表中的某个读者号更新时,该触发器将借阅表中相应的读者号进行级联更新,将程序写在实验报告中。

CREATE OR REPLACE TRIGGER MyTrigger
AFTER UPDATE ON 读者
FOR EACH ROW
BEGIN
UPDATE 借阅 SET 读者号 = :new.读者号
WHERE 读者号 = :old.读者号;
END;
6.编写程序根据常用的Enrollment表中所有记录的分数,给出相应的等级,要求用游标实现,程序运行的结果如下:
学号:20010101,课程号: C1,成绩:90,等级:: 优
学号:20010102,课程号: C1,成绩:88,等级:: 良
学号:20010102,课程号: C2,成绩:94,等级:: 优
学号:20010102,课程号: C3,成绩:54,等级:: 不及格
将程序写在实验报告中。

set serveroutput on;
declare
v_grade number;
v_dj varchar2(20);
v_sno enrollment.sno%TYPE;
v_cno o%TYPE;
cursor mycur is select sno,cno,grade from enrollment;
begin
if mycur%ISOPEN=FALSE then
open mycur;
end if;
LOOP
FETCH mycur into v_sno,v_cno,v_grade;
exit when mycur%NOTFOUND;
case
when v_grade>=90 then
dbms_output.put_line('学号:' || v_sno ||',课程号: '|| v_cno ||',成绩:' || v_grade|| ',等级:' || ': 优');
when v_grade>=80 AND v_grade<90 then
dbms_output.put_line('学号:' || v_sno ||',课程号: '|| v_cno ||',成绩:' || v_grade ||',等级:' || ': 良');
when v_grade>=70 AND v_grade<80 then
dbms_output.put_line('学号:' || v_sno ||',课程号: '|| v_cno ||',成绩:' || v_grade ||',等级:' || ': 中');
when v_grade>=60 AND v_grade<70 then
dbms_output.put_line('学号:' || v_sno ||',课程号: '|| v_cno ||',成绩:' || v_grade ||',等级:' || ': 及格');
else
dbms_output.put_line('学号:' || v_sno ||',课程号: '|| v_cno ||',成绩:' || v_grade|| ',等级:' || ': 不及格');
end case;
end loop;
close mycur;
end;
结果如下所示:
学号:20010101,课程号: C1,成绩:90,等级:: 优
学号:20010102,课程号: C1,成绩:88,等级:: 良
学号:20010102,课程号: C2,成绩:94,等级:: 优
学号:20010102,课程号: C3,成绩:54,等级:: 不及格。

相关文档
最新文档