zoukankan      html  css  js  c++  java
  • 自定义函数和存储过程


    1
    --例8.2.1创建自定义标量函数TOTAL()用来计算任意两数之和。 2 create function total(@a int, @b int) 3 returns int 4 begin 5 declare @c int 6 select @c = @a + @b 7 return @c 8 end 9 --调用 10 select dbo.total(10, 20) 11 --例8.2.2编写一个函数,可以通过输入借书时间来判断是否到期,当借阅时间大于30天,返回已经过期;否则返回还未到期。 12 alter function isdateout(@a datetime) 13 returns varchar(20) 14 as 15 begin 16 declare @res varchar(20) 17 if (datediff(day, @a, getdate()) > 30) 18 set @res = '已过期' 19 else 20 set @res = '未到期' 21 return @res 22 end 23 --调用 24 select dbo.isdateout('2019-11-1') 25 --例8.2.3 创建标量函数sumstudent()统计选课学生总数。 26 create function cal() 27 returns int 28 begin 29 return (select count(distinct cno) from course) 30 end 31 --调用 32 print dbo.cal() 33 --例8.2.4 求选课表中某门课的平均成绩。 34 create function calavg(@cname char(4)) 35 returns float 36 as 37 begin 38 declare @res float 39 select @res = avg(grade) 40 from sc, course 41 where sc.cno = course.cno and course.cname = @cname 42 return @res 43 end 44 --调用 45 select dbo.calavg('英语') as 英语的平均成绩 46 --例8.2.5 创建函数fun_table( )返回一组查询的结果。 47 create function fun_table(@sno char(9), @grade int) 48 returns table 49 as 50 return 51 ( 52 select * 53 from sc 54 where sno = @sno and grade > @grade 55 ) 56 --调用 57 select * 58 from dbo.fun_table('200515001', 80) 59 --例8.2.6 查询某个专业所有学生的学号、姓名、所选课程的课程号和成绩。 60 alter function show(@major char(10)) 61 returns table 62 as 63 return 64 ( 65 select student.sno 学号, sname 姓名, cno 课程号, grade 成绩 66 from student, sc 67 where student.sno = sc.sno and sdept = @major 68 ) 69 70 select * 71 from dbo.show('cs') 72 --例8.2.7 查询计算机专业所有学生的学号、姓名、所选的课程号和成绩。 73 update dbo.show('cs') 74 set 姓名 = '张力' 75 where 学号 = '2005150033' 76 --????违反了 PRIMARY KEY 约束“PK_student”。不能在对象“dbo.student”中插入重复键。重复键值为 (200515001)。 77 --例8.2.8 创建函数fun_multi_table( )返回一个临时表。 78 create function fun_multi_table() 79 returns @tmp_table table(学号 char(9), 课程名 varchar(20), 成绩 int) 80 as 81 begin 82 insert @tmp_table 83 select sno, cname, grade 84 from sc, course 85 where sc.cno = course.cno 86 return 87 end 88 select * 89 from dbo.fun_multi_table() 90 --例8.2.9 创建多语句表值函数,通过学号作为实参调用该函数,可显示该学生的姓名以及各门功课的成绩和学分。 91 create function st_score(@no char(9)) 92 returns @score table(sno char(9), sname char(10), cname char(10), score int, credit int) 93 as 94 begin 95 insert @score 96 select s.sno, s.sname, c.cname, c.credit, sc.grade 97 from student s, course c, sc 98 where s.sno = sc.sno and c.cno = sc.cno and s.sno = @no 99 return 100 end 101 --调用 102 select * 103 from st_score('200515001')
     1 --例8.3.1 带有复杂 SELECT 语句的存储过程:查询计算机系学生的考试情况,列出学生的姓名、课程名和考试成绩。
     2 create procedure p_grade1
     3 as
     4 select sname, cname, grade
     5 from student, course, sc
     6 where student.sno = sc.sno and course.cno = sc.cno and sdept = 'cs'
     7 
     8 exec p_grade1
     9 --例8.3.2 带有输入参数的存储过程:查询某个指定系学生的考试情况,列出学生的姓名、所在系、课程名和考试成绩。
    10 create procedure p_grade2 @dept varchar(20)
    11 as
    12 select sname, sdept, cname, grade
    13 from student s, sc, course c
    14 where s.sno = sc.sno and c.cno = sc.cno and sdept = @dept
    15 
    16 exec p_grade2 'is'
    17 --例8.3.3 含多个输入参数并有默认值的存储过程:查询某个学生某门课程的考试成绩,若没有指定课程,则默认课程为“数据库”
    18 create procedure p_grade3 @sname varchar(10), @cname varchar(10) = '数据库'
    19 as
    20 select sname, cname, grade
    21 from student s, course c, sc
    22 where s.sno = sc.sno and c.cno = sc.cno and s.sname = @sname and c.cname = @cname
    23 
    24 exec p_grade3 '赵菁菁', '数据结构'
    25 --例8.3.4含多个输入参数并均指定默认值的存储过程。查询指定系、指定性别的学生中年龄大于等于指定年龄的学生详细信息。系的默认值为“计算机系”,性别默认值为“男”,年龄默认值为20。
    26 create procedure p_student @dept char(20) = 'cs', @sex char(2) = '', @age int = 20
    27 as
    28 select *
    29 from student
    30 where sdept = @dept and ssex = @sex and sage >= @age
    31 
    32 exec p_student 'is', 10
    33 exec p_student @dept = 'is', @sex = ''
    34 --例8.3.5含输出参数的存储过程。计算两个数的乘积,将计算结果用输出参数返回给调用者。
    35 create procedure p_sum @var1 int, @var2 int, @var3 int output
    36 as
    37 set @var3 = @var1 * @var2
    38 
    39 declare @res int
    40 exec p_sum 5, 9, @res output
    41 print @res
    42 --例8.3.6 含输入参数和一个输出参数的存储过程。统计指定课程(课程名)的平均成绩,并将统计的结果用输出参数返回。
    43 alter procedure p_avggrade @cname char(20), @avg float output
    44 as
    45 select @avg = avg(grade)
    46 from sc join course c on c.cno = sc.cno
    47 where c.cname = @cname
    48 
    49 declare @avg_grade float
    50 exec p_avggrade '数据库', @avg_grade output
    51 print @avg_grade
    52 --例8.3.7 含输入参数和多个输出参数的存储过程。统计指定课程的平均成绩和选课人数,将统计的结果用输出参数返回。
    53 create procedure p_avgcount @cname varchar(10), @avg float output, @number int output
    54 as
    55 select @avg = avg(grade), @number = count(*)
    56 from sc, course c
    57 where sc.cno = c.cno and cname = @cname
    58 
    59 declare @avg float, @number int
    60 exec p_avgcount '数据结构', @avg output, @number output
    61 select @avg as 平均成绩, @number as 选课人数
    62 --例8.3.8  将指定课程的学分增加2分。
    63 create procedure p_updatecredit1 @cname char(10)
    64 as
    65 update course
    66 set credit = credit + 2
    67 where cname = @cname
    68 
    69 exec p_updatecredit1 '操作系统'
    70 --例8.3.9 将指定课程的学分改为指定值,要求指定值必须在1~10之间,否则不予修改。
    71 create procedure p_updatecredit2 @cno char(6), @credit int
    72 as
    73 if @credit between 1 and 10
    74     update course
    75     set credit = @credit
    76     where cno = @cno
    77 
    78 exec p_updatecredit2 1, 9
    79 --例8.3.10 修改p_grade2存储过程,使其能查询指定系中考试成绩大于等于80分的学生姓名、所在系、课程名和考试成绩。
    80 alter procedure p_grade2 @dept varchar(20)
    81 as
    82 select sname, sdept, cname, grade
    83 from student s, course c, sc
    84 where s.sno = sc.sno and c.cno = sc.cno and sdept = @dept and grade >= 80
    85 
    86 exec p_grade2 'is'
    87 --删除存储过程
    88 drop procedure p_grade2
  • 相关阅读:
    Tomcat服务器原理详解
    junit入门
    lombok
    java 运行指定类的main函数
    席位分配问题——惯例Q值法和d'hondt法的MATLAB程序
    5.2 calendar--通用日期的相关函数(3)
    [笔记]软件体系结构(1)--模式初印象
    hdu 1003
    linux虚拟机上挂载U盘
    Android中Java与web通信
  • 原文地址:https://www.cnblogs.com/liuwenhan/p/11834106.html
Copyright © 2011-2022 走看看