数据库实验十二--游标与存储过程

数据库实验十二--游标与存储过程
数据库实验十二--游标与存储过程

实验九游标与存储过程

1 实验目的与要求

(1) 掌握游标的定义和使用方法。

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

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

2 实验内容

请完成以下实验内容:

(1)创建游标,逐行显示Customer表的记录,并用WHILE结构来测试@@Fetch_Status 的返回值。输出格式如下:

'客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码' declare @cno char(9),@cname varchar(20),@tele varchar(20),@addr varchar(12),@zi char(7)

declare @text varchar(180)

declare cus_cur scrollcursorfor

select customerNo,customerName,telephone,address,zip

from customer

orderby customerNo

set

@text='===============================customer======================= ====================='

print @text

set @text='客户编号'+' '+'客户名称'+' '+'客户电话'+' '+'客户住址'+' '+'邮政编码'

print @text

open cus_cur

fetch cus_cur into @cno,@cname,@tele,@addr,@zi

while(@@fetch_status=0)

begin

set @text = @cno+' '+@cname+'

'+space(2*(9-len(@cname)))+@tele+' '+@addr+' '+@zi

print @text

fetch cus_cur into @cno,@cname,@tele,@addr,@zi

end

close cus_cur

deallocate cus_cur

(2)利用游标修改OrderMaster表中orderSum的值。

declare @no varchar(12),@sumprice varchar(10)

declare @text varchar(100)

declare cur_ordersum scrollcursorfor

select orderNo,sum(quantity*price)

from orderdetail od

groupby orderNo

open cur_ordersum

fetch cur_ordersum into @no,@sumprice

while(@@fetch_status=0)

begin

update ordermaster

set ordersum = @sumprice

where orderno=@no

fetch cur_ordersum into @no,@sumprice

end

close cur_ordersum

deallocate cur_ordersum

select*

from ordermaster

(3)创建游标,要求:输出所有女业务员的编号、姓名、性别、所属部门、职务、薪水。declare @no varchar(12),@name varchar(4),@sex varchar(2),@dp

varchar(10),@hship varchar(8),@money numeric(7,2)

declare @text varchar(50)

declare cur_employee scrollcursorfor

select employeeno,employeename,sex,department,headship,salary

from employee

where sex='f'

open cur_employee

fetch cur_employee into @no,@name,@sex,@dp,@hship,@money

print'员工编号 '+'姓名 '+'性别'+'所属部门 '+'职务 '+'薪水'

while(@@fetch_status=0)

begin

set@text =@no+' '+@name+space(6-2*len(@name))+@sex+' '+@dp+' '+@hship+' '+convert(char(9),@money)

print @text

fetch cur_employee into @no,@name,@sex,@dp,@hship,@money

end

close cur_employee

deallocate cur_employee

(4)创建存储过程,要求:按表定义中的CHECK约束自动产生员工编号。createprocedure pro_employeeno @name varchar,@sex varchar,@birthday varchar,@address varchar,@telephone varchar,@hiredate

varchar,@department varchar,@headship varchar,@salary varchar

as

declare @y varchar,@countt int,@no varchar

declare cur_employeeno scrollcursorfor

select year(hiredate),count(*)

from employee

groupby year(hiredate)

open cur_employeeno

fetch cur_employeeno into @y,@countt

while(@@fetch_status=0)

begin

if(@y =convert(varchar,year(@hiredate)))

begin

if(@countt<9)

set @no ='E'+@y+'00'+convert(varchar,@countt+1)

elseif(@countt<99)

set @no ='E'+@y+'0'+convert(varchar,@countt+1)

else

set @no ='E'+@y+convert(varchar,@countt+1)

end

fetch cur_employeeno into @y,@countt

end

insert Employee

values(@no,@name,@sex,@birthday,@address,@telephone,@hiredate,@depart ment,@headship,@salary)

close cur_employeeno

deallocate cur_employeeno

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

as

select employeeno,orderno,ordersum

from employee e,ordermaster om

where e.employeename like'李%'

exec pro_employeeLi --结果有两张表?

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

createprocedure pro_employeetop3

as

selecttop 3 temp.employeeno,sum(ordersum)he

from(select employeeno,ordersum

from employee e,ordermaster om

where employeeno=salerno

)temp

groupby temp.employeeno

order by he desc

(7)创建存储过程,要求将大客户(销售数量位于前5名的客户)中热销的前3种商品的销售信息按如下格式输出:

=======大客户中热销的前3种商品的销售信息================

商品编号商品名称总销售数量

P2******* 120GB硬盘 21.00

P2******* 3.5寸软驱 18.00

P2******* 网卡 16.00

createprocedure pro_producttop3

as

declare @no varchar(12),@name varchar(10),@he varchar(10)

declare cur_producttop3 scrollcursorfor

selecttop 3 od.productno 商品编号,productname 商品名称,sum(quantity)总量from ordermaster om,orderdetail od,product p,(selecttop 5 customerno,sum(quantity) he

from orderdetail od,ordermaster om

where od.orderno=om.orderno

groupby customerno

orderby he desc) temp

