Oracle存储函数,存储过程

一、Oracle存储函数:存储的PL/SQL语法块,完成特定的功能。
1、语法: 函数关键字: function

(1)创建函数

CREATE [OR REPLACE] FUNCTION  <function name> [(param1,param2)] RETURN <datatype>  IS|AS 
     [local declarations]
declare 
  .....
BEGIN
  Executable Statements;
  RETURN result;
EXCEPTION
  Exception handlers;
END;

(2)调用函数

--调用
--1.写查询调用
select fun1 from dual;
--2.PL/SQL语法块调用
declare
my_name varchar2(20);
begin
my_name := fun1;
dbms_output.put_line(my_name);
end;

2、函数的参数模式


(1)输入参数 in:
--有参的函数

create or replace function fun2(s_id number) return varchar2
as
t_name varchar2(20);
begin
  select sname into t_name from stu where sid = s_id;
  return t_name;
end;

select fun2(4) from dual;

例:输入in与输出out参数

create or replace function fun2(t_id number,t_name out varchar2) return varchar2
as
begin
  select sname into t_name from stu where sid = t_id;
  return t_name;
end;

declare
stu_name varchar2(20);
my_name varchar2(20);
begin
  stu_name := fun2(1,my_name);
  dbms_output.put_line(stu_name);
end;

(2)in out参数  

create or replace function fun3(num1 in out number,num2 in out number) return varchar2
as
t_temp number;
begin
 t_temp := num1;
 num1 := num2;
 num2 := t_temp;
 return num1 + num2;
end;

declare
 numa number := 10;
 numb number := 20;
 numc number;
begin
 dbms_output.put_line(numa || '--'||numb);
 numc := fun3(numa,numb);
 dbms_output.put_line(numa || '--'||numb);
end;

注意:1、参数要为变量,定值返回时无法赋值。

   2、函数return要有返回值 就是end之前return语句,当调用函数时还需要声明一个变量接受返回值,即使没有使用。

规范:参数v开头,如v_name,临时变量t_name (temp_name)。

二、Oracle存储过程

Oracle存储过程:将执行的过程存储起来就是存储过程。
1、语法 :存储过程关键字 procedure

CREATE [OR REPLACE] procedure <procedure name> [(param1,param2)] IS|AS 
[local declarations]
BEGIN
Executable Statements;
EXCEPTION
Exception handlers;
END;

参数用法和存储函数一样
调用:略有不同
1.PL/SQL语法块
2.命令行 使用 execute 命令去调用  如 execute procedure_name(param1,param2);

三、区别

存储过程和存储函数的区别:
1、存储函数有返回值,存储过程没有返回值
2、调用方式略有不同.. 函数和过程都支持 pl/sql调用
      函数支持 (select)查询直接调用 过程支持 execute 命令调用
3、存储过程是否可以代替存储函数? 可以代替,但是兼容性问题,存储过程后出现 。之前的项目要支持。

 存储函数有时更加方便,可以直接select查询调用,

--视图配合存储函数

create or replace view emp_v as
select e.*,yearsal(e.sal,e.comm) as "年薪" from emp e;
--计算年薪的存储函数
create or replace function yearsal(v_sal number,v_comm number) return number as
t_year number;
begin
t_year := v_sal*12+nvl(v_comm,0);
return t_year;
end;
美好生活
原文地址:https://www.cnblogs.com/ssbydk/p/function_procedure.html