建立存储过程
来源:互联网 发布:oracle分批导出数据 编辑:程序博客网 时间:2024/06/08 06:33
存储过程
use EBuy
go
--常用的系统存储过程
sp_addmessage --将新的用户定义错误消息存储在SQL Server数据库实例中
sp_helptext --显示用户定义的规则、默认值、存储过程、函数、视图等对象的实际文本
sp_xml_preparedocument --读取作为输入提供的XML文本,然后使用MSXML分析器对其进行分析,并提供分析后的文档供使用
sp_helpdb 'EBuy' --查看指定数据库的信息
sp_databases --列出服务器上的所有数据库
sp_server_info --列出服务器信息,如字符集、版本和排列顺序等
sp_stored_procedures --列出当前环境中的所有存储过程
sp_configure --修改SQL Server全局配置选项
sp_adduser --向当前数据库中添加新的用户
sp_addrole --在当前数据库中创建新的数据库角色
--用户自定义存储过程
create table users(
idint primary key,
namevarchar(20) not null,
pwdvarchar(20) not null
)
insert into usersvalues(1,'zhangsan','zhang01')
go
create procedure addUser --创建存储过程(procedure可以简写为proc)
@idint,
@namevarchar(20),
@pwdvarchar(20)
as
begin
insert into users(id,name,pwd)values(@id,@name,@pwd)
end
exec addUser 2,'lisi','lisi01' --执行存储过程(实参传递的顺序和所对应的形参顺序必须一致)
exec addUser@name='wangwu',@pwd='wang01',@id=3 --执行存储过程,这种方式顺序可以不一致
declare @v_id int,@v_namevarchar(20),@v_pwd varchar(20)
set@v_id=5
set@v_name='zhaoliu2'
set@v_pwd='zhao022'
exec addUser @v_id,@v_name,@v_pwd --执行存储过程,调用存储过程并传递变量参数(顺序必须与定义变量的顺序一致)
select * from users
--制定默认值
use Study
if exists(select * from sys.all_objectswhere name='increaseCredit' and type='P')
dropprocedure increaseCredit
go
create proc increaseCredit
@stuNamechar(6)=null, --指定null为默认值
@creditint = 3 --制定整数值3为默认值
as
begin
if @stuName=null
begin
print '没有指定学号,更新无法完成'
return
end
updatestudent set credit=credit+@credit where stuName=@stuName
end
exec increaseCredit '程琳',5 --提供所有参数
exec increaseCredit '程琳' --提供部分参数,则第二个参数使用默认值3
--指定参数方向
if exists(select name from sys.all_objectswhere name='avgCreditForMajor' and type='P')
dropproc avgCreditForMajor
create proc avgCreditForMajor
@majorIdint, --输入参数
@avgdecimal(4,1) output --输出参数
as
select@avg=avg(credit) from student where majorId=@majorId
go
declare @avgCredit decimal(4,1)
exec avgCreditForMajor 1,@avgCreditoutput --将输出的返回值保存在@avgCredit变量中,注意输出参数也必须指定output关键字
print('专业平均学分:'+cast(@avgCredit as varchar)) --显示储存过程的返回值
go
--使用return语句
use EBuy
if exists(select name from sys.all_objectswhere name='checkCity' and type='P')
dropproc avgCreditForMajor
create proc checkCity
@cusidvarchar(20)
as
if(selectaddress from customer where cusId=@cusid) like '%上海%'
return 1
elseif(select address from customer where cusId=@cusid) not like '%上海%'
return 2
else
return 3
declare @ret_status int
exec @ret_status=checkCity '1001' --客户住在上海
select @ret_status as '返回状态'
declare @ret_status int
exec @ret_status=checkCity '1004' --客户不住在上海
select @ret_status as '返回状态'
declare @ret_status int
exec @ret_status=checkCity '13204' --客户不存在的情况
select @ret_status as '返回状态'
--事物和错误处理
create proc procTest
as
declare@num int
select@num=9
begintry
while @num>0
begin
printconvert(varchar,sqrt(@num))
select@num=@num-1
if@num=5
raiserror('基数已小于6',16,1)
end
endtry
begincatch
print '放生错误的是:'+convert(varchar,error_procedure())
print '错误编号:'+convert(varchar,error_number())
print '错误描述:'+convert(varchar,error_message())
print '错误级别:'+convert(varchar,error_severity())
print '错误位于:'+convert(varchar,error_line())
print '错误状态:'+convert(varchar,error_state())
endcatch
go
exec procTest --执行存储过程
--存储过程中的事务
use EBuy
create table account(
accIdint,
typevarchar(10),
balancedecimal(10,2)
)
insert into accountvalues(33,'savings',3000)
insert into accountvalues(33,'checking',1500)
if exists(select name from sys.all_objectswhere name='savingsToChecking' and type='P')
dropproc savingsToChecking
go
create proc savingsToChecking
@accidint,
@numdecimal(10,2)
as
declare@bal decimal(10,2)
begintry
select @bal=balance from account whereaccId=@accid and type='savings'
if @num>@bal
return1
begin tran
updateaccount set balance=balance-@num where accId=@accid and type='savings'
updateaccount set balance=balance+@num where accId=@accid and type='checking'
commit tran
return 0
endtry
begincatch
rollback tran
return 2
endcatch
go
declare @retCode int
begin
exec@retCode=savingsToChecking 33,1500
if@retCode=0
print '转账成功'
elseif @retCode=1
print '转账金额大于账面余额,转账失败'
else
print '数据库发生错误,转账失败'
end
--存储过程的查看、修改和删除
sp_helptext 'savingsToChecking' --查看存储过程
alter proc savingsToChecking
@accidint, --此处可以修改参数的定义
@numdecimal(10,2)
drop proc savingsToChecking --删除存储过程
--重新编译存储过程
sp_recompile savingsToChecking
--2
create proc savingsToChecking
@accidint,
@numdecimal(10,2)
with recompile --创建存储过程的时候指定
as
......
--3
exec savingsToChecking 33,1500 withrecompile
- 建立存储过程
- 存储过程 p_bomGroup 建立语句
- 建立Job执行存储过程
- 建立存储过程时,提示存储过程名无效
- 存储过程之一—建立简单的存储过程
- sybase存储过程的建立和使用
- 一个建立存储过程的例子
- 建立定时JOB执行存储过程
- sql建立存储过程及调用
- 用sql存储过程建立账户
- Oracle 建立存储过程 以及jdbc调用
- 在mysql workbench中建立存储过程
- Sybase存储过程的建立和使用
- 存储过程 建立临时表 通过循环
- Oracle 中存储过程的建立
- Mysql存储过程_一次性建立多张表
- 【Mysql】建立第一个存储过程
- 数据库建立存储过程的意义
- 一道java面试题
- VirtualBox中为Fedora16分配数据空间
- 优先队列 队列 栈 的使用方法
- Linux中的SUID/SGID
- 黑马程序员__集合框架
- 建立存储过程
- OpenCV2.3.1安装误区解释
- 经典人生感悟 看看你少了那一条!?
- 多年积累的20条编程经验
- document.createElement()的参数问题
- 使用android的bitmap类实现图片的拼接
- Fedora 15/16 安装后需要做的28件事
- FreeBSD下的PF 安装与使用
- 语言那点事,crt