存储过程,非常重要

----------------常用的系统存储过程---------------
execute sp_databases--查看服务器里的所有数据库
exec sp_renamedb NetBarDB,abc--重命名数据库
exec sp_tables--查询出当前环境下的对象列表
exec sp_columns cardInfo--查询指定表中列的信息

------------存储过程语法------------------
create procedure 存储过程名称   --procedure可以用proc代替
    @参数1 数据类型=默认值 output,--output表示输出参数,注意:定义存储过程参数不需要declare
    @参数2 数据类型,                --没output表示输入参数
    .......
as
    --存储过程主体部分(T-SQL语句)
go

--------------简单查询的存储过程--------------------
create proc proc_selectPCinfo
as
    select * from PCInfo
go
exec proc_selectPCinfo --执行存储过程

--------------无参的存储过程--------------------------
--完成:PCuse=0的计算机信息
create proc proc_selectPCinfo2
as
    select * from PCInfo where PCUse=0
go
exec proc_selectPCinfo2

-----------------带输入参数的存储过程------------------
--完成:根据参数值来查询不同状态的计算机信息
create  proc proc_selectPCinfoByPCuse
    @PCuse int
as
    select *,
        case
        when PCUse=0 then ‘空闲‘
        when PCUse=1 then ‘正在使用‘
        end as 使用状态
    from PCInfo where [email protected]
go
--执行带参数的存储过程(建议使用第二种)
exec proc_selectPCinfoByPCuse 1
exec proc_selectPCinfoByPCuse @PCuse=1
--注意:
exec proc_selectPCinfoByPCuse --出错,因为没提供参数值

-------------------输入参数有默认值的存储过程-----------------------
--特点:当调用存储过程没有提供参数值时,参数会使用默认值
--完成:改写上面的存储过程,当执行存储过程没提供参数值,就会查询空闲状态的计算机信息
create  proc proc_selectPCinfoByPCuseHasDefault
    @PCuse int=0 --有默认值的参数
as
    select *,
        case
        when PCUse=0 then ‘空闲‘
        when PCUse=1 then ‘正在使用‘
        end as 使用状态
    from PCInfo where [email protected]
go
exec proc_selectPCinfoByPCuseHasDefault   --查PCuse为0(没提供参数值就使用默认值)
exec proc_selectPCinfoByPCuseHasDefault 1 --查PCuse为1

-------------带输出参数的存储过程------------------
--完成:根据卡号查余额,然后判断是否能上机
create proc proc_getBalanceByCardNumber
    @CardNum varchar(20),
    @balance int output--输出参数
as    
    select @balance=CardBalance from cardInfo where [email protected]
go
--调用带输出参数的存储过程
declare @money int
exec proc_getBalanceByCardNumber @CardNum=‘023-001‘,@[email protected] output --调用存储过程时,输出参数一定要加output
if(@money>=2)
begin
    print ‘可以上机‘
end
else
begin
    print ‘余额不足2元,请先充值‘
end

--删除存储过程
if exists(select * from sysobjects where name=‘proc_getBalanceByCardNumber‘)
begin
    drop proc proc_getBalanceByCardNumber
end

--------------------return的使用-----------------------
--完成:获取新增电脑的编号
--方法一:使用输出参数
if exists(select * from sysobjects where name=‘proc_getAddPCid‘)
begin
    drop proc proc_getAddPCid
end
go
create proc proc_getAddPCid
    @pcid int output
as
    insert into PCInfo values(0,‘新增的计算机‘)
    set @[email protected]@IDENTITY
go
declare @id int
exec proc_getAddPCid @[email protected] output
print convert(varchar,@id)

--方法二:使用return
if exists(select * from sysobjects where name=‘proc_getAddPCid‘)
begin
    drop proc proc_getAddPCid
end
go
create proc proc_getAddPCid
as
    insert into PCInfo values(0,‘新增的计算机‘)
    return @@identity
go
declare @id int
exec @id=proc_getAddPCid
print convert(varchar,@id)
--注意:使用return只能返回一个结果,使用输出参数可以返回多个结果

-----------------return---------------------
--完成:充值
if exists(select * from sysobjects where name=‘proc_addBalance‘)
begin
    drop proc proc_addBalance
end
go
create proc proc_addBalance
    @cardNum nvarchar(50),
    @cardBalance int
as
    if not exists(select * from cardInfo where [email protected])
    begin
        print ‘卡号不存在!‘
        return
    end
    if(@cardBalance<=0)
    begin
        print ‘充值金额不大于0,无法充值!‘
        return
    end
    update cardInfo set [email protected]
    where [email protected]
    declare @errorNum int--声明一个变量,存储错误值,用来判断sql语句是否执行成功
    set @errorNum=0
    set @errorNum = @@ERROR
    if(@errorNum>0)
    begin
        print ‘充值失败!‘
    end
    else
    begin
        print ‘充值成功!‘
    end
go
exec proc_addBalance @cardNum=‘023-001‘,@cardBalance=10

----------------raiserror的使用-----------------------
--完成:完善上例
if exists(select * from sysobjects where name=‘proc_addBalance‘)
begin
    drop proc proc_addBalance
end
go
create proc proc_addBalance
    @cardNum nvarchar(50),
    @cardBalance int
