`
aihhd2008
  • 浏览: 24521 次
  • 性别: Icon_minigender_1
  • 来自: 合肥
最近访客 更多访客>>
社区版块
存档分类
最新评论

存储过程

阅读更多
什么是存储过程呢?
定义:
      将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来, 那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
讲到这里,可能有人要问:这么说存储过程就是一堆SQL语句而已啊?
                                       Microsoft公司为什么还要添加这个技术呢?
那么存储过程与一般的SQL语句有什么区别呢?
存储过程的优点:
                       1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
                        2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
                       3.存储过程可以重复使用,可减少数据库开发人员的工作量
                       4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权
存储过程的种类:
    1.系统存储过程:以sp_开头,用来进行系统的各项设定.取得信息.相关管理工作,
                               如 sp_help就是取得指定对象的相关信息
   2.扩展存储过程   以XP_开头,用来调用操作系统提供的功能
                              exec master..xp_cmdshell 'ping 10.8.16.1'
   3.用户自定义的存储过程,这是我们所指的存储过程
   常用格式
  
 Create PRocedure procedue_name
   [@parameter data_type][output]
   [with]{recompile|encryption}
   as
        sql_statement

解释: 
output:表示此参数是可传回的
with {recompile|encryption}
recompile:表示每次执行此存储过程时都重新编译一次
encryption:所创建的存储过程的内容会被加密
如:
   表book的内容如下
   编号    书名                           价格
   001      C语言入门                   $30
   002      PowerBuilder报表开发  $52
 实例1:查询表Book的内容的存储过程
  
create proc query_book
      as 
      select * from book
   go
   exec query_book

 实例2:加入一笔记录到表book,并查询此表中所有书籍的总金额
  
Create proc insert_book
   @param1 char(10),@param2 varchar(20),@param3 money,@param4 money output
   with encryption  ---------加密
   as
   insert book(编号,书名,价格) Values(@param1,@param2,@param3)
   select @param4=sum(价格) from book
  go

  执行例子:
 
declare @total_price money 
  exec insert_book '003','Delphi 控件开发指南',$100,@total_price
  print '总金额为'+convert(varchar,@total_price)
  go

存储过程的3种传回值:
   1.以Return传回整数
   2.以output格式传回参数
   3.Recordset
传回值的区别:
       output和return都可在批次程式中用变量接收,而recordset则传回到执行批次的客户端中 
实例3:设有两个表为Product,Order,其表内容如下:
      Product
           产品编号       产品名称    客户订数    
            001             钢笔         30        
            002             毛笔         50        
            003             铅笔         100       
      Order 
           产品编号         客户名     客户订金
            001              南山区      $30
            002              罗湖区      $50
            003              宝安区      $4
请实现按编号为连接条件,将两个表连接成一个临时表,该表只含编号.产品名.客户名.订金.总金额,
总金额=订金*订数,临时表放在存储过程中
代码如下:
    
 Create proc temp_sale
     as
       select a.产品编号,a.产品名称,b.客户名,b.客户订金,a.客户订数* b.客户订金 as总金额
       into #temptable from Product a inner join Order b on a.产品编号=b.产品编号
    if  @@error=0 
       print 'Good'
    else
       print 'Fail'
     go


3.自定义存储过程

(1.)不带参数的存储过程

代码
use studb
go
if exists(select * from sysobjects where name='proc_stu')
drop proc proc_stu
go

create procedure proc_stu
 AS
    DECLARE @writtenAvg float,@labAvg float --笔试和机试平均分变量
    SELECT @writtenAvg=AVG(writtenExam), @labAvg=AVG(labExam) FROM stuMarks
    print '笔试平均分:'+convert(varchar(5),@writtenAvg) 
    print '机试平均分:'+convert(varchar(5),@labAvg)
    IF (@writtenAvg>70 AND @labAvg>70)
       print '本班考试成绩:优秀'
    ELSE
       print '本班考试成绩:较差'
    print '--------------------------------------------------'
    print '           参加本次考试没有通过的学员:'
    SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM  stuInfo
      INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
         WHERE writtenExam<60 OR labExam<60
GO


exec proc_stu --执行存储过程
(2.)带输入参数的存储过程

代码
USE stuDB
GO
/*---检测是否存在:存储过程存放在系统表sysobjects中---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
  DROP PROCEDURE  proc_stu
GO
/*---创建存储过程----*/
CREATE PROCEDURE proc_stu
  @writtenPass int,
  @labPass int-- 可以添加默认值 这样 执行可以是这样的 exec proc_stu 不用指定参数了
  AS
    print '笔试及格线:'+convert(varchar(5),@writtenPass)
    print '机试及格线:'+convert(varchar(5),@labPass)
    print '--------------------------------------------------'
    print '           参加本次考试没有通过的学员:'
    SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM  stuInfo
      INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
         WHERE writtenExam<@writtenPass OR labExam<@labPass
GO

exec proc_stu 60,55
exec proc_stu 60,@labPass=55
exec proc_stu @writtenPass=60,@labPass=55
exec proc_stu @writtenPass=60,55--这一行会报错 :必须传递参数 2,并以 '@name = value' 的形式传递后续的参数。
--  一旦使用了 '@name = value' 形式之后,所有后续的参数就必须以 '@name = value' 的形式传递



(3.)带输出参数的存储过程

代码
USE stuDB
GO
/*---检测是否存在:存储过程存放在系统表sysobjects中---*/
IF EXISTS (SELECT * FROM sysobjects WHERE name = 'proc_stu' )
  DROP PROCEDURE  proc_stu
GO
/*---创建存储过程----*/
CREATE PROCEDURE proc_stu
  @notpassSum int OUTPUT, --OUTPUT关键字,否则视为输入参数
  @writtenPass int=60,  --默认参数放后
  @labPass int=60       --默认参数放后
  AS
    print '笔试及格线:'+convert(varchar(5),@writtenPass)
       + '   机试及格线:'+convert(varchar(5),@labPass)
    print '--------------------------------------------------'
    print '           参加本次考试没有通过的学员:'
    SELECT stuName,stuInfo.stuNo,writtenExam,labExam FROM  stuInfo
      INNER JOIN stuMarks ON stuInfo.stuNo=stuMarks.stuNo
         WHERE writtenExam<@writtenPass OR labExam<@labPass
    /*--统计并返回没有通过考试的学员人数--*/
    SELECT @notpassSum=COUNT(stuNo)FROM stuMarks
      WHERE writtenExam<@writtenPass OR labExam<@labPass
  
GO

/*---调用存储过程----*/
DECLARE @sum int
EXEC proc_stu @sum OUTPUT ,64   --机试及格线采用默认值:笔试及格线64分,机试及格线60分。
print '--------------------------------------------------'
IF @sum>=3
  print '未通过人数:'+convert(varchar(5),@sum)+ '人,超过60%,及格分数线还应下调'
ELSE
  print '未通过人数:'+convert(varchar(5),@sum)+ '人,已控制在60%以下,及格分数线适中'
GO
 




分享到:
评论

相关推荐

    C# winform调用SQL存储过程-菜鸟入门 详细注释

    内容概要:简单的C# winform调用存储过程实例,创建存储过程入参,通过SqlConnection对象和SqlCommand对象调用存储过程,获取存储过程的出参并显示出来,详细代码注释,希望对用到C#调用存储过程的小伙伴有帮助 ...

    SQL_Server存储过程调试指南

    资源名称:SQL_Server存储过程调试指南内容简介: 存储过程( Stored Procedure)是一组为了完成特定功能的 SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来...

    高效分页存储过程 高效分页存储过程

    sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程 sql 高效分页存储过程

    Sql Server 存储过程的导出导入.doc

    SqlServer存储过程的导出导入 近日在研究SQL的存储过程,这里我陆续将我在使用存储过程中碰到的问题及解决办法发布到网上,请各位大虾指正。 SqlServer存储过程的导出导入,网上相关资料特别少,经过摸索,这里写...

    数据库原理及应用实验四(存储过程和触发器)

    创建一个名为stu_pr的存储过程,该存储过程能查询出051班学生的所有资料,包括学生的基本信息、学生的选课信息(含未选课同学的信息)。要求在创建存储过程前请判断该存储过程是否已创建,若已创建则先删除,并给出...

    118个真实应用场景的Oracle存储过程案例及开发指南(从入门到熟练使用)

    1、资料包含了作者编写的实际应用场景中使用的存储过程代码,共计118个案例,有完整注释说明。旨在帮助读者通过案例学习,快速掌握存储过程的应用方法和技巧。 2、博主博客:...

    Python使用cx_Oracle调用Oracle存储过程的方法示例

    本文实例讲述了Python使用cx_Oracle调用Oracle存储过程的方法。分享给大家供大家参考,具体如下: 这里主要测试在Python中通过cx_Oracle调用PL/SQL。 首先,在数据库端创建简单的存储过程。 create or replace ...

    birt调用存储过程

    birt报表中调用存储过程的方法. 目录 1. 概述 3 2. BIRT支持的存储过程返回值类型 3 3. BIRT调用存储过程的语法 4 4. 创建存储过程数据源/集 4 5. 在BIRT中使用存储过程 5 调用返回单结果集的存储过程。 5 调用...

    实验9 存储过程的创建和使用

    阅读实验教材《SQL Server 2012数据库管理与开发》第137页到155页的内容,掌握存储过程的概念、了解存储过程的类别(系统存储过程,用户自定义存储过程,扩展存储过程);掌握存储过程的建立;掌握存储过程的两种...

    SQL存储过程SQL存储过程SQL存储过程

    存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程SQL存储过程

    mysql存储过程之返回多个值的方法示例

    本文实例讲述了mysql存储过程之返回多个值的方法。分享给大家供大家参考,具体如下: mysql存储函数只返回一个值。要开发返回多个值的存储过程,需要使用带有INOUT或OUT参数的存储过程。咱们先来看一个orders表它的...

    MySQL数据库:存储过程的创建1.pptx

    创建存储过程1 课程目标 1)了解 ——存储过程的优点; 2)理解 —— 存储过程的概念; 3)掌握 —— 存储过程的创建方法; 存储过程优点 使用存储过程的优点有: (1)存储过程在服务器端运行,执行速度快。 (2)...

    SQLServer存储过程转为oracle存储过程的工具

    可以将SQL Server存储过程转为oracle存储过程的工具

    db2 存储过程语法与实例

    db2 存储过程 db2 存储过程 db2 存储过程

    oracle存储过程实例

    oracle 存储过程实例 oracle存储过程实例

    MySQL创建存储过程批量插入10万条数据

    MySQL创建存储过程批量插入10万条数据 存储过程 1、首先防止主键冲突,我们清空表。 TRUNCATE table A_student; 2、编写存储过程 delimiter ‘$’; CREATE PROCEDURE batchInsert(in args int) BEGIN declare i int ...

    SAP HANA 中调试存储过程

    SAP HANA 中调试存储过程 SAP HANA 中调试存储过程 SAP HANA 中调试存储过程

    存储过程自动生成工具

    1、 基本完全代替编写存储过程的工作任务。 2、 让不会写存储过程的测试人员,也可顺利完成加压测试工作。 3、 让会写存储过程的测试人员,短时间内完成存储过程编写。 4、 可生成现行业主流的不同数据库类型的存储...

    java 调用存储过程

    java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程java 调用存储过程

Global site tag (gtag.js) - Google Analytics