存储过程和事务

上一篇 / 下一篇  2014-06-09 16:19:51 / 个人分类:数据

存储过程

为什么使用存储过程

1.      高效率

创建时编译一次即可,以后不需编译,调用更快。

 

2.      可重复使用

可多处调用,减少数据工作人员的工作量。

 

3.      安全性较高

只有特定权限的用户才具有指定存储过程的操作权限

 

4.      可处理复杂数据,避免多次连接数据库,减少网络流量

查询多表时,将多条sql语句组合,避免多次连接数据库。相应时间有优势。

网络中只使用调用语句,从而也减少了网络流量,降低了网络负载。

 

5.      稳定性更好

程序容易出现bug问题,存储过程只要数据库不出现问题,基本不会有什么问题,所以相比较而言会稳定一些。

 

6.      可任意修改

数据库专业人士可任意修改存储过程,存储过程对于源代码几乎无影响,这样便提高了程序的可移植性。

 

不倾向于尽可能使用存储过程   

1. 运行速度:  大多数高级的数据库系统都有statement   cache的,所以编译sql的花费没什么影响。但是执行存储过程要比直接执行sql花费更多(检查权限等),所以对于很简单的sql,存储过程没有什么优势。 

  

2.  网络负荷:如果在存储过程中没有多次数据交互,那么实际上网络传输量和直接sql是一样的。

    

3.  团队开发:很遗憾,比起成熟的IDE,没有什么很好存储过程的IDE工具来支持,也就是说,这些必须手工完成。

    

4.  安全机制:对于传统的C/S结构,连接数据库的用户可以不同,所以安全机制有用;但是在web的三层架构中,数据库用户不是给用户用的,所以基本上,只有一个用户,拥有所有权限(最多还有一个开发用户)。这个时候,安全机制有点多余。

    

5.      用户满意:实际上这个只是要将访问数据库的接口统一,是用存储过程,还是EJB,太大关系,也就是说,在三层结构中,单独设计出一个数据访问层,同样能实现这个目标。

 

6.      开发调试:一样由于IDE的问题,存储过程的开发调试要比一般程序困难(老版本DB2还只能用C写存储过程,更是一个灾难)。 

7.       移植性:算了,这个不用提,反正一般的应用总是绑定某个数据库的,不然就无法靠优化数据库访问来提高性能了。

 

8.      维护性:的确,存储过程有些时候比程序容易维护,这是因为可以实时更新DB端的存储过程,但是在3层结构下,更新server端的数据访问层一样能实现这个目标,可惜现在很多平台不支持实时更新而已。 

  

缺点

1. 调试麻烦,但是用PL/SQL Developer调试很方便!弥补这个缺点。

 

2. 移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。

 

3. 重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。

 

4.如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。

语法

GO用于在SSMSSQLCMD中将其之前的T-SQL语句作为一个批处理提交给SQL Server实例。GO不是T-SQL语句,只是由这些特定客户端指定的提交批处理的方式。

 

AS其实是关键字,在存储过程中可以理解为将其下(到GO)的T-SQL语句,定义为存储过程。

 

create procedure sp_name

@[参数名] [类型],@[参数名] [类型]

as

begin

.........                                                    

end

以上格式还可以简写成:

create proc sp_name

@[参数名] [类型],@[参数名] [类型]

as

begin

.........

end

/*注:“sp_name”为需要创建的存储过程的名字,该名字不可以以阿拉伯数字开头*/

 

调用存储过程execute

基本语法:exec sp_name [参数名]

 

删除存储过程

1.基本语法:

drop procedure sp_name

2.注意事项

(1)不能在一个存储过程中删除另一个存储过程,只能调用另一个存储过程

 

其他常用命令

1.show procedure status

显示数据库中所有存储的存储过程基本信息,包括所属数据库,存储过程名称,创建时间等

2.show create procedure sp_name

显示某一个mysql存储过程的详细信息

3exec sp_helptext sp_name

显示你这个sp_name这个对象创建文本

常用系统存储过程

execsp_databases; --查看数据库
execsp_tables;        --查看表
execsp_columns student;--查看列
execsp_helpIndex student;--查看索引
execsp_helpConstraint student;--约束
execsp_stored_procedures;
execsp_helptext'sp_stored_procedures';--查看存储过程创建、定义语句
execsp_rename student, stuInfo;--修改表、索引、列的名称
execsp_renamedb myTempDB, myDB;--更改数据库名称
execsp_defaultdb'master','myDB';--更改登录名的默认数据库
execsp_helpdb;--数据库帮助,查询数据库信息
execsp_helpdb master;


系统存储过程示例:

--表重命名
execsp_rename'stu','stud';
select*fromstud;
--
列重命名
execsp_rename'stud.name','sName','column';
execsp_help'stud';
--
重命名索引
execsp_rename N'student.idx_cid', N'idx_cidd', N'index';
execsp_help'student';

--
查询所有存储过程
select*fromsys.objectswheretype ='P';
select*fromsys.objectswheretype_desclike'%pro%'andnamelike'sp%';

 

Ø用户自定义存储过程

   1创建语法

createproc|procedurepro_name
    [{@
参数数据类型} [=默认值] [output],
     {@
参数数据类型} [=默认值] [output],
     ....
    ]
as
    SQL_statements

 

   2创建不带参数存储过程

--创建存储过程
if(exists(select*fromsys.objectswherename ='proc_get_student'))
   
dropprocproc_get_student
go
createprocproc_get_student
as
   
select*fromstudent;

--
调用、执行存储过程
execproc_get_student;

 

   3修改存储过程

--修改存储过程
alterprocproc_get_student
as
select*fromstudent;

 

   4带参存储过程

--带参存储过程
if(object_id('proc_find_stu','P')isnotnull


TAG: 事务 存储过程

 

评分:0

我来说两句

Open Toolbar