as
    if not exists(select * from cardInfo where [email protected])
    begin
        raiserror(‘卡号不存在!‘,16,1) with log--with log用于将错误写入系统日志中(我的电脑->管理->系统工具->事件查看器->Windows日志->应用程序)
        print convert(varchar,@@error)--输出50000,原因:@@error的值会受raiserror的影响
        return
    end
    if(@cardBalance<=0)
    begin
        raiserror(‘充值金额不大于0,无法充值!‘,16,1)
        return
    end
    update cardInfo set [email protected]
    where [email protected]
    declare @errorNum int--声明一个变量,存储错误值,用来判断sql语句是否执行成功
    set @errorNum=0
    set @errorNum = @@ERROR
    if(@errorNum>0)
    begin
        raiserror(‘充值失败!‘,16,1)
    end
    else
    begin
        raiserror(‘充值成功!‘,11,1)
    end
go
exec proc_addBalance @cardNum=‘023-101‘,@cardBalance=10

时间: 2024-10-12 06:03:18

存储过程,非常重要的相关文章

存储过程特点及应用

jdbc管理数据库. 一般来说:我们使用ORM框架呢,Dao层Hibernate mybits 去管理数据库,然后将这个业务逻辑层分开,代码编写比较慢,还要经过SSH框架的运行后,比较慢. 当然我们也可以使用存储过程,直接将对业务逻辑或者对数据库进行比较复杂的管理,高效率编写PL/SQL語句,通过存储过程呢,比较直接,代码编写比较快捷.运行也快.不需要像ORM框架修改配置文件.代码精简.不太建议对于业务逻辑的操作. http://www.cnblogs.com/JustForExtJs/arch

SQL Server调试存储过程

一.   调试SQL   Server   2000 1.   设置帐户. <1>   在windows服务中找到MSSQLSERVER,双击弹出对话框. <2>   选择“登陆”选项卡,选中“此帐户”,输入一个管理员帐户和密码. <3>   重启服务. 2.   在查询分析器执行单步调试. <1>   在查询分析器中,右键单击存储过程,选择“调试”. 二.   VS2005本地调试Sql   Server   2005 1.   打开VS2005,单击&l

sql存储过程和事务的应用

在去年,学习数据库的时候就学过存储过程了.一直都只知道一些理论,却不知道如何去使用.时隔一年,终于找到如何使用存储过程了. 在机房收费系统中,有些操作,需要多次执行sql语句,多次执行完成才算是完成这个事件流.但是如果其中有一个环节出了错误,那么没出错误的那些操作是不是就多余了. 执行存储过程,就是执行多句SQl语句.而事务,是为了控制这些语句 要么都做,要么 都不做. 在机房收费系统中,执行sql语句的时候. 一般的sql语句使用方法:定义一个字符串,用于存放sql语句.之后指明command

存储过程中使用事物(转)

一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 Create Procedure MyProcedure ( @Param1 nvarchar(10), @param2 nvarchar(10) ) AS Begin Set NOCOUNT ON; Set XACT_ABORT ON; Begin Tran Delete from table1 where

SQL Server中存储过程 比 直接运行SQL语句慢的原因

问题是存储过程的Parameter sniffing 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1. 存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2. 经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query,Delete时),可将此复杂操作用

SQL 存储过程入门(事务)(四)

SQL 存储过程入门(事务)(四) 本篇我们来讲一下事务处理技术. 为什么要使用事务呢,事务有什么用呢,举个例子. 假设我们现在有个业务,当做成功某件事情的时候要向2张表中插入数据,A表,B表,我们插入的顺序是先插入A,再插入B表,如果都顺利插入成功了,当然没有问题,如果任意一张表插入失败了,而另一张表插入成功了,插入成功的表就是垃圾数据了.我们要判断,任意一张表插入失败都回滚,就是都不插入,这就是事务的基本使用. 一,sql事务定义 所谓事务是用户定义的一个数据库操作序列,是一个不可分割的工作

一、存储过程中使用事务的简单语法

一.存储过程中使用事务的简单语法 在存储过程中使用事务时非常重要的,使用数据可以保持数据的关联完整性,在Sql server存储过程中使用事务也很简单,用一个例子来说明它的语法格式: 代码 : Create Procedure MyProcedure( @Param1 nvarchar(10),@param2 nvarchar(10))ASBeginSet NOCOUNT ON;Set XACT_ABORT ON;Begin TranDelete from table1 where name=’

SQL Server中存储过程比直接运行SQL语句慢的原因

原文:SQL Server中存储过程比直接运行SQL语句慢的原因 在很多的资料中都描述说SQLSERVER的存储过程较普通的SQL语句有以下优点: 1.       存储过程只在创造时进行编译即可,以后每次执行存储过程都不需再重新编译,而我们通常使用的SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度. 2.       经常会遇到复杂的业务逻辑和对数据库的操作,这个时候就会用SP来封装数据库操作.当对数据库进行复杂操作时(如对多个表进行 Update,Insert,Query

PostgreSQL 优势,MySQL 数据库自身的特性并不十分丰富,触发器和存储过程的支持较弱,Greenplum、AWS 的 Redshift 等都是基于 PostgreSQL 开发的

PostgreSQL 优势 2016-10-20 21:36 686人阅读 评论(0) 收藏 举报  分类: MYSQL数据库(5)  PostgreSQL 是一个自由的对象-关系数据库服务器(数据库管理系统),功能很强大.包括了可以说是目前世界上最丰富的数据类型的支持,比如 IP 类型和几何类型等等. 发现很多读者都问过这样一个问题:如果打算为项目选择一款免费.开源的数据库,那么你可能会在MySQL与PostgreSQL之间犹豫不定.针对这个问题,我们采访到了即将在Postgres中国用户20