实验游标和存储过程

实验游标和存储过程
实验游标和存储过程

实验九游标与存储过程

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.00

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

P2******* 网卡 16.00

(8) 创建存储过程,要求:输入年度,计算每个业务员的年终奖金。年终奖金=年销售

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

元及超过5000元部分,则提成率为15%。

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

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

===================订单及其明细数据信息==================== --------------------------------------------------- 订单编号 200801090001

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

P2******* 5 403.50 P2******* 3 2100.00 P2******* 2 600.00 --------------------------------------------------- 合计订单总金额 3103.50

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

(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 客户订单表

实验脚本:

/*(1) 创建游标,逐行显示Customer表的记录,并用WHILE结构来测试@@Fetch_Status的返

回值。

输出格式如下:

'客户编号'+'-----'+'客户名称'+'----'+'客户电话'+'-----'+'客户住址'+'------'+'邮

政编码'*/

declare @C_no char(9),@C_name char(18),@C_phone char(10),

@C_add char(8),@C_zip char(6)

declare @text char(100)

declare cus_cur scroll cursor for

select*

from Customer62

select@text='================================Customer62表的记录

===================='

print @text

select@text='客户编号'+'------'+'客户名称'+'-----------'+'客户电话

'+'-------'+'客户住址'+'------'+'邮政编码'

print @text

select

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

print @text

open cus_cur

fetch cus_cur into @C_no,@C_name,@C_phone,@C_add,@C_zip

while(@@fetch_status=0)

begin

select@text=@C_no+' '+@C_name+' '+@C_phone+' '+@C_add+' '+@C_zip

print @text

fetch cus_cur into @C_no,@C_name,@C_phone,@C_add,@C_zip

end

close cus_cur

deallocate cus_cur

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

declare @orderNo varchar(20),@total numeric(9,2)

declare om_cur cursor for

select orderNo,sum(quantity*price)

from OrderDetail62

group by orderNo

open om_cur

fetch om_cur into @orderNo,@total

while(@@fetch_status=0)

begin

update OrderMaster62

set orderSum=@total

where orderNo=@orderNo

fetch om_cur into @orderNo,@total

end

close om_cur

deallocate om_cur

/*(3) 创建游标,要求:输出所有女业务员的编号、姓名、性别、所属部门、职务、薪水*/ declare @emNo varchar(8),@emNa char(8),@emse char(1),@emde varchar(10), @emhe varchar(8),@emsa numeric(8,2)

declare @text char(100)

declare em_cur scroll cursor for

select employeeNo,employeeName,sex,department,headShip,salary

from Employee62

where sex='M'

select @text='====================================================='

print @text

select @text='编号姓名性别所属部门职务薪水'

print @text

select @text='====================================================='

print @text

open em_cur

fetch em_cur into @emNo,@emNa,@emse,@emde,@emhe,@emsa

while(@@fetch_status=0)

begin

select @text=@emNo+' '+@emNa+' '+@emse+' '+@emde+' '+@emhe +' '+convert(char(10),@emsa)

print @text

fetch em_cur into @emNo,@emNa,@emse,@emde,@emhe,@emsa

end

close em_cur

deallocate em_cur

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

create table Rnum(

number char(8)null,

ename char(10)null

)--先创建一张新表用来存储已经产生的员工编号

create procedure no_tot(@name nvarchar(50))

as

begin

declare @i int,@text char(100)

set @i=1

while(@i<1000)

begin

if exists(select number

from Rnum

where

number=('E'+convert(char(4),year(getdate()))+right('00'+convert(varchar(3),@i), 3)))

begin

set @i=@i+1

continue

end

else

begin

insert Rnum

values(('E'+convert(char(4),year(getdate()))+right('00'+convert(varchar(3),@i), 3)),@name)

select @text='员工编号'+' '+'员工姓名'

print @text

select

@text=('E'+convert(char(4),year(getdate()))+right('00'+convert(varchar(3),@i),3 ))+' '+@name

--这里的两个数字'3' 就是我们要设置的id长度

print @text

break

end

end

end

/*执行过程*/

exec no_tot 张三

/*(5) 创建存储过程,要求:查找姓“李”的职员的员工编号、订单编号、订单金额*/ create procedure emli_tot @emNo char(8)

as

select a.employeeNo 员工编号,b.orderNo 订单编号,b.orderSum 订单金额

from Employee62 a,OrderMaster62 b

where a.employeeNo=b.salerNo and a.employeeName like'@emNo'

/*执行过程*/

exec emli_tot '李%'

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

create procedure saler_tot

as

select top 3 salerNo 业务员编号,sum(orderSum)总销售业绩

from OrderMaster62

group by salerNo

order by sum(orderSum)desc

/*执行过程*/

exec saler_tot

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

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

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

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

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

P2******* 网卡 16.00*/

create procedure product_tot

as

declare @proNo char(10),@proNa char(20),@total int

declare @text char(100)

declare sale_cur scroll cursor for

select top 3 a.productNo,a.productName,sum(c.quantity)

from Product62 a,OrderMaster62 b,OrderDetail62 c

where a.productNo=c.productNo and b.orderNo=c.orderNo and

b.customerNo in(select top 5 m.customerNo

from OrderMaster62 m,OrderDetail62 n

where m.orderNo=n.orderNo

group by m.customerNo

order by sum(quantity)desc)

group by a.productNo,a.productName

order by sum(c.quantity)desc

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

print @text

select @text='商品编号商品名称总销售数量'

print @text

open sale_cur

fetch sale_cur into @proNo,@proNa,@total

while(@@fetch_status=0)

begin

select @text=@proNo+' '+@proNa+' '+convert(char(10),@total)

print @text

fetch sale_cur into @proNo,@proNa,@total

end

close sale_cur

deallocate sale_cur

/*执行过程*/

exec product_tot

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

create procedure pride_tot @date int

as

declare @saleNo char(15),@total numeric(9,2)

declare @text char(100),@money numeric(8,2)

declare pride_cur scroll cursor for

select salerNo,sum(orderSum)

from OrderMaster62

where year(orderDate)=@date

group by salerNo

select @text='=========业务员的年终奖金========='

print @text

select @text='业务员编号年终奖金'

print @text

open pride_cur

fetch pride_cur into @saleNo,@total

while(@@fetch_status=0)

begin

if(@total<5000)

select @money=@total*0.1

else

select @money=500+(@total-5000)*0.15

select @text=@saleNo+' '+convert(char(10),@money)

print @text

fetch pride_cur into @saleNo,@total

end

close pride_cur

deallocate pride_cur

/*执行过程*/

exec pride_tot 2012

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

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

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

订单编号 200801090001

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

商品编号数量价格

P2******* 5 403.50

P2******* 3 2100.00

P2******* 2 600.00

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

合计订单总金额 3103.50

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

create procedure orderm_tot @orderno char(15)

as

declare @prono char(15),@quantity int,@price numeric(9,2)

declare @text char(100)

declare orderm_cur scroll cursor for

select productNo,sum(quantity),sum(quantity*price)

from OrderDetail62

where orderNo=@orderno

group by productNo

select @text='=============订单及其明细数据信息================'

print @text

select @text='-------------------------------------------------'

print @text

select @text='订单编号'+@orderno

print @text

select @text='-------------------------------------------------'

print @text

select @text='商品编号数量价格'

print @text

open orderm_cur

fetch orderm_cur into @prono,@quantity,@price

while(@@fetch_status=0)

begin

select @text=@prono+' '+convert(char(5),@quantity)+'

'

+convert(char(10),@price)

print @text

fetch orderm_cur into @prono,@quantity,@price

end

select @text='-------------------------------------------------'

print @text

close orderm_cur

deallocate orderm_cur

declare @sum numeric(9,2)

declare orm_cur scroll cursor for

select orderSum

from OrderMaster62

where orderNo=@orderno

open orm_cur

fetch orm_cur into @sum

while(@@fetch_status=0)

begin

select @text='合计订单总金额'+' '+convert(char(12),@sum)

print @text

fetch orm_cur into @sum

end

close orm_cur

deallocate orm_cur

/*执行过程*/

exec orderm_tot 200801090001

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

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

出格式如图-2所示。

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

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

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

客户地址:天津市

总金额: 31121.86

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

商品编号总数量平均价格

P2******* 5 80.70

P2******* 19 521.05

P2******* 5 282.00

P2******* 2 320.00

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

create procedure proSearchCustomer (@cusno char(10))

as

declare @cusname char(40),@address char(20),@total numeric(9,2)

declare @text char(100)

declare sear_cur scroll cursor for

select a.customerName,a.address,sum(b.orderSum)

from Customer62 a,OrderMaster62 b

where a.customerNo=b.customerNo and a.customerNo=@cusno

group by a.customerName,a.address

select @text='===================客户订单表===================='

print @text

select @text='-------------------------------------------------'

print @text

open sear_cur

fetch sear_cur into @cusname,@address,@total

while(@@fetch_status=0)

begin

select @text='客户名称:'+' '+@cusname

print @text

select @text='客户地址:'+' '+@address

print @text

select @text='总金额: '+' '+convert(char(12),@total)

print @text

fetch sear_cur into @cusname,@address,@total

end

select @text='-------------------------------------------------'

close sear_cur

deallocate sear_cur

declare @productno char(10),@num int,@avg numeric(9,2)

declare searpro_cur scroll cursor for

select productNo,sum(quantity),avg(price)

from OrderMaster62 a,OrderDetail62 b

where a.orderNo=b.orderNo and a.customerNo='C20050001'

group by productNo

select @text='商品编号总数量平均价格'

print @text

open searpro_cur

fetch searpro_cur into @productno,@num,@avg

while(@@fetch_status=0)

begin

select @text=@productno+' '+convert(char(8),@num)+' '

+convert(char(12),@avg)

print @text

fetch searpro_cur into @productno,@num,@avg end

select @text='报表制作人杨学森制作日期 2012-12-1' print @text

close searpro_cur

deallocate searpro_cur

/*执行过程*/

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

在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

实验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

oracle_存储过程练习题

1.创建用户kaifa(密码亦为kaifa),并分配connect,create table,resource权限。 CREATE user KAIFA IDENTIFIED BY KAIFA DEFAULT TABLESPACE HOSDATA TEMPOARY TABLESPACE TEMPDA TA; GRANT CONNECT , CREATE TABLE , RESOURCE TO KAIFA 2.在做报表统计时,需要根据报表日期和币种从概要表中查询本期余额。 概要表(CCB_GYB)信息如下: ACCOUNTING_DATE DATE 报表日期(唯一索引) RMB_YTD_BALANCE NUMBER 人民币余额 CNY_YTD_BALANCE NUMBER 本位币余额 USD_YTD_BALANCE NUMBER 外币折美元余额 其中币种代码如下: --RMB 人民币 --CNY 本位币 --USD 外币折美元 如果币种为RMB,则取出人民币余额作为本期余额;为CNY,则取本位币余额;为USD 则取外币折美元余额。 请编写一个函数GetCurrBal( qrp_rq IN VARCHAR2, --报表日期 qrp_code IN VARCHAR2--币种 ) CREATE OR REPLACE FUNCTION GetCurrBal( Vqrp_rq Date , --报表日期 Vqrp_code VARCHAR2--币种 ) RETURN NUMBER IS VAMOUNT NUMBER ; VDATE Date; BEGIN SELECT ACCOUNTING_DATE INTO VDATE FROM CCB_GYB Where ACCOUNTING_DATE = Vqrp_rq; IF Vqrp_code = 'RMB'THEN SELECT RMB_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'RMB' AND ACCOUNTING_DATE= VDATE; ELSE IF Vqrp_code = 'CNY'THEN SELECT CNY_YTD_BALANCE INTO VAMOUNT FROM CCB_GYB WHERE Vqrp_code= 'CNY';

实验九 游标与存储过程

实验九游标与存储过程 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 '客户编号'+'-----'+'客户名称'+'----'+'客户住址'+'-----'+'客户电话'+'------'+'邮政编码'

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

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='肖玉峰'

Oracle经典练习题(很全面)讲解学习

O r a c l e经典练习题 (很全面)

Oracle 经典练习题 一.创建一个简单的PL/SQL程序块 1.编写一个程序块,从emp表中显示名为“SMITH”的雇员的薪水和职位。 declare v_emp emp%rowtype; begin select * into v_emp from emp where ename='SMITH'; dbms_output.put_line('员工的工作是:'||v_emp.job||' ;他的薪水是: '||v_emp.sal); end; 2.编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置。 方法一:(传统方法) declare pname dept.dname%type; ploc dept.loc%type; pdeptno dept.deptno%type; begin pdeptno:=&请输入部门编号; select dname,loc into pname,ploc from dept where deptno=pdeptno; dbms_output.put_line('部门名称: '||pname||'所在位 置:'||ploc); exception –异常处理 when no_data_found then dbms_output.put_line('你输入的部门编号有误!!'); when others then dbms_output.put_line('其他异常'); end; 方法二:(使用%rowtype)

declare erow dept%rowtype; begin select * into erow from dept where deptno=&请输入部门编号; dbms_output.put_line(erow.dname||'--'||erow.loc); exception when no_data_found then dbms_output.put_line('你输入的部门号有误!!!'); when others then dbms_output.put_line('其他异常'); end; 3.编写一个程序块,利用%type属性,接受一个雇员号,从emp表中显示该雇 员的整体薪水(即,薪水加佣金)。 declare pempno emp.empno%type; totalSal emp.sal%type; begin pempno:=&请输入员工编号; select sal+nvl(comm,0) into totalSal from emp where empno=pempno; dbms_output.put_line('该员工总共薪水'||totalSal); exception when no_data_found then dbms_output.put_line('你输入的员工编号有误!!'); when others then dbms_output.put_line('其他异常'); end; 4.编写一个程序块,利用%rowtype属性,接受一个雇员号,从emp表中显示 该雇员的整体薪水(即,薪水加佣金)。 declare erow emp%rowtype; begin select * into erow from emp where empno=&请输入员工编号;

存储过程和游标

我们在进行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

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只有前面四步:声明游标、打开游标、使用游标读取记录、关闭

第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

存储过程与游标练习

创建三个表:学生(学号,姓名)、课程(课程号,课程名)、成绩(学号、课程号、分数),然后在三个表中分别添加记录。按照输入的课程名称打印此门课程的成绩报表(如不给定课程名称则打印SQL课程的成绩),输出结果按照分数降序排列: 例如: 《SQL》成绩表 **************************************************** 名次学号姓名成绩 1 0508044126 李军95 2 0508044124 李明85 3 0508044125 王刚75 **************************************************** */ use pubs IF EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '学生') DROP table 学生 GO IF EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '课程') DROP table 课程 GO IF EXISTS (SELECT NAME FROM sysobjects WHERE NAME = '成绩') DROP table 成绩 GO create table 学生(学号char(10) primary key constraint xh_chk check (学号like '0508044[1-4][0-3][0-9]'),姓名nvarchar(10) not null) create table 课程(课程号char(6) primary key,课程名称nvarchar(40)) create table 成绩(学号char(10) not null,课程号char(6) not null,分数numeric(4,1)) insert 学生values('0508044124','李明') insert 学生values('0508044125','王刚') insert 学生values('0508044126','李军') insert 课程values('080101','SQL') insert 课程values('080204','D S') insert 成绩values('0508044124','080101',85) insert 成绩values('0508044124','080204',95) insert 成绩values('0508044125','080101',75) insert 成绩values('0508044125','080204',86) insert 成绩values('0508044126','080101',95) go if exists(select * from sysobjects where name='cj_proc' and xtype='p') drop proc cj_proc