where om.customerno = temp.customerno

and om.orderno = od.orderno

and p.productno = od.productno

groupby od.productno,productname

orderby总量desc

open cur_producttop3

fetch cur_producttop3 into @no,@name,@he

print'=======大客户中热销的前种商品的销售信息==============='

print' 商品编号 '+'商品名称 '+'商品销售数量'

while(@@fetch_status=0)

begin

print' '+@no+' '+@name+space((16-len(@name)))+@he

fetch cur_producttop3 into @no,@name,@he

end

close cur_producttop3

deallocate cur_producttop3

(8)创建存储过程,要求:输入年度,计算每个业务员的年终奖金。年终奖金=年销售总额×提成率。提成率规则如下:年销售总额5000元以下部分,提成率为10%,对于5000元及超过5000元部分,则提成率为15%。

createprocedure pro_yearmoney @ye varchar(5)

as

declare @no varchar(12),@he varchar(9),@temp float

set @temp = 0

declare cur_yearmoney scrollcursorfor

select salerno,sum(ordersum)

from ordermaster

where year(orderdate)like'2012%'

groupby salerno

open cur_yearmoney

print'员工编号 '+'年终奖'

fetch cur_yearmoney into @no,@he

while(@@fetch_status=0)

begin

if(convert(float,@he)>5000)

begin

print @no+'

'+convert(varchar(10),(convert(float,@he)-5000)*0.15+500)

end

else

begin

print @no+' '+convert(varchar(10),convert(float,@he)*0.1)

end

fetch cur_yearmoney into @no,@he

end

close cur_yearmoney

deallocate cur_yearmoney

exec pro_yearmoney '2012'

(9)创建存储过程,要求将OrderMaster表中每一个订单所对应的明细数据信息按规定格

式输出,格式如图7-1所示。

===================订单及其明细数据信息====================

--------------------------------------------------- 订单编号 200801090001

--------------------------------------------------- 商品编号数量价格

P2******* 5 403.50

P2******* 3 2100.00

P2******* 2 600.00

--------------------------------------------------- 合计订单总金额 3103.50

图7-1 订单及其明细数据信息

declare @ono varchar(12),@pno varchar(12),@q varchar(6),@money

varchar(10),@no varchar(12),@temp float

--创建游标得到数据信息

declare cur_orderdetail scrollcursorfor

select orderno,productno,quantity,quantity*price he

from orderdetail od

--创建游标得到订单编号集

declare cur_orderno scrollcursorfor

select orderno

from orderdetail od

groupby orderno

print'===================订单及其明细数据信息===================='

--先打开订单编号集游标

open cur_orderno

fetch cur_orderno into @no

while(@@fetch_status=0)

begin

--打开数据信息集游标,并且遍历

print'---------------------------------------------------'

print' 订单编号 '+@no

print'---------------------------------------------------'

print'商品编号 '+'销售数量 '+'总额'

set @temp =0

open cur_orderdetail

fetch cur_orderdetail into @ono,@pno,@q,@money

while(@@fetch_status=0)

begin

if(@no = @ono)--满足条件就是同一个订单下的

begin--不加begin和end if的范围就不是预期的了

print @pno+' '+@q+' '+@money

set @temp =@temp+convert(float,@money)

end

fetch cur_orderdetail into @ono,@pno,@q,@money

end

print'---------------------------------------------------'

print'合计订单总额'+convert(varchar(8),@temp)

print''

print''

close cur_orderdetail--此处一定要关掉在打开

fetch cur_orderno into @no

end

close cur_orderno

deallocate cur_orderdetail

deallocate cur_orderno

(10)请使用游标和循环语句创建存储过程proSearchCustomer,根据客户编号查找该客户的名

称、住址、总订单金额以及所有与该客户有关的商品销售信息,并按商品分组输出。输出格

式如图7-2所示。

===================客户订单表====================

---------------------------------------------------

客户名称:统一股份有限公司

客户地址:天津市

总金额: 31121.86

--------------------------------------------------- 商品编号总数量平均价格

P2******* 5 80.70

P2******* 19 521.05

P2******* 5 282.00

P2******* 2 320.00

报表制作人陈辉制作日期 06 8 2012

图7-2 客户订单表

createprocedure proSearchCustomer @_customerno varchar(12)

as

declare @no varchar(12),@cno varchar(12),@he varchar(8),@pno

varchar(12),@q varchar(3),@p varchar(6),@cname varchar(12),@addr

varchar(12)

declare @money varchar(8),@countt varchar(10)

declare cur_customersearch1 scrollcursorfor

select sum(ordersum),customername,address

from ordermaster om,orderdetail od,customer c

where om.orderno = od.orderno

and c.customerno = om.customerno

and c.customerno = @_customerno

groupby c.customerno,customername,address

set @money =0

