
1. 认识存储过程
存储过程是Oracle开发者在数据转换或查询报表时最经常使用的方式之一。
1. 1. 什么是存储过程
存储过程就是存储在数据库服务器中的一段封装的一段或多端SQL语句的PL/SQL代码块。
1.2 存储过程的作用
存储过程编写相对比较复杂,但很多单位或个人都在使用它。显然这不是因为存储过程编写简单,而是因为它一系列的有点:
简化复杂的操作。存储过程可以把需要执行的多条SQL与复杂的业务逻辑封装到一个独立的单元中。
增加数据的独立性 。 利用存储过程可以把数据库基础数据和程序(或用户)隔离开来。
提高安全性(存储过程的权限设置,SQL执行的错误几率)
提高性能(一次编译)如果是普通的SQL每次都需要编译
1.3 存储过程的语法
语法格式:
create [or replace] procedure [schema.] procedure_name [([parameter_name [in|out] datatype,[parameter_name [in|out] datatype]])] --参数列表in,out 数据类型不能有长度限制 可选操作(可以没有参数) [v_name varchar2(50)] -- 声明部分,声明变量,数据类型加长度限制{is|as} --关键字begin --执行部分[exception]--例外(异常)end;
2. 存储过程的实例
2.1无参数的存储过程
实例1: 输出Hello PL/SQL
create or replace procedure helloPLSQLisbegin dbms_output.put_line('Hello PL/SQL');end;
2.2 有参数的存储过程
实例2: 根据员工编号,更新员工工资
create or replace procedure update_empSal( eNo number--员工编号 ,eSal number--新工资 )isbegin update emp set sal=eSal where empno=eNo;--跟新操作 commit;--提交事务end;
2.3 带例外处理的存储过程
案例3: 根据员工编号,查找员工,输出员工姓名,可能该员工不存在。
create or replace procedure selByEmpNo_pro( eNo number--员工编号 ) is v_ename emp.ename%type;begin select ename into v_ename from emp where empno=eNo; dbms_output.put_line('雇员编号为:'||eNo||'的雇员名称为:'||v_ename); exception when no_data_found then dbms_output.put_line('雇员编号为:'||eNo||'的雇员不存在'); when too_many_rows then dbms_output.put_line('雇员编号为:'||eNo||'的雇员太多');end;
2.4 存储过程与函数的区别
Oracle中的函数与存储过程的区别: A:函数必须有返回值,而过程没有. B:函数可以单独执行.而过程必须通过execute执行. C:函数可以嵌入到SQL语句中执行.而过程不行. 其实我们可以将比较复杂的查询写成函数.然后到存储过程中去调用这些函数. Oracle中的函数与存储过程的特点: A. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 B.对于存储过程来说可以返回参数,而函数只能返回值或者表对象。 C.存储过程一般是作为一个独立的部分来执行,而函数可以作为查询语句的一个部分来调用,由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
2.5 存储过程的优点
使用存储过程的好处
相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处:
(1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。
(2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。
(3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。
(4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。
优点:
1.由于应用程序随着时间推移会不断更改,增删功能,T-SQL过程代码会变得更复杂,StoredProcedure为封装此代码提供了一个替换位置。
2.执行计划(存储过程在首次运行时将被编译,这将产生一个执行计划-- 实际上是 Microsoft SQL Server为在存储过程中获取由 T-SQL 指定的结果而必须采取的步骤的记录。)缓存改善性能。
........但sql server新版本,执行计划已针对所有 T-SQL 批处理进行了缓存,而不管它们是否在存储过程中,所以没比较优势了。
3.存储过程可以用于降低网络流量,存储过程代码直接存储于数据库中,所以不会产生大量T-sql语句的代码流量。
4.使用存储过程使您能够增强对执行计划的重复使用,由此可以通过使用远程过程调用 (RPC) 处理服务器上的存储过程而提高性能。RPC 封装参数和调用服务器端过程的方式使引擎能够轻松地找到匹配的执行计划,并只需插入更新的参数值。
5.可维护性高,更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。
6.代码精简一致,一个存储过程可以用于应用程序代码的不同位置。
7.更好的版本控制,通过使用 Microsoft Visual SourceSafe 或某个其他源代码控制工具,您可以轻松地恢复到或引用旧版本的存储过程。
8.增强安全性:
a、通过向用户授予对存储过程(而不是基于表)的访问权限,它们可以提供对特定数据的访问;
b、提高代码安全,防止 SQL注入(但未彻底解决,例如,将数据操作语言--DML,附加到输入参数);
c、SqlParameter 类指定存储过程参数的数据类型,作为深层次防御性策略的一部分,可以验证用户提供的值类型(但也不是万无一失,还是应该传递至数据库前得到附加验证)。
缺点:
1.如果更改范围大到需要对输入存储过程的参数进行更改,或者要更改由其返回的数据,则您仍需要更新程序集中的代码以添加参数、更新 GetValue() 调用,等等,这时候估计比较繁琐了。
2.可移植性差
由于存储过程将应用程序绑定到 SQL Server,因此使用存储过程封装业务逻辑将限制应用程序的可移植性。如果应用程序的可移植性在您的环境中非常重要,则将业务逻辑封装在不特定于 RDBMS 的中间层中可能是一个更佳的选择。
区别一,存储过程保存在数据库里面,存储过程可以被连接此数据库的所有程序设计语言和程序使用,自定义函数不能。
区别二,存储过程可以有数据库管理软件修改,使得多层结构程序调整系统逻辑时,并不需要编译和分发程序。
区别三,存储过程执行中,不会引起网络流量,不占用程序服务器的内存和CPU资源。