数据库编程技术——游标、存储过程与触发器

实验八数据库编程技术—游标、存储过程与触发器 一、实验目的 1.掌握游标的定义和使用方法 2.掌握存储过程的定义、执行和调用方法 3.掌握游标和存储过程的综合应用方法。 4.掌握触发器的创建和使用方法。 5.掌握游标和触发器的综合应用方法。 二、实验环境(实验的软件、硬件环境) 硬件:PC机软件:SQL2000 三、实验指导说明 请复习第八章数据库编程的相关知识,完成如下的实验内容。 四、实验内容 (1)利用游标查找所有女业务员的基本情况 (2)创建一游标,逐行显示表customer的记录,要求按 ‘客户编号’+‘-------’+‘客户名称’+‘-------’+‘客户地址’+‘-------------------’+‘客户电话’+‘----------’+‘客户邮编’+‘--------’格式输出,并且用while 结构来测试游标的函数@@Fetch_Status的返回值。 (3)利用游标修改orderMaster表中的Ordersum的值 (4)利用游标显示出orderMaster表中每一个订单所对应的明细数据信息。 (5)利用存储过程,给Employee表添加一条业务部门员工的信息。 (6)利用存储过程输出所有客户姓名、客户订购金额及其相应业务员的姓名 (7)利用存储过程查找某员工的员工编号、订单编号、销售金额。 (8)利用存储过程查找姓“李”并且职称为“职员”的员工的员工编号、订单编号、销售金额

