• 第七章:存储过程


    一.存储过程的概念

      存储过程是在数据库管理系统中保存的,预先编译的,能实现某种功能的SQL程序,它是数据库应用中比较广泛的一种数据对象

    1.为什么需要存储过程

         1)数据库不安全

         2)运行慢

         3)网络流量大

    2.什么是存储过程

       是SQL语句和控制语句的预编译集合,保存在数据库里,可由应用程序调用执行,而且允许用户声明变量,逻辑控制语句及其他强大的编程功能。它可以接收参数,输出参数,返回单个或多个结果集及返回值。

    使用存储过程的优点:

       ①模块化程序设计。

       ②执行速度快,效率高。

       ③减少网络流量

       ④具有良好的安全性

    二.系统存储过程

    1.常用的系统存储过程

    系统存储过程 说明
    sp_databases 列出服务器上的所有数据库信息,包括数据库名称和数据库大小
    sp_helpdb 报告有关指定数据库或所有数据库的信息
    sp_renamedb 更改数据库的名称
    sp_tables 返回当前环境下可查询的表或视图的信息
    sp_columns 返回某个表或视图的列信息,包括列的数据类型和长度等
    sp_help 查看某个数据库对象的信息
    sp_helpconstraint 查看某个表的约束
    sp_helpindex 查看某个表的索引
    sp_stored_procedures 显示存储过程的列表
    sp_password 添加或修改登录账户的密码
    sp_helptext 显示默认值,未加密的存储过程,用户自定义的存储过程。触发器或视图的实际文本

     语法

    exec[ute] 存储过程名 [参数值]

    2.常用的扩展存储过程

    语法:

    exec xp_cmdshell dos 命令[no_output]

    其中,exec表示调用存储过程,no_output为可选参数,设置执行dos命令后是否输出返回信息。

    三.用户自定义的存储过程

    1.创建不带参数的存储过程:

       1)创建存储过程

    语法:

    create proc[edure] 存储过程名
      [
           {@参数1  数据类型} [= 默认值] [output],
            ……
           {@参数n  数据类型} [= 默认值] [output],
      ]
    as
        SQL语句

       2)删除存储过程

    语法:

    drop proc[edure] 存储过程名

    例子:

    --最简单的创建存储过程
    create procedure usp_Student
    as
    select * from Student

    2.创建带参数的存储过程:

       1)创建带参数的存储过程

         如果存储过程的参数后面有“output”关键字,则表示此参数为输出参数;否则视为输入参数,输入参数还可以设置为默认值。

       2)执行带参数的存储过程

    语法:

    exec[ute] [返回变量值=]存储过程名 [@参数1=] 参数值1 [output]|[default],
                                    ……
                                   [@参数1=] 参数值n [output]|[default]

    其中,output表明参数是输出参数,default表示参数的默认值

    例子:

     1 create procedure usp_unpass
     2    @subName varchar(50),
     3    @score int
     4 as
     5     declare @subjectNo int --课程编号
     6     declare @date datetime  --最近考试时间
     7    select @subjectNo=subjectNo from Subject where SubjectName=@subName
     8     select @date=max(ExamDate) from Result 
     9     inner join  Subject on Result.SubjectNo=Subject.SubjectNo
    10     where Result.SubjectNo=@subjectNo
    11 print '--------------------------------------------------------'
    12 print '参加最近一次'+@subName+'考试没有达到分数线的学员:'
    13 select StudentName.Student,StudentNo,StudentResult from Student
    14 inner join Result on Student.StudentNo=Result.StudentNo
    15 where StudentResult<@score 
    16 and ExamDate=@date 
    17 and subjectNo=@subjectNo  

    四.处理错误信息

    1.raiserror语句

    raiserror返回用户定义的错误信息,可指定严重级别,设置系统变量记录所发生的错误

    语法:

    raiserror ({msg_id|msg_str}{,severity,state}[with option[,.......n]])
    作者:Monodrama
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。
  • 相关阅读:
    [BZOJ]1042 硬币购物(HAOI2008)
    [Codeforces]605E Intergalaxy Trips
    [Codeforces]860E Arkady and a Nobody-men
    [Codeforces]856E Satellites
    [Codeforces]849E Goodbye Souvenir
    [Codeforces]852I Dating
    [BZOJ]1095 Hide捉迷藏(ZJOI2007)
    洛谷3275 & BZOJ2330:[SCOI2011]糖果——题解
    洛谷5960:【模板】差分约束算法——题解
    The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解
  • 原文地址:https://www.cnblogs.com/jingpeipei/p/5276070.html
Copyright © 2020-2023  润新知