关于存储过程的优缺点(来自百度百科,侵删)
优点:
1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3.存储过程可以重复使用,可减少数据库开发人员的工作量
4.安全性高,可设定只有某些用户才具有对指定存储过程的使用权
有一点需要注意的是,一些网上盛传的所谓的存储过程要比SQL语句执行更快的说法,实际上是个误解,并没有根据,包括微软内部的人也不认可这一点,所以不能作为正式的优点,希望大家能够认识到这一点。
缺点:
1:调试麻烦,但是用 PL/SQL Developer调试很方便!弥补这个缺点。
2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。
3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。
4: 如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的,维护起来更麻烦。
一个简单的存储过程:
CREATE OR REPLACE PROCEDURE T1.P_TEST1 ( --schema名.存储过程名
IN P_TNAME VARCHAR(8), --IN表示输入参数,OUT表示输出参数,INOUT表示输入输出参数
IN P_NAME VARCHAR(4) --指定过程的主体用的是SQL语言 )
SPECIFIC P_TEST1 --唯一的特定名称(别名),可以用存储过程名代替。
LANGUAGE SQL
BEGIN
/*
| Procedure name: P_TEST1
| Overview:
| Author(s): skull_ying12
| Modification History:
| Target table:
| Source table:
*/
--------自定义变量---------
DECLARE V_QUERY_STR CLOB(1M); --sql中要使用的变量必须先在前面定义好后使用
--编写自己的过程代码这里也可以调用其他的存储过程
set v_query_str ='select * from '||P_TNAME||' where P_NAME='''||P_NAME||'''';--这里通过输入参数动态拼接查询语句
immediately execute v_query_str;--执行查询语句
--编写自己的过程代码
END;
然后就可以通过call t1.p_test1;调用该存储过程来查询任何含有p_name字段的表了。如果编写的存储过程中有out型参数(create or replace procedure t1.p_test1(in p_tname varchar(8),out p_name varchar(2048))......),那么需要调用时,应该先声明out型参数:
begin
DECLARE aaa VARCHAR(2048);
call t1.p_test1('aaaa',aaa);
end;
如果发现错误,欢迎指正。以上。