(9)请使用游标和循环语句编写一个存储过程proSearchCustomer,根据客户编号,查询该客户的名称、地址以及所有与该客户有关的销售记录,销售记录按商品分组输出。 (10)设置一个触发器,该触发器仅允许dbo用户可以删除Employee表内数据,否则出错。 (11)在OrderMaster表中创建触发器,插入数据时要先检查Employee表中是否存在和Employee表同样值的业务员编号,如果不存在则不允许插入。 (12)级联更新:当更新customer表中的customerNo列的值时,同时更新OrderMaster表中的customerNo列的值,并且一次只能更新一行。 (13)对product表写一个UPDATE触发器。 五、实验步骤 请完成实验内容,并写出具体的实验步骤 六、思考题: 1.存储过程和触发器,函数的区别? 七、总结(实验过程的体会、心得和实验教与学之间还需改进的内容)

实验9-T-SQL、游标、存储过程、并发控制

XX实验报告 学号 : 系别专业班级姓名 课程名称课程 类型 学时数 实验 名称 T-SQL、游标、存储过程、并发控制 实验目的: 1、了解并能简单应用T-SQL语言。 2、理解并简单的使用游标。 实验内容: 一、了解并应用T-SQL编程语言 (1)用下面的脚本创建一个表并利用循环向表中添加26条记录: USE AdventureWorks CREATE TABLE MYTB(ID INT,VAL CHAR(1)) GO DECLARE @COUNTER INT; SET @COUNTER=0 WHILE(@COUNTER < 26) BEGIN INSERT INTO MYTB VALUES(@COUNTER,CHAR(@COUNTER + ASCII(‘A’))) SET @COUNTER= @COUNTER + 1 END 在Microsoft SQL Server Management Studio中新建一个查询,输入并执行上面的脚本,然后在Microsoft SQL Server Management Studio的“对象资源管理器”中查看MYTB表以及其中的数据。 (2)用下面的脚本查询Employee表中的雇员信息,包括EmployeeID和Gender,Gender的属性根据其值相应地显示为‘男’或‘女’。 USE AdventureWorks SELECT EmployeeID,Gender= CASE Gender WHEN ‘M’ THEN ‘Male’ WHEN ‘F’ THEN ‘Female’ END FROM HumanResources.Employee 在Microsoft SQL Server Management Studio中新建一个查询,输入并执行上面的脚本,观察执行结果。 (3)下面的脚本显示了T-SQL中的错误处理。

