比较1
创建存储过程的关键字是: procedure
创建函数的关键字是: function
比较2
存储过程的调用方式: 独立的调用语句,如:
begin
proc1;
end;
函数的调用方式: 以表达式方式调用,如:
declare
v_result number;
begin
v_result := func1;
end;
比较3
函数通过return语句返回函数值.
存储过程没有.
比较4
存储过程的目的: 完成一系列的数据处理.
函数的目的: 获得函数的返回值.
比较5
存储过程和函数都可以有一个或多个out(输出)参数.
存储过程可以通过out参数来实现返回值.
一般原则:
如果只有一个返回值,用函数处理.
比较6:
参数默认值:
存储过程和函数都可以在声明参数时,使用default关键字为输入参数指定默认值.
实例: 求部门的年收入
--求部门的年收入
create or replace function five_func
(
v_deptno in number default 10
)
return number
is
v_sumsal number;
begin
select sum((sal+nvl(comm,0))*12)
into v_sumsal
from emp
where deptno = v_deptno;
return v_sumsal;
exception
when no_data_found then
dbms_output.put_line('没有此部门!');
when others then
dbms_output.put_line(sqlerrm);
end;
--调用
declare
v_sumsal number;
begin
v_sumsal := five_func; --因为在创建函数时指定默认值,所有可以不传参数
dbms_output.put_line(v_sumsal);
end;
结果为: 105000
如果除了默认值以外还有其他参数,则可以使用 关联符号(=>) 为指定的参数赋值
对上面的例子做一个修改,除了默认参数外,再传入一个参数,并为指定的参数赋值.
--求部门的年收入
create or replace function five_func
(
v_deptno in number default 10,
v_test in number
)
return number
is
v_sumsal number;
begin
select sum((sal+nvl(comm,0))*12)
into v_sumsal
from emp
where deptno = v_deptno;
dbms_output.put_line('测试:' || v_test);--打印出传入的非默认值参数
return v_sumsal;
exception
when no_data_found then
dbms_output.put_line('没有此部门!');
when others then
dbms_output.put_line(sqlerrm);
end;
--调用
declare
v_sumsal number;
begin
v_sumsal := five_func(v_test => 1);--在创建函数时为第一个参数指定了默认值,第一个参数可以不传
dbms_output.put_line(v_sumsal);
end;
结果:
测试:1
105000