关于存储过程
来源:互联网 发布:什么软件可以录播 编辑:程序博客网 时间:2024/06/08 03:08
关于SQL存储过程的编写
首先,不同数据库的是SQL语法格式不同,相应的存储过程的编写格式也不一样;
所谓存储过程:
存储过程的概念
存储过程Procedure是一组为了完成特定功能的SQL语句集合,经编译后存储在数据库中,用户通过指定存储过程的名称并给出参数来执行。
存储过程中可以包含逻辑控制语句和数据操纵语句,它可以接受参数、输出参数、返回单个或多个结果集以及返回值。
由于存储过程在创建时即在数据库服务器上进行了编译并存储在数据库中,所以存储过程运行要比单个的SQL语句块要快。同时由于在调用时只需用提供存储过程名和必要的参数信息,所以在一定程度上也可以减少网络流量、简单网络负担。
1、 存储过程的优点
A、 存储过程允许标准组件式编程
存储过程创建后可以在程序中被多次调用执行,而不必重新编写该存储过程的SQL语句。而且数据库专业人员可以随时对存储过程进行修改,但对应用程序源代码却毫无影响,从而极大的提高了程序的可移植性。
B、 存储过程能够实现较快的执行速度
如果某一操作包含大量的T-SQL语句代码,分别被多次执行,那么存储过程要比批处理的执行速度快得多。因为存储过程是预编译的,在首次运行一个存储过程时,查询优化器对其进行分析、优化,并给出最终被存在系统表中的存储计划。而批处理的T-SQL语句每次运行都需要预编译和优化,所以速度就要慢一些。
C、 存储过程减轻网络流量
对于同一个针对数据库对象的操作,如果这一操作所涉及到的T-SQL语句被组织成一存储过程,那么当在客户机上调用该存储过程时,网络中传递的只是该调用语句,否则将会是多条SQL语句。从而减轻了网络流量,降低了网络负载。
D、 存储过程可被作为一种安全机制来充分利用
系统管理员可以对执行的某一个存储过程进行权限限制,从而能够实现对某些数据访问的限制,避免非授权用户对数据的访问,保证数据的安全。
实际开发中碰到的Sybase 和ORACLE 的存储过程。实例
Sybase:
create procedure PROC_EPTELWEB_LOGOUT
(
@PHONENUM VARCHAR(50), --企业总机号//传入参数
@RET_CODE tinyint output, //输出参数
@MSGTEXT varchar(255) output //输出参数
)
AS
begin
--将YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS
insert into YZF_REGI_INFO_HIS select * from YZF_REGI_INFO where PHONE_NUM=@PHONENUM
//如果执行出错,事物不会提交,并且设置好输出参数的值后,跳出并返回
if(@@error != 0)
begin
select @RET_CODE =1, @MSGTEXT ='将YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS失败'
return
end
--将YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS
insert into YZF_PAY_REC_HIS select * from YZF_PAY_REC where PHONE_NUM=@PHONENUM
if(@@error != 0)
begin
select @RET_CODE =1, @MSGTEXT ='将YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS 失败'
return
end
--删除表YZF_WEB_LOG中该总机的信息
delete from YZF_WEB_LOG where PHONE_NUM=@PHONENUM
if(@@error != 0)
begin
select @RET_CODE =1, @MSGTEXT ='删除表YZF_WEB_LOG中该总机的信息失败'
return
end
select @RET_CODE=0,@MSGTEXT='门户销户存储过程调用成功'
return
end
ORACLE
CREATE OR REPLACE PROCEDURE PROC_EPTELWEB_LOGOUT(
P_PHONENUM VARCHAR2, --企业总机号
RET_CODE out INTEGER ,
MSGTEXT out varchar2
)
AS
BEGIN
begin
--将YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS
insert into YZF_REGI_INFO_HIS
select * from YZF_REGI_INFO t where t.PHONE_NUM=P_PHONENUM;
exception when others then
RET_CODE :=1;
MSGTEXT :='将YZF_REGI_INFO表中该总机的信息复制到YZF_REGI_INFO_HIS失败';
return;
end;
begin
--将YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS
insert into YZF_PAY_REC_HIS
select * from YZF_PAY_REC t where t.PHONE_NUM=P_PHONENUM;
exception when others then
RET_CODE :=1;
MSGTEXT :='将YZF_PAY_REC表中该总机的信息复制到YZF_PAY_REC_HIS失败';
return
end;
begin
--删除表YZF_WEB_LOG中该总机的信息
delete from YZF_WEB_LOG t where t.PHONE_NUM=P_PHONENUM;
exception when others then
RET_CODE :=1;
MSGTEXT :='删除表YZF_WEB_LOG中该总机的信息失败';
return;
end;
begin
--删除表YZF_REGI_INFO中该总机的信息
delete from YZF_REGI_INFO t where t.PHONE_NUM=P_PHONENUM;
exception when others then
RET_CODE :=1;
MSGTEXT :='删除表YZF_REGI_INFO中该总机的信息失败';
return;
end;
RET_CODE:=0;
MSGTEXT:='门户网站用户销户成功';
END;
在DBArtisan中选中存储过程右击“excecute”,进入可视化执行窗口,其中输入一个传入参数值,点击执行即可调用并查看结果信息。
或者,用SQL语句也可以执行,Sybase的实力代码如下:
--run pro
DECLARE @PHONENUM VARCHAR(50)
DECLARE @RET_CODE tinyint
DECLARE @MSGTEXT varchar(255)
EXEC PROC_EPTELWEB_LOGOUT '077053862563',@RET_CODE output,@MSGTEXT output
//格式非常重要,注意仔细核对
select @RET_CODE,@MSGTEXT
另外,在一个存储过程中还可以调用另外一个存储过程,根据该存储过程的返回结果进行相应的处理,如果失败,还可以进行回滚,即取消之前的操作;
- 关于sql存储过程
- 关于xp_cmdshell存储过程
- 关于oracle存储过程
- 关于加密存储过程
- 关于存储过程优化
- 关于Sql存储过程
- 关于存储过程语法
- 关于存储过程
- 关于mysql存储过程~
- 关于 存储过程
- 关于oracle存储过程
- 关于存储过程
- 关于存储过程
- 关于存储过程
- 关于存储过程参数
- 关于MSSQLServer 存储过程分页
- 关于MSSQLServer 存储过程分页
- 关于存储过程的优缺点
- 将长秒数转成24小时制时间
- Xcode5 免证书真机调试
- C#遍历文件(夹)、读取tar.gz格式压缩文件,从文件名提取信息批量入数据库
- 神兽草泥马
- 调试一个新LCD
- 关于存储过程
- 13.分段分页方式的比较
- VisualSVN错误 Cannot query proxy blanket解决办法
- 关于python自增运算
- tomcat6 数据库连接池配置方法总结
- 小脚本の电脑语音
- 数据结构:最小生成树--Kruskal算法
- GIS地图在房地产中的应用
- ASP.NET——实现两个下拉框动态联动