set @countt = 0

print'===================客户订单表===================='

print'---------------------------------------------------'

open cur_customersearch1

fetch cur_customersearch1 into @he,@cname,@addr

while(@@fetch_status=0)

begin

print'客户名称:'+@cname

print'客户地址:'+@addr

print'总金额:'+@he

fetch cur_customersearch1 into @he,@cname,@addr

end

print'---------------------------------------------------'

close cur_customersearch1

deallocate cur_customersearch1

declare cur_customersaerch2 scrollcursorfor

select od.productno,quantity,convert(varchar,price)--此处需要先转化

from ordermaster om,orderdetail od,customer c

where om.orderno = od.orderno

and c.customerno = om.customerno

and c.customerno = @_customerno

print'商品编号 '+'总数量 '+'平均价格 '

print''

open cur_customersaerch2

fetch cur_customersaerch2 into @pno,@q,@p

while(@@fetch_status=0)

begin

print @pno+' '+@q+'

'+space(3-len(@q))+convert(varchar,convert(float,@p)/convert(float,@q ))

fetch cur_customersaerch2 into @pno,@q,@p

end

close cur_customersaerch2

deallocate cur_customersaerch2

print'---------------------------------------------------'

print'报表制作人郭蚕制作日期:'+convert(char(2),day(getdate()))+'

'+convert(char(2),month(getdate()))+'

'+convert(char(4),year(getdate()))

exec proSearchCustomer 'C20050001'

游标与存储过程

实验5 游标与存储过程 1、实验目的 1. 学习实践游标与存储过程 2. 学习实践PL/SQL编程 2、实验原理 1. PL/SQL编程 2. 游标与存储过程 3、实验器材 1. 安装了Oracle,或者MySQL的计算机 4、实验内容 3. 创建表 Code Name Amt 01服装900 0101男装300 010101西装100 010102休闲装200 0102女装390 010201套装120 010202职业装130 010203休闲装140 0103童装210 02电器290 0201进口140 0202国产150 03日用品300 2.编写Oracle的存储过程,实现层次结构的逐级求和。

3.应用sql*plus,编写PL/SQL调用步骤2编写的存储过程。 五、实验报告要求 请将相应SQL语句写在实验报告上 1、 create table example(code number(10),name varchar2(20),amt number(10)); 2、 insert into example values(01,'服装',900); 3、 insert into example values(0101,'男装',300); 4、 insert into example values(010101,'西装',100); 5、 insert into example values(010102,'休闲装',200); 6、 insert into example values(0102,'女装',390); 7、 insert into example values(010201,'套装',120); 8、 insert into example values(010202,'职业装',130); 9、 insert into example values(010203,'休闲装',140); 10、 insert into example values(0103,'童装',210); 11、 insert into example values(02,'电器',290);、 12、 insert into example values(0201,'进口',140); select * from example; CODE NAME AMT --------- -------------------- ---------- 1 服装 900 101 男装 300 10101 西装 100 10102 休闲装 200 102 女装 390 10201 套装 120 10202 职业装 130 10203 休闲装 140

数据库实验报告六_存储过程

HUNAN UNIVERSITY 数据库 实验报告 学生姓名 学生学号 专业班级 指导老师 2017 年5月24日

SELECT COUNT(*)INTO more90 FROM sc WHERE cno = countcno AND grade >= 90; /*将结果存入新表sumScore中*/ create table sumScore( scorestage char(10), number smallint); insert into sumScore values('x<60', less60); insert into sumScore values('60<=x<70', b60a70); insert into sumScore values('70<=x<80', b70a80); insert into sumScore values('80<=x<90', b80a90); insert into sumScore values('x>=90', more90); END$$ call sumScore(); /*调用上述存储过程*/ 首先创建存储过程,然后再调用存储过程。结果如下: (上述结果图截自Navicat软件) 可以看到,在stuinfo中新建了一个基本表sumscore,表中内容是数学课程成绩的各分数段的人数。 2、统计任意一门课的平均成绩。 代码如下: DELIMITER $$ CREATE PROCEDURE `scoreAvg`() BEGIN declare curname char(40) default null; /*临时存放课程名*/ declare curcno char(4) default null; /*临时存放课程号*/ declare curavg float; /*临时存放平均成绩*/ declare mycursor cursor for /*定义游标*/ select cno, cname from course;

在Sql Server存储过程中使用Cursor(游标)操作记录

