区别:1、存储过程用于在数据库中完成特定的操作或任务,而函数用于特定数据;2、存储过程的程序头部声明用PROCEDURE,声明时不需要返回类型,而函数的程序头部声明用FUNCTION,声明时要描述返回类型。
本教程操作环境:Windows7系统、Oracle 11g版、Dell G3电脑。
存储过程
存储过程(Stored Procedure )是一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。 存储过程是由流控制和SQL 语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,应用程序使用时只要调用即可。在ORACLE 中,若干个有联系的过程可以组合在一起构成程序包。
优 点:
1、存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
2、当对数据库进行复杂操作时(如对多个表进行Update、Insert、Query、Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
3、存储过程可以重复使用,可减少数据库开发人员的工作量。
4、安全性高,可设定只有某用户才具有对指定存储过程的使用权。
存储过程与函数的区别
二者最大的区别是:
1).函数(function)总是向调用者返回数据,并且一般只返回一个值;2).存储过程(procedure)不直接返回数据,但可以改变输出参数的值,这可以近似看作能返回值,且存储过程输出参数的值个数没有限制。
从一般应用上来看,如果不需要返回值或者需要多个返回值,使用存储过程,如果只用一个返回值,就使用函数。
2、function定义中只能有DDL(如select等)语句;procedure中主要是DML语句(对数据库进行复杂操作时,如对多个表进行Update、Insert、Query、Delete时)。
如果想要使用select的结果集,则要使用游标
存储过程 |
函数 |
用于在数据库中完成特定的操作或任务(如插入、删除等) |
用于特定数据(如查询返回值) |
程序头部声明用PROCEDURE |
程序头部声明用FUNCTION |
程序头部声明时不需要返回类型 |
程序头部声明时要描述返回类型,而且PL/SQL块至少要包括一个有效的RETURN语句 |
可以使用IN/OUT/IN OUT3种参数模式 |
可以使用IN/OUT/IN OUT3种参数模式 |
可以作为独立的PL/SQL语句执行 |
不能独立执行,必须作为表达式的一部分调用 |
可以通过OUT/IN OUT返回零个或多个值 |
对过RETURN语句返回一个值,且该值与声明部分一致,也可以通过OUT类型的参数带出变量 |
SQL语句(DML或SELECT)中不可以调用存储过程 |
SQL语句(DML或SELECT)中可以调用函数 |
实际举例
1、函数
(1)创建函数
create or replace function get_salary( dept_no number, emp_count **out** number) return number IS v_sum number;begin ...exception ...end get_salary
(2)调用函数
declare v_num number; v_sum number;begin ...(这里应该出现函数名表示调用)end
2、存储过程
(1)创建存储过程
create or replace procedure pro_demo( dept_no number default 10, sal_sum out number, emp_count out number) IS begin ... exception ... end proc_demo;
(2)调用存储过程
调用语法:
1)、exec <过程名>;
2)、execute <过程名>;
3)、在PL/SQL语句块中直接调用。
例如:
declare v_num number; v_sum number(8,2); begin procedure pro_demo(dept_no=>1,sal_num=>900,emp_count=>10)(这里出现存储过程名表示调用,传递参数值用=>) end;
3、本地存储过程
在PL/SQL中还可以在declare块中建立本地存储过程,而不使用关键字create,其目的是:不用将存储过程存储在数据库中,避免更改数据库时带来的麻烦,其主要的使用场景是,临时使用某个存储过程,而不是在以后要重复多次使用。
例子:
declare v_num number; v_sum number(8,2); procedure proc_demo( dept_no number default 10, sal_sum out number, emp_count out number) IS begin ...(这里不用出现存储过程名) exception ... end proc_demo;
推荐教程:《Oracle教程》