存储过程练习

客户定制业务ICD平台有数据表结构如下: 录音文件信息表 字段名类型中文名缺省值描述SerialNo VARCHAR2(20)流水号业务流水号 FilePath VARCHAR2(200)录音文件路 径录音文件路径和文件名 Partid Varchar2(4)分区字段格式为MMDD StaffNo VARCHAR2(10)业务代表工 号录音的业务代表工号 RecordTimeDATE录音时间记录录音时 间 说明:记录录音文件的文件信息。每个业务可产生一个或多个录音文件。 索引: Ix_RecordFile_SerialNo (SerialNo) 数据量:约800万 按每天2万个业务需要记录录音文件,每个业务需要记录4个录 音文件估算,保存三个月数据约800万数据量,由于此表数据 量不断累计,数据库任务定时删除3个月以前数据。 1、写一个存储过程,向表中随机插入1000条记录 SerialNo:使用序列方式,自增长。 Filepath:使用随机插入6个字母 Partid:使用随机4位数字 StaffNo:从YTCZ060001……. YTCZ060020 中随机抽取 RecordTime:从2006年8月4日之前的6个月中随机抽取。 2、写一个程序块,循环调用500次此存储过程,保证数据表中存储 50万条记录。 3、查找FilePath相同的行,并删除FilePath相同的重复记录(保存一 条时间最近记录)