1.为何使用游标: 使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问这些记录,按照用户自己的意愿来显示和处理这些记录。 2.如何使用游标: 一般地,使用游标都遵循下列的常规步骤: (1) 声明游标。把游标与T-SQL语句的结果集联系起来。 (2)打开游标。 (3)使用游标操作数据。 (4)关闭游标。 2.1.声明游标 DECLARE CURSOR语句SQL-92标准语法格式: DECLARE游标名[ INSENSITIVE ] [ SCROLL ] CURSOR FOR sql-statement Eg: Declare MycrsrVar Cursor FOR Select * FROM tbMyData 2.2打开游标 OPEN MycrsrVar 当游标被打开时,行指针将指向该游标集第1行之前,如果要读取游标集中的第1行数据,必须移动行指针使其指向第1行。就本例而言,可以使用下列操作读取第1行数据: FETCH FIRST from E1cursor 或FETCH NEXT from E1cursor 2.3 使用游标操作数据 下面的示例用@@FETCH_STATUS控制在一个WHILE循环中的游标活动 DECLARE E1cursor cursor FOR SELECT * FROM c_example OPEN E1cursor FETCH NEXT from E1cursor WHILE @@FETCH_STATUS = 0 BEGIN FETCH NEXT from E1cursor END CLOSE E1cursor DEALLOCATE E1cursor 2.4 关闭游标 使用CLOSE语句关闭游标 CLOSE { { [ GLOBAL ]游标名} |游标变量名} 使用DEALLOCATE语句删除游标,其语法格式如下: DEALLOCATE { { [ GLOBAL ]游标名} | @游标变量名

ex11游标与存储过程答案

实验十一游标与存储过程 (1)创建游标,逐行显示表Customer.的记录,并用WHILE结构来测试@@Fetch_Status的返回值。输出格式如下: '客户编号'+'-----'+'客户名称'+'----'+'客户地址'+'-----'+'客户电话 '+'------'+'客户邮编'+'------' DECLARE cur_cust SCROLL cursor FOR SELECT* FROM customer DECLARE @p_CustId char(5) DECLARE @p_CustName char(20) DECLARE @p_address char(40) DECLARE @p_Tel char(10) DECLARE @p_Zip char(6) DECLARE @p_All char(100) SELECT @p_All='客户编号'+'------'+'客户名称'+'------'+'客户地址 '+'-------------------------------------'+'客户电话'+'-------'+'客户邮 编'+'------' PRINT @p_All OPEN cur_cust FETCH cur_cust into @p_CustId,@p_CustName,@p_address,@p_Tel,@p_Zip WHILE(@@fetch_status<>-1) BEGIN SELECT @p_All=@p_CustId+' '+@p_CustName+@p_address+@p_Tel+' '+@p_Zip print @p_All FETCH cur_cust into @p_CustId,@p_CustName,@p_address,@p_Tel,@p_Zip END PRINT'客户数目: '+CONVERT(char(5),@@CURSOR_ROWS) CLOSE cur_cust DEALLOCATE cur_cust

sql数据库试验九:T-SQL语言存储过程及数据库的安全性

实验九:T-SQL语言、存储过程及数据库的安全性 一、实验目的 1.掌握数据变量的使用; 2.掌握各种控制语句及系统函数的使用; 3.掌握存储过程的实现; 4.掌握混合模式下数据库用户帐号的建立与取消方法; 5.掌握数据库用户权限的设置方法; 6.掌握在企业管理器中进行备份、恢复操作的步骤; 二、实验学时 2学时 三、实验要求 1.了解T-SQL支持的各种基本数据类型及变量的使用; 2.了解T-SQL各种运算符、控制语句及函数的功能及使用方法; 3.掌握存储过程的编写和运行方法 4.熟悉数据库完全备份及恢复的方法; 5.了解SQL Server 2008系统安全; 6.熟悉数据库用户、服务器角色及数据库角色的用法 7.完成实验报告。 四、实验内容 以student数据库为基础数据,完成以下内容 1.变量及函数的使用: 1)创建局部变量@xh(学号)并赋值,然后输出数据表student中所有等于该值的学生的学号、姓名、性别、所属院系及年龄等信息; 2)将学号为200515008的学生的姓名赋值给变量@name; 3)计算学生信息表student中学生最高年龄和最低年龄之差,并将结果付给@cz;4)定义一函数,按系别统计当前所有学生的平均年龄,并调用该函数。 5)定义一函数,通过姓名查询某学生的学号、性别、年龄、系别、选修课程名及成绩。 2.编写并执行存储过程 ,查询以下信息:班级、学号、姓名、pr_StuScore创建一个无参存储过程(1).性别、课程名称、考试成绩。 (2)创建一个带参数的存储过程stu_info,该存储过程根据传入的学生编号在student表中查询此学生的选修课程及成绩信息。 (3)创建一个带参数的存储过程StuScoreInfo2,该存储过程根据传入的学生编号和课程名称查询以下信息:班级、学号、姓名、性别、课程名称、考试成绩。

实验1基本测量仪器的使用

