一、什么是存储过程:
存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
特点:(1)sql语句集 (2)预编译
二、为什么使用存储过程:
存储过程说白了就是一堆 SQL 的合并。中间加了点逻辑控制。 但是存储过程处理比较复杂的业务时比较实用。比如说,一个复杂的数据操作。如果你在前台处理的话。可能会涉及到多次数据库连接。但如果你用存储过程的话。就只有一次。从响应时间上来说有优势。也就是说存储过程可以给我们带来运行效率提高的好处。数据与数据之间打交道的话,过程会比程序来的快的多。存储过程不仅仅适用于大型项目,对于中小型项目,使用存储过程也是非常有必要的。
其威力和优势主要体现在: 1.存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。 2.当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序来完成,就变成了一条条的 SQL 语句,可能要多次连接数据库。而换成存储,只需要连接一次数据库就可以了。 3.存储过程可以重复使用,可减少数据库开发人员的工作量。 4.安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
存储过程的缺点 1:调试麻烦,但是用 PL/SQL Developer 调试很方便!弥补这个缺点。 2:移植问题,数据库端代码当然是与数据库相关的。但是如果是做工程型项目,基本不存在移植问题。 3:重新编译问题,因为后端代码是运行前编译的,如果带有引用关系的对象发生改变时,受影响的存储过程、包将需要重新编译(不过也可以设置成运行时刻自动编译)。 4:如果在一个程序系统中大量的使用存储过程,到程序交付使用的时候随着用户需求的增加会导致数据结构的变化,接着就是系统的相关问题了,最后如果用户想维护该系统可以说是很难很难、而且代价是空前的。维护起来更加麻烦!
三、如何使用存储过程:
存储过程和存储函数的区别:是否通过return语句返回参数值,存储函数会通过return返回参数值,除此之外可将其看作一样。
存储过程只能创建和替换,而不能修改。
(1)pl/sql 创建并执行oralce存储过程,并返回结果集
参考网址:http://blog.csdn.net/kimizhou_blog/article/details/39340851
感觉这篇文章对于初学者还是比较有用的
(2)创建存储过程以及调用
结果执行成功--新建一个表 CREATE TABLE user_info ( id VARCHAR2(4), name VARCHAR2(15), pwd VARCHAR2(15), address VARCHAR2(30) ); --创建存储过程 CREATE OR REPLACE PROCEDURE AddNewUser ( n_id user_info.id%TYPE, n_name user_info.name%TYPE, n_pwd user_info.pwd%TYPE, n_address user_info.address%TYPE ) AS BEGIN --向表中插入数据 INSERT INTO user_info(id,name,pwd,address) VALUES(n_id,n_name,n_pwd,n_address); END AddNewUser; / DECLARE --描述新用户的变量 v_id user_info.id%TYPE := 'u002'; v_name user_info.name%TYPE := 'wish'; v_pwd user_info.pwd%TYPE := 'history'; v_add user_info.address%TYPE := 'shanghai'; BEGIN --调用过程,添加wish用户到数据库 AddNewUser(v_id,v_name,v_pwd,v_add); DBMS_OUTPUT.PUT_LINE('用户 ' || v_name || ' 已经成功插入'); END; / call addnewuser('u001','eqwe','dqawhq','beijing'); select * from user_info;
但是,使用exec addnewuser('u001','eqwe','dqawhq','beijing');报错,显示pl-sql语法错误。
(3)比较exec/execute 和 call 调用存储过程
exec是sqlplus的命令,只能在sqlplus中使用。 call是sql命令,任何工具都可以使用(小白的人生太过艰难(┬_┬)总算是知道今天死在那块了)begin...end表示一段代码块,如果需要通过一定过程编程来调用存储过程,则要用begin...end
。。。未完待续