zoukankan      html  css  js  c++  java
  • 关于sqlserver存储过程的学习 一

    我也是在公司要用到sqlserver 才开始学习的 里面和Oracle 中的存储过程的关键字有些差别

      --1.不带返回值 默认值的存储过程的编写 
      use EASTEONE
      --判断存储过程名字是否存在 存在删除 注意 在执行完语句的时候要用go结束    
      if exists  
      (select name from sysobjects where name = 'up_getallstudents' and type = 'p' )
      drop procedure up_getallstudents 
      go   
      create procedure up_getallstudents
      as
      select * from student
      go
      -- 调用存储过程
      exec up_getallstudents;
      go
      --编写插入数据的存储过程
      create procedure up_insertstudent
      -- 传入的字段数据要加 @sid @sname 表示输入的参数
      @sid varchar(20),
      @sname varchar(30),
      @ssex char(3),
      @sbirth datetime,
      @sbirthplace varchar(60),
      @semail varchar(30)
      as
      begin
      insert into student
      (stu_id,stu_na,stu_s,stu_birth,stu_birthplace,stu_email)
      values
      (@sid,@sname,@ssex,@sbirth,@sbirthplace,@semail)
      end
      go
      exec up_insertstudent '201605','小雅','','1992-06-06','鹤壁同城','xio@666'
      go
      --编写一个存储过程up_getstuinformationbystuId,根据输入的学生学号,显示该学生的学号、姓名、课程名和成绩
      drop procedure up_getstuinformationbystuId
      go
      create procedure up_getstuinformationbystuId
      @Sid varchar(20)
      as 
      begin
      select "S".stu_id, stu_na, cou_name, cou_score 
      from student "S", courses "C", stucourse "SC"
      where "S".stu_id = "SC".stu_id and "C".id="SC".cou_id and "S".stu_id = @Sid; 
      end
      go
      
      -- 调取存储过程
      exec up_getstuinformationbystuId '2016002'; 
      go
    --2、带输出参数
    --在创建存储过程时,可以用关键字OUTPUT来创建一个输出参数,另外,调用时也必须给出OUTPUT关键字
    --根据给定的学生姓名,
      use EASTEONE
      go
      create procedure getAvgscore
      @stuId varchar(30),@avgscore int output
      as 
      begin
      select @avgscore=avg(cou_score) from student s ,courses c ,stucourse sc
      where s.stu_id=sc.stu_id and sc.cou_id=c.id and s.stu_id=@stuId;
      end
      go
      -- 调用存储过程
      -- 声明一个变量
      declare @avgdcore int
      exec  getAvgscore '2016002' ,@avgdcore output
      print @avgdcore
      go
       --3、带返回值的存储过程
    --()print语句可以将用户定义的消息返回给客户端
    --编写一个存储过程up_insertstudent2,在插入学生数据前,先判断一下学号是否存在,
    --如果存在,输出“要插入的学生的学号已经存在”;否则,插入学生数据,并返回”恭喜,数据插入成功“
    
    create procedure up_insertstudenttwo
      @sid varchar(20),
      @sname varchar(30),
      -- 默认值
      @ssex char(3)= '',
      @sbirth datetime,
      @sbirthplace varchar(60),
      @semail varchar(30)
    as
    begin
    if exists(select * from student s where s.stu_id=@sid)
    print('要插入的学生学号已经存在')
    else 
    begin
    insert into student
    (stu_id,stu_na,stu_s,stu_birth,stu_birthplace,stu_email)
    values
    (
      @sid ,
      @sname ,
      @ssex,
      @sbirth ,
      @sbirthplace ,
      @semail 
    )
    print('插入成功')
    end
    
    end
    go
    exec up_insertstudenttwo '2016007','小王','','2010-12-12','上海青浦','qq@666'
    go
    
    -- 4、带变量的存储过程
    /*
      在存储过程可以定义变量,包含全局变量(@@变量名)和局部变量
      (@变量名)
      用于保存存储过程中的临时结果
      编写过程up_getavgscorebystuId,根据输入学生
      学号,计算机学生的平均成绩 。
      根据该生平均成绩和全体学生的平均成绩的关系,返回
      相应信息
    */
    use EASTEONE
    go
    create procedure up_getavgscorebystuId
    @sid varchar(20),@resStr varchar(30) output
    as
    begin
    declare @curAvg decimal(18,2)
    declare @totalAvg decimal(18,2)
    select  @totalAvg=AVG(cou_score) from  courses
    select  @curAvg=avg(cou_score) from student s,courses c,stucourse sc
    where s.stu_id=sc.stu_id and c.id=sc.cou_id and s.stu_id=@sid;
    if @curAvg>@totalAvg
    set @resStr='高于平均分'
    else
    set @resStr='低于平均分'
    print ('总平均数为'+convert(varchar(18),@totalAvg))
    print ('该生的平均数为'+convert(varchar(18),@curAvg))
    print @resStr
    end
    -- @resstring 这额变量可以随便写
    declare @resstring varchar(30)
    exec up_getavgscorebystuId '2016002',@resstring output
    go
    --5、使用output游标参数
    --output 游标参数是用来将存储过程的局部
    -- 局部游标
    --存储过程的代码如下
    create procedure up_getstudent_cursor
    @student_cursor cursor varying output
    as
    begin
         set @student_cursor=cursor
         forward_only static for
         select stu_id, stu_na,stu_s, stu_birth,stu_birthplace,stu_email
         from student
         open @student_cursor
    end
    go
    --过程存储
    go
    create procedure printstudentbycursor
    as 
    declare @Mycursor cursor
    declare @sid varchar(20)
    declare @sname varchar(30)
    declare @ssex char(3)
    declare @sbirth datetime
    declare @sbirthplace varchar(60)
    declare @semail varchar(30)
    begin
    exec up_getstudent_cursor @student_cursor=@Mycursor output
    fetch next from @Mycursor into @sid ,@sname,@ssex,@sbirth,@sbirthplace,@semail
    while(@@FETCH_STATUS=0)
    begin
    print('学号:'+@sid+'学生姓名:'+@sname+'学生性别:'+@ssex+'学生生日:'+convert(varchar(20),@sbirth,120)+'学生出生地:'+@sbirthplace+'学生邮箱:'+@semail)
    fetch next from @Mycursor into @sid ,@sname,@ssex,@sbirth,@sbirthplace,@semail
    end
    close @Mycursor;
    -- 释放资源
    deallocate @Mycursor;
    end
    --调用存储过程
    exec printstudentbycursor;
    drop procedure printstudentbycursor;
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    insert into courses values(4,'音乐',88);
    select * from courses;
    select AVG(cou_score) from  courses;
    go
    aqlserver的分页
  • 相关阅读:
    web-9. 动态网页与数据库-2
    web-9. 动态网页与数据库
    web-8. 多框架页面的创建
    web-7. 丰富页面的多媒体
    web-6. 组织页面的表格
    yocto术语二
    yocto术语
    linux source
    linux 添加环境变量
    ubuntu上网
  • 原文地址:https://www.cnblogs.com/hu-bo/p/6198034.html
Copyright © 2011-2022 走看看