实验1 基本测量仪器的使用 【实验目的】 1.熟悉米尺、游标卡尺、螺旋测微计、测量显微镜的构造、测量原理及使用方法,练习使用分析天平进行精密称衡; 2.学习有效数字和不确定度的计算,掌握误差理论与数据处理方法,熟悉精密称衡中的系统误差补正. 【实验仪器】 米尺、游标卡尺,螺旋测微计,测厚仪,分析天平,球体,圆柱等,金属块、玻璃块、有机被璃块等. 【实验原理】 一、米尺 “米”是国际公认的标准长度单位,历史上由保存在巴黎国际标准度量衡局的米原器二刻线间的长度决定。1983年第十七届国际计量大会通过的“米”的新定义为:1m是光在真空中于1/299792458s的时间内所传播的距离。 常用米尺(包括各种常用直尺)的分度值是1mm毫米,因此用米尺测量长度时可以读准到毫米级,估计到0.1毫米级(1/10毫米位)。 用米尺测量物体长度的要领是紧贴、对准、正视。米尺自身有一定的厚度,若不贴紧待测物,观测者从不同角度看去,将产生读数的差异,测量时应尽量减少视差。为避免端边磨损带来的误差,也可以不用零刻度线,而以某一刻度线(如1.00cm)作为测量起点,考虑到刻度的不均匀,可以不同刻度线为起点作多次测量而取其中平均值。 二、游标卡尺 (1)游标卡尺构造 游标卡尺的构造如图1-4所示,卡钳E和E'同刻有毫米的主尺A相连,游标框W上附有游标B以及卡钳F和F',推动游标框W可使游标B连同卡钳F、F'沿主尺滑动.当两对钳口E与F,E'与F'紧靠时,游标的零点(即零刻度线)与主尺的零点相重合.用游标卡尺测定物体长度时,用卡钳E F或E'F'卡着被测物体,显然此时游标零点与主尺零点间距离恰好等于卡钳E、F间或卡钳E'、F'的距离,所以从游标零点在主尺上的位置,根据游标原理就可测出物体的长度(卡钳E'F'部分是用来测量物体的内部尺寸,如管的内径等).图中螺钉C是用来固定油标框的,防止游标框在主尺上滑动以便于读数.

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

实验十六游标、存储过程和函数 一、目的与要求 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

实验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为输出参数,让主程序能够接收计算结果。

实验九 游标与存储过程

实验九游标与存储过程 1 实验目的与要求 (1) 掌握游标的定义和使用方法。 (2) 掌握存储过程的定义、执行和调用方法。 (3) 掌握游标和存储过程的综合应用方法。 2 实验内容 请完成以下实验内容: (1)创建游标,逐行显示Customer表的记录,并用WHILE结构来测试 @@Fetch_Status的返回值。输出格式如下: declare @C_no char(9),@C_name char(18),@C_phone char(10), @C_addchar(8),@C_zip char(6) declare @text char(100) declarecus_cur scroll cursor for select* from Customer select @text='=========================Customer 表的记录 =========================' print @text select @text='客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码' print @text select @text='============================================================ ============================' print @text opencus_cur fetchcus_cur into @C_no,@C_name,@C_phone,@C_add,@C_zip while(@@fetch_status=0) begin select @text=@cust_No+' '+@cust_name+' '+@addr+' '+@tel_no+' '+@zip print @text fetchcus_cur into @C_no,@C_name,@C_phone,@C_add,@C_zip end closecus_cur deallocatecus_cur '客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码'

数据库函数、存储过程实验报告

南京信息工程大学数据库系统实验(实习)报告实验(实习)名称数据库系统实验4 实验(实习)日期2016-6-7 得分指导教师顾韵华 系计软院专业计科年级2014级班次计科 3 班姓名仇彤学号20141308071 一、实验目 1、掌握T-SQL函数及其调用方法。 2、掌握存储过程的定义及执行方法。 3、掌握有参存储过程的定义及执行方法。 4、掌握C#访问数据库的方法。 二、实验内容 1、使用系统函数(DA TEDIFF(d,date_expr1,date_expr2)),计算今天距离“2020-1-1”还剩多少天。(P299"思考与练习") 2、编写T-SQL程序,利用系统转换函数,检索总订购商品数在10~19的客户姓名。 3、定义函数RectArea,计算一个长方形的面积(长、宽作为函数的参数)。 4、在SPDG数据库中定义函数,根据商品编号,查询该商品的名称;(函数名为QryGoods)。 5、在SPDG数据库中定义存储过程GetSPBH,返回所有商品编号,并使用EXEC语句执行存储过程。 6、在SPDG数据库中定义存储过程KH_NJ_Qry,返回江苏南京的客户编号、姓名、及其订购商品的编号、商品名称和数量,并使用EXEC语句执行存储过程。 7、在SPDG数据库中定义存储过程SP_FOOD_Qry,返回食品类商品编号、商品名称及其订购客户编号、姓名、订购数量,并使用EXEC语句执行存储过程。 8、定义存储过程SP_Total,查询指定商品编号的总订购数。并执行该存储过程。 9、定义存储过程SP_TotalCost,查询指定商品编号的总订购金额。并执行该存储过程。 10、定义存储过程SP_Name_Qry,查询指定商品名称的商品信息。并执行该存储过程。 11、定义存储过程SP_Name_Qry1,查询指定商品名称的商品信息;若存在,输出1;否则,输出0。并执行该存储过程。 12、定义存储过程SP_Name_Qry2,查询指定商品名称的商品信息;若存在,用输出参数传出1;否则传出0。 三、实验过程与结果 1、使用系统函数(DATEDIFF(d,date_expr1,date_expr2)),计算今天距离“2020-1-1”还剩多少天。(P299"思考与练习") 设计的SQL语句如下: print datediff(d,getdate(),'2020-1-1') 执行结果:

