码迷,mamicode.com
首页 > 其他好文 > 详细

存储过程与函数的区别

时间:2015-08-27 17:58:34      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

不同点:
1、标识符不同。函数的标识符为FUNCTION,过程为:PROCEDURE。
2、函数中有返回值,且必须返回,而过程没有返回值。
3、过程无返回值类型,不能将结果直接赋值给变量;函数有返回值类型,调用时,除在select中,必须将返回值赋给变量。
4、函数可以在select语句中直接使用,而过程不能,例如:假设已有函数fun_getAVG() 返回number类型绝对值。那么select fun_getAVG(col_a) from table 这样是可以的。

相同点:
二者都可以有出参

 

本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。
     函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少 
      1.    一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。
      2.    对于存储过程来说可以返回参数,而函数只能返回值或者表对象。
      3.    存储过程一般是作为一个独立的部分来执行(EXEC执行),而函数可以作为查询语句的一个部分来调用(SELECT调用),由于函数可以返回一个表对象,因此它可以在查询语句中位于FROM关键字的后面。
      4.    当存储过程和函数被执行的时候,SQL Manager会到procedure cache中去取相应的查询语句,如果在procedure cache里没有相应的查询语句,SQL Manager就会对存储过程和函数进行编译。
      Procedure cache中保存的是执行计划 (execution plan) ,当编译好之后就执行procedure cache中的execution plan,之后SQL SERVER会根据每个execution plan的实际情况来考虑是否要在cache中保存这个plan,评判的标准一个是这个execution plan可能被使用的频率;其次是生成这个plan的代价,也就是编译的耗时。保存在cache中的plan在下次执行时就不用再编译了。

 

存储过程和函数目的是为了 可重复地 执行操作数据库的sql语句的集合。

区别是写法和调用上。

写法上:存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数;

            函数的参数列表只有输入参数,并且有return <返回值类型,无长度说明>。

返回值上:

    存储过程的返回值,可以有多个值,

           函数的返回值,只有一个值。

调用方式上:

    存储过程的调用方式有:

1)、exec <过程名>;

2)、execute <过程名>;

3)、在PL/SQL语句块中直接调用。

            函数的调用方式有:

      在PL/SQL语句块中直接调用。

                 具体分为:

  ----调用FUNCTION add_three_numbers

  ----1. 位置表示法调用函数

  BEGIN

  dbms_output.put_line(add_three_numbers(2,4,5));

  END;

  ----2. 命名表示法调用函数

  BEGIN

  dbms_output.put_line(add_three_numbers(b=>3, a=>4,c=>2));

  END;

  ----3. 混合使用位置表示法和命名表示法调用函数

  BEGIN

  dbms_output.put_line(add_three_numbers(3, b=>4,c=>2));

  END;

  ----4. 排除表示法

  BEGIN

  dbms_output.put_line(add_three_numbers(12,c=>2));

  END;

  ----5. sql调用表示法 --混合表示法

  SELECT add_three_numbers(3, b=>4,c=>2) FROM DUAL;

 

----1. 该函数接受3个可选参数,返回3个数字的和

  CREATE OR REPLACE FUNCTION add_three_numbers

  (

  a NUMBER:=0, b NUMBER:=0, c NUMBER:=0

  )

  RETURN NUMBER IS

  BEGIN

  RETURN a+b+c;

  END;

      

存储过程:

基本语法:

create procedure <过程名>(<参数列表,无参时忽略>)

as|is

变量声明、初始化

begin

业务处理、逻辑代码

exception

异常捕获、容错处理

end <过程名>;

参数:<参数名> in|out|in out <参数类型,无长度说明> ,如:v_name varchar2

in:入参

out:出参

in out:出入参

注:as|is表示as或is

调用语法:

1)、exec <过程名>;

2)、execute <过程名>;

3)、在PL/SQL语句块中直接调用。

例:

create or replace procedure up_wap(v_param1 in out varchar2,v_param2 in out varchar2)

is

v_temp varchar2(20);

begin

dbms_output.put_line(‘交换前参数1:‘||v_param1||‘ 参数2:‘||v_param2);

v_temp:=v_param1;

v_param1:=v_param2;

v_param2:=v_temp;

dbms_output.put_line(‘交换后参数1:‘||v_param1||‘ 参数2:‘||v_param2);

exception

when others then dbms_output.put_line(‘There is a error when the procedure up_wap executing!‘);

end up_wap;

/

-- 调用存储过程

declare

v_param1 varchar2(20):=‘param1‘;

v_param2 varchar2(20):=‘param2‘;

begin

up_wap(v_param1 => v_param1,v_param2 => v_param2);

end;

/

 

 自定义函数(function)

基本语法:

create function <函数名>(<参数列表,无参时忽略>)

return <返回值类型,无长度说明>

as|is

变量声明、初始化

begin

业务处理、逻辑代码

return <返回的值>;

exception

异常捕获、容错处理

end <函数名>;

参数:in 入参

注:只有入参的类型。

在存储过程和自定义函数中的参数的传递(入参和出参)不能使用%type或%rowtype匹配,不能使用空值null,但是存储过程可以返回空值。

例:

create function uf_select_name_by_id_test(v_id in number)

return varchar2

is

v_name t_test.t_name%type;

begin

select t_name into v_name from t_test where t_id=v_id;

return v_name;

exception

when others then dbms_output.put_line(‘error‘);

end uf_select_name_by_id_test;

/

select uf_select_name_by_id_test(1) 姓名 from dual;-- select调用

declare --pl/sql语句块调用

v_name varchar2(20);

begin

v_name:=uf_select_name_by_id_test(1);

dbms_output.put_line(‘name = ‘||v_name);

end;

/

 

存储过程与函数的区别

标签:

原文地址:http://www.cnblogs.com/ROCKyou/p/4763809.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!