SQL存储过程试题及答案 下载本文

--写存储过程及调用存储过程

/*1.写出创建分数存储过程用于计算某门课程成绩最高分、最低分、 平均分,参数课程号。*/

--2.写出统计某门课选人数的存储过程,输入参数课程号,输出参数人数。 /*3.创建存储过程,要求根据学生姓名查看学生的籍贯. (要求:在存储过程里定义两个参数,

第一个接收由调用程序指定的输入值(学生姓名), 第二个参数用于将该值返回调用程序)*/ /*4.程序员工资表:ProWage 字段名称 ID PName Wage 数据类型 int Char(10) int 说明 自动编号,主键 程序员姓名 工资 创建一个存储过程,对程序员的工资进行分析,月薪1500到10000不等,如果有百分之五十的人薪水不到2000元,给所有人加薪,每次加100,再进行分析,直到有一半以上的人大于2000元为止,存储过程执行完后,最终加了多少钱?

例如:如果有百分之五十的人薪水不到2000,给所有人加薪,每次加100元,直到有一半以上的人工资大于2000元,调用存储过程后的结果如图:

请编写T-SQL来实现如下功能:

查询是否有一半程序员的工资在2200、3000、3500、4000、5000或6000元之上,如果不到分别每次给每个程序员加薪100元,至之一半程序员的工资达到2200,3000,3500,4000,5000或6000元。

/*5.编写一个存储过程PR_GET_PASS_RATE统计某门课程的及格率,其传入参数是课程号P_CNO,传出参数是该课程成绩的及格率P_PASSRATE,及格率的格式形如:86.56%。

6.创建触发器T_1,功能是当向数据表学生添加记录时,显示学生的信息。 create trigger T_1 on 学生 after insert

as select * from 学生

insert into 学生 values('3001','李四','男','计本10')

7.创建触发器T_2,功能是当向数据表班级添加、修改和删除记录时,显示学生的信息。 create trigger T_2 on 学生 after insert,update,delete

as select * from 学生

8.创建触发器T_3,功能是当修改班级班号,同步更新学生表的班号。

9.创建触发器T_4,功能是当删除学生表的记录时,同步删除选课表中的选课信息。

create trigger T_4 on 学生 after delete as

declare @xh char(10)

select @xh=学号 from deleted

delete from 选课 where 学号=@xh

delete from 学生 where 学号='3002'

/*1.写出创建分数存储过程用于计算某门课程成绩最高分、最低分、 平均分,参数课程号。*/ use xsgl go

create procedure aa(@课程名 nchar(16)) as begin

select 课程号,最高分=max(成绩),最低分=min(成绩),平均分=avg(成绩) from 成绩 where 课程号 = @课程名 group by 课程号 end go

execute aa '001'

--2.写出统计某门课选人数的存储过程,输入参数课程号,输出参数人数。 use xsgl go

create procedure bb @课程号 char(10),@人数 int output as begin

select @人数=(select count(课程号)from 成绩 where 课程号=@课程号) end

declare @人数 int,@课程号 char(4) set @课程号='002'

exec bb @课程号,@人数 output

print '课程号为'+@课程号+'的人数:'+cast(@人数 as char(2))

/*3.创建存储过程,要求根据学生姓名查看学生的籍贯. (要求:在存储过程里定义两个参数,

第一个接收由调用程序指定的输入值(学生姓名), 第二个参数用于将该值返回调用程序)*/ use xsgl go

create procedure cc(@姓名 char(10),@籍贯 char(10) output) as begin

select @籍贯=(select 籍贯 from 学生 where 姓名=@姓名) end

declare @姓名 char(10),@籍贯 char(10) set @姓名='廖小小'

exec cc @姓名,@籍贯 output

print '学生'+@姓名+'的籍贯是:'+@籍贯

USE Wage GO

CREATE TABLE ProWage --程序员工资表 (

ID int identity(1,1) primary key, --工资编号

PName CHAR(10) NOT NULL , --程序员姓名 Wage int NOT NULL --工资 ) GO

--1、创建存储过程--

if exists (select * from sysobjects where name='Sum_wage') drop procedure Sum_wage GO

create procedure Sum_wage @PWage int,

@AWage int, @total int as

while (1=1) begin

if (select count(*) from ProWage)>2*(select count(*) from ProWage where Wage>=@PWage) update ProWage set @total=@total+@AWage,Wage=Wage+@AWage else break end

print'一共加薪:'+convert(varchar,@total)+'元' print'加薪后的程序员工资列表:' select * from ProWage --调用存储过程1--

exec Sum_wage @PWage=2000,@AWage=100,@total=0 exec Sum_wage @PWage=2200,@AWage=100,@total=0 exec Sum_wage @PWage=3000,@AWage=100,@total=0 exec Sum_wage @PWage=4000,@AWage=100,@total=0 exec Sum_wage @PWage=5000,@AWage=100,@total=0 exec Sum_wage @PWage=6000,@AWage=100,@total=0

5:编写一个存储过程PR_GET_PASS_RATE统计某门课程的及格率,其传入参数是课程号P_CNO,传出参数是该课程成绩的及格率P_PASSRATE,及格率的格式形如:86.56%。

create or replace procedure PR_passrate_count (p_cno char,P_PASSRATE out char) as

v_passcnt int; v_totalcnt int; begin

--先求及格人数

select count(*) into v_passcnt from sc where cno=p_cno and grade>=60; --若及格人数为0则给出结果 if v_passcnt=0 then P_PASSRATE:='0%'; else

select count(*) into v_totalcnt from sc where cno=p_cno;

P_PASSRATE:=to_char(round(100*v_passcnt/v_totalcnt,2))||'%'; end if; end;