实验七 存储过程及应用完整版含截图

实验七存储过程及应用 1.实验目的 1、理解存储过程的概念。 2、掌握存储过程的使用方法。 2.实验要求 1.建立如下的存储过程(基于前面实验建立的表和插入的数据,并为每个存储过程设计返回的状态值): (1)按要求设计完成如下功能的存储过程。 ①查询平均分数在x到y范围内的学生信息。 说明: 该存储过程有两个参数; 要求查询的学生信息包括学号、姓名、院系名称和平均分数。 ②更新操作,以学号、课程编号和考试成绩作参数更新指定学生和课程的考试成绩,并返回该学生的平均成绩。 (2)自行再分别设计一个完成查询和完成操作功能的存储过程(在实验报告中要准确描述功能需求)。 (3)在客户端以存储过程和输入SQL语句的方式分别执行相同的查询或操作,比较使用和不使用存储过程的区别。 3、实验过程 (1)①查询平均分数在x到y范围内的学生信息 create procedure cc711@x smallint,@y smallint as select学生.学号,学生.姓名,院系.名称,学生.平均成绩 from学生join院系on学生.院系=院系.编号 where学生.平均成绩between@x and@y EXECUTE cc71160,90

②更新操作,以学号、课程编号和考试成绩作参数更新指定学生和课程的考试成绩,并返回该学生的平均成绩 create procedure mcc712@xh nchar(8),@kcbh nchar(8),@cj int as update选课set成绩=@cj where学号=@xh and课程编号=@kcbh declare@pjcj int select@pjcj=AVG(成绩)from选课where学号=@xh return@pjcj declare@avg int execute@avg=mcc7122,5,98 print'更新后平均成绩:'+str(@avg,6)

SQL游标嵌套存储过程

--测试数据 create table tmp1 ( ID int not null, val varchar(10), constraint PK_tmp1 primary key (ID) ); create table tmp2 ( ID int not null, vals varchar(100), constraint PK_tmp2 primary key (ID) ); insert into tmp1(id, val) values (1, 'test'); insert into tmp1(id, val) values (2, 'test2'); insert into tmp1(id, val) values (3, 'test3'); insert into tmp1(id, val) values (4, 'test4'); insert into tmp1(id, val) values (5, 'test5'); insert into tmp2(id, vals) values (1, '1,2'); insert into tmp2(id, vals) values (2, '1,3'); insert into tmp2(id, vals) values (3, '2,5'); insert into tmp2(id, vals) values (4, '1,2,3,4,5'); --存储过程 drop procedure proc_tmp_1 go CREATE PROCEDURE proc_tmp_1 AS begin declare @vals varchar(500) declare @id int declare @vals2 varchar(1000) declare @command varchar(1000) declare @vals3 varchar(1000) declare @cmd varchar(1000) declare cursor_tmp_1 cursor for SELECT id, vals FROM tmp2 open cursor_tmp_1 fetch next from cursor_tmp_1 into @id, @vals while @@fetch_status = 0 begin set @vals3 = '' set@cmd = 'declare cursor_tmp_2 cursor for select val from tmp1 where id in (' + @vals + ')' EXEC (@cmd) open cursor_tmp_2 fetch next from cursor_tmp_2 into @vals2 while @@fetch_status = 0 begin if (@vals3 <> '') begin set @vals3 = @vals3 + ',' end SET @vals3 = @vals3 + @vals2

数据库实验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。

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

存储过程与触发器实验日期和时间: 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.管理员信息表。作用:记录负责管理书库和借书还书工作的管理员信息。至少包 括:管理员编号、职工编号(在职工档案表中的职工编号)、用户名、密码、管理

sql server存储过程详细代码(超赞!)

use jxgl --首先判断有没有已经建立up_getallstudents存储过程,有则先删除 if exists (select name from sysobjects where name='up_getallstudents'and type ='p') drop procedure up_getallstudents --编写存储过程up_getallstudents,用于获取学生表students的所有记录 create procedure up_getallstudents as select*from students --使用execute执行存储过程up_getallstudents exec up_getallstudents --也可写成 execute up_getallstudents --编写一个存储过程up_insertstudent,完成学生表students数据的插入 --1、不带默认值的参数 create procedure up_insertstudent @sid varchar(15),@sname varchar(30),@ssex char(10), @sbirth datetime,@sbirthplace varchar(300) as begin insert into students (stu_id,stu_name,stu_sex,stu_birth,stu_birthplace) values (@sid,@sname,@ssex,@sbirth,@sbirthplace) end exec up_insertstudent'200712110111','肖玉峰','男','1975-02-05','山东省滕州市木石镇' --等同于 exec up_insertstudent @sname='肖玉峰',@sid='200712110111',@ssex='男',@sbirth= '1975-02-05',@sbirthplace='山东省滕州市木石镇' drop procedure up_insertstudent delete students where stu_name='肖玉峰'