4、写一个存储过程,删除3个月前的数据。 5、写一个触发器,每月末最后一天中午12点整,系统提示执行“删 除3个月前数据”的存储过程。 答: CREATE TABLE RecordFile ( SerialNo VARCHAR2(20), FilePath VARCHAR2(200), Partid VARCHAR2(4), StaffNo VARCHAR2(10), RecordTime DATE) CREATE INDEX Ix_RecordFile_SerialNo ON recordfile(SerialNo) PCTFREE 30 TABLESPACE mytbs create sequence seq_RecordFile start with 0 minvalue 0; create or replace procedure add_RecordFile is begin for i in 1..1000 loop insert into RecordFile values (seq_RecordFile.nextval, dbms_random.string('u',6), trunc(dbms_random.value(1000,9999)), 'YTCZ0'||trunc(dbms_random.value(60001,60020)), to_date('2006-08-04','yyyy-mm-dd')-dbms_random.value(0,181)); end loop; commit; end add_RecordFile;

SQL存储过程实例(练习和答案)

题目1 1、学校图书馆借书信息管理系统建立三个表: 学生信息表:student 图书表:book 借书信息表:borrow 请编写SQL语句完成以下的功能: 1)查询“计算机”专业学生在“2007-12-15”至“2008-1-8”时间段内借书的学生编号、 学生名称、图书编号、图书名称、借出日期;参考查询结果如下图所示: 2)查询所有借过图书的学生编号、学生名称、专业;参考查询结果如下图所示:

3)查询借过作者为“安意如”的图书的学生姓名、图书名称、借出日期、归还日期; 参考查询结果如下图所示: 4)查询目前借书但未归还图书的学生名称及未还图书数量;参考查询结果如下图所 示: 附加:建表语句:

标准答案:

题目2 程序员工资表:ProWage 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱? 例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程测试。 请编写T-SQL来实现如下功能: 1)创建存储过程,查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000 元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。

2)创建存储过程,查询程序员平均工资在4500元,如果不到则每个程序员每次加200元, 至到所有程序员平均工资达到4500元。 标准答案:

创建带有游标的存储过程sql语句

游标中用到的函数,就是前一篇文章中创建的那个函数。 另外,为了方便使用,把游标放在存储过程中,这样就可以方便地直接使用存储过程来执行游标了。 1create procedure UpdateHKUNo --存储过程里面放置游标 2as 3begin 4 5declare UpdateHKUNoCursor cursor--声明一个游标,查询满足条件的数据 6for select psn_code from person where type='E'and hku_no is null 7 8open UpdateHKUNoCursor --打开 9 10declare@noToUpdate varchar(20) --声明一个变量,用于读取游标中的值 11fetch next from UpdateHKUNoCursor into@noToUpdate 12 13while@@fetch_status=0--循环读取 14begin 15--print @noToUpdate 16update person set hku_no=dbo.GetExtUserHKUNo() where psn_code=@noToUpdate 17fetch next from UpdateHKUNoCursor into@noToUpdate 18end 19 20close UpdateHKUNoCursor --关闭 21 22deallocate UpdateHKUNoCursor --删除 23 24end 25 26--exec UpdateHKUNo 另外,判断数据库中是否存在某一存储过程(Sqlserver 2000): if exists (select*from sysobjects where name='UpdateHKUNo'and xtype ='P') print'yse' else print'no'

相关文档
最新文档