存储过程和游标

我们在进行pl/sql编程时打交道最多的就是存储过程了。存储过程的结构是非常的简单的,我们在这里除了学习存储过程的基本结构外,还会学习编写存储过程时相关的一些实用的知识。如:游标的处理,异常的处理,集合的选择等等 1.存储过程结构 1.1 第一个存储过程 Java代码 1.create or replace procedure proc1( 2. p_para1 varchar2, 3. p_para2 out varchar2, 4. p_para3 in out varchar2 5.)as 6. v_name varchar2(20); 7.begin 8. v_name := '三丰'; 9. p_para3 := v_name; 10. dbms_output.put_line('p_para3:'||p_para3); 11.end; 上面就是一个最简单的存储过程。一个存储过程大体分为这么几个部分: 创建语句:create or replace procedure 存储过程名 如果没有or replace语句,则仅仅是新建一个存储过程。如果系统存在该存储过程,则会报错。Create or replace procedure 如果系统中没有此存储过程就新建一个,如果系统中有此存储过程则把原来删除掉,重新创建一个存储过程。 存储过程名定义:包括存储过程名和参数列表。参数名和参数类型。参数名不能重复,参数传递方式:IN, OUT, IN OUT IN 表示输入参数,按值传递方式。 OUT 表示输出参数,可以理解为按引用传递方式。可以作为存储过程的输出结果,供外部调用者使用。 IN OUT 即可作输入参数,也可作输出参数。 参数的数据类型只需要指明类型名即可,不需要指定宽度。 参数的宽度由外部调用者决定。 过程可以有参数,也可以没有参数 变量声明块:紧跟着的as (is )关键字,可以理解为pl/sql的declare关键字,用于声明变量。 变量声明块用于声明该存储过程需要用到的变量,它的作用域为该存储过程。另外这里声明的变量必须指定宽度。遵循PL/SQL的变量声明规。 过程语句块:从begin 关键字开始为过程的语句块。存储过程的具体逻辑在这里来实现。 异常处理块:关键字为exception ,为处理语句产生的异常。该部分为可选 结束块:由end关键字结果。 1.2 存储过程的参数传递方式 存储过程的参数传递有三种方式:IN,OUT,IN OUT . IN 按值传递,并且它不允许在存储过程中被重新赋值。如果存储过程的参数没有指定存参数传递类型,默认为IN

实验七创建和操作数据库对象

实验报告 课程:数据库原理与实用技术实验 实验7 创建和操作数据库对象 实验7-1 存储过程 1、使用不带参数的存储过程 (1)创建一个存储过程my_proc,查询“学生表”中所有计算机系女生的学号、姓名、性别、年龄和所在院系 create proc my_proc as select学号,姓名,性别,年龄,所在院系from学生表 where所在院系='计算机'and性别='女' (2)执行存储过程 (3)修改存储过程,使其能够查询计算机系女生的所有基本信息 alter proc my_proc as select*from学生表 where所在院系='计算机'and性别='女' 2、带输入参数的存储过程 (1)创建一个存储过程my_procsex,使其能够查询“学生表”中男学生或女学生的学号、姓名、性别、年龄和所在院系 create proc my_procsex @sex char(2) as select学号,姓名,性别,年龄,所在院系from学生表where性别=@sex (2)执行存储过程 exec my_procsex @sex='男' 3、带输入/输出参数的存储过程 (1)创建一个存储过程my_procage,使其能够根据学生姓名,查询学生年龄。(考虑当学生不存在时给出提示信息) create proc my_procage @name char(10),@age int OUTPUT as if not exists(select*from学生表where姓名=@name) return-155 select年龄from学生表where姓名=@name (2)执行存储过程 declare @once_age int, @status int exec @status=my_procage @name='陈忠刚', @age=@once_age output if @status=-155 print'对不起,您输入的名字查找失败!' print'the output data is:'+convert(varchar(10),@once_age)

实验6 游标的应用(完整版)

数据库实验六游标 实验要求: (1)参照例7-3建立一个嵌套游标应用,其功能是按学号升序列出全体学生信息(学号、姓名、院系名称)及其所修课程名称和考试成绩信息(基于实验2建立的表和实验3插入的数据) (2)按要求按要求逐一读出游标中的记录并显示。 实验代码: declare@xh nchar(8),@xm nchar(10),@yx nchar(10) declare@kcmc nchar(8),@cj nchar(10) declare嵌套游标1cursor for select学生.学号,学生.姓名,学生.院系from学生order by学号 open嵌套游标1 print'----学生信息----' print'学号姓名院系' fetch from嵌套游标1into@xh,@xm,@yx while@@FETCH_STATUS=0 begin print@xh++@xm++@yx declare嵌套游标2cursor for select课程.课程名称,选课.成绩from选课join课程 on课程.课程编号=选课.课程编号 where选课.学号=@xh open嵌套游标2 print'课程名称成绩' fetch from嵌套游标2into@kcmc,@cj while@@FETCH_STATUS=0 begin print@kcmc+@cj fetch from嵌套游标2into@kcmc,@cj end close嵌套游标2 deallocate嵌套游标2 fetch from嵌套游标1into@xh,@xm,@yx end close嵌套游标1 deallocate嵌套游标1

Oracle存储过程学习_游标CURSOR使用

游标CURSOR的使用学习 游标的类型: 1,隐式游标:在 PL/SQL 程序中执行DML SQL 语句时自动创建隐 式游标,名字固定叫sql。 2,显式游标:显式游标用于处理返回多行的查询。 3,REF 游标:REF 游标用于处理运行时才能确定的动态 SQL 查询 的结果 一、隐式游标 在PL/SQL中使用DML语句时自动创建隐式游标 q隐式游标自动声明、打开和关闭,其名为 SQL q通过检查隐式游标的属性可以获得最近执行的DML 语句的信息q隐式游标的属性有: q%FOUND – SQL 语句影响了一行或多行时为 TRUE q%NOTFOUND – SQL 语句没有影响任何行时为TRUE q%ROWCOUNT – SQL 语句影响的行数 q%ISOPEN - 游标是否打开,始终为FALSE begin update student s set s.sage = s.sage + 10; if sql %FOUND then dbms_output.put_line('这次更新了' || sql% rowcount); else dbms_output.put_line('一行也没有更新'); end if; end; 在select中有两个中比较常见的异常: 1. NO_DATA_FOUND 2. TOO_MANY_ROWS declare sname1 student.sname%TYPE; begin

select sname into sname1 from student; if sql%found then dbms_output.put_line(sql%rowcount); else dbms_output.put_line('没有找到数据'); end if; exception when too_many_rows then dbms_output.put_line('查找的行记录多于1行'); when no_data_found then dbms_output.put_line('未找到匹配的行'); end; 显式游标: sqlserver与oracle的不同之处在于:最后sqlserver会deallocate 丢弃游标,而oracle只有前面四步:声明游标、打开游标、使用游标读取记录、关闭

实验2 数据库的创建和管理

实验2 数据库的创建和管理 学号: 2011193158 姓名:韩江玲 一、实验目的: 1、掌握使用企业管理器创建SQL Server数据库的方法; 2、掌握使用T-SQL语言创建SQL Server数据库的方法; 3、掌握附加和分离数据库的方法; 4、掌握使用企业管理器或存储过程查看SQL数据库属性的方法; 5、熟悉数据库的收缩、更名和删除; 6、掌握使用企业管理器或sp_dboption存储过程修改数据库选项的方法。 二、实验内容和步骤: 本次实验所创建数据库(包括数据库文件和事务日志)存放位置都为“D:\TestDB”。因此首先在D盘下新建文件夹TestDB。 1. 数据库的创建 创建数据库的过程实际上就是为数据库设计名称、设计所占用的存储空间和文件存放位置的过程。 实验内容1:使用SQL Server企业管理器创建一个数据库,具体要求如下: 1)数据库名称为Test1。 2)主要数据文件:逻辑文件名为Test1_Data1,物理文件名为Test1_Data1.mdf,初始容量为1MB,最大容量为10MB,递增量为1MB。 3)次要数据文件:逻辑文件名为Test1_Data2,物理文件名为Test1_Data2.ndf,初始容量为1MB,最大容量为10MB,递增量为1MB。 4)事务日志文件:逻辑文件名为Test1_Log,物理文件名为Test1_Log.ldf,初始容量为1MB,大容量为5MB,递增量为1MB。其他选项为默认值。

注:我在创建数据库的时候,系统要求主文件(Test1_data1和Test1_data2)的大小不能小于3MB,所以在本例中我设置的主文件的初始大小均为3MB 实验内容2:用Transact-SQL(T-SQL)语句创建数据库,实验步骤:启动“查询分析器”,在编辑窗口输入SQL语句。 用T-SQL语句创建一个名为teach的数据库,它由5MB的主数据文件、2MB 的次数据文件和1MB的日志文件组成。并且主数据文件以2MB的增长速度增长,其最大容量为15MB;次数据文件以10%的增长速度增长,其最大容量为10MB;事务日志文件以1MB增长速度增长,其最大日志文件大小为10MB。运行完语句后,仔细查看结果框中的消息。 提示:在查询分析器中输入如下SQL语句。 CREATE DATABASE teach On (name= teach_data1, filename= 'd:\TestDB\teach_data1.mdf ', size=5,

相关文档
最新文档