oracle 进阶(三) 函数的使用
函数
函数相当于 Java 中的有返回值函数,可以被其它模块反复调用,在调用的时候, 可以被作为表达式的一部分。必须要有返回值。这个返回值既可以是 number 或 varchar2 这样简单的数据类型,也可以是 PL/SQL 数组或对象这样复杂的数据类型。函数会在数据库中一直保留,直到被删除。
1、语法结构
CREATE [OR REPLACE] FUNCTION function_name
[arg1 [IN|OUT|IN OUT]] arg_type1,
[arg2 [IN|OUT|IN OUT]] arg_type2,
……
RETURN return_type
IS|AS
声明部分
BEGIN
执行部分
EXCEPTION
异常处理部分
END function_name;
说明:
RETURN 子句说明函数返回值的数据类型。
这是与过程的区别之一。
OR RELACE 是可选的。
如果省略,则创建时不允许数据库中有同名的函数;
如果使用,则会先删除同名的函数,然后创建新的函数。
arg1,arg2,…,argn 是函数的形参的名称,是可选的。
arg_type1, arg_type2,…,arg_typen 是对应的形参的数据类型,参数类型可以是基本的数据类型,也可以是 %type 或 %rowtype 匹配的数据类型,不能使用空值 null。
注意:此处的数据类型后面不能带参数,
即精度、范围等,如 NUMBER(12,2)只能写成 NUMBER,varchar2(20),只能写成 varchar2。
IN|OUT|IN OUT 是形参的模式。如果省略则为 IN 模式。
IN
用于接受调用程序的值 默认的参数模式
OUT
用于向调用程序返回值
IN OUT
用于接受调用程序的值,并向调用程序返回更新的值
2、示例
无参函数:
--创建函数,无参函数名后不要加括号
create or replace function func_first
return emp.ename%type
is
v_name emp.ename%type;
begin
select ename into v_name from emp where empno=7369;
return v_name;
end func_first;
有参数函数:
--创建函数
create or replace function func_find(
v_eno emp.empno%type
)
return number
is
v_ysal emp.sal%type;
begin
select nvl(sal,0)*12+nvl(comm,0) into v_ysal from emp where empno=v_eno;
return v_ysal;
end func_find;
3、执行
函数不能单独执行,在调用的时候, 只能作为表达式的一部分执行
--执行无参函数
declare
v_esal emp.sal%type;
v_name emp.ename%type;
begin
proc_find(func_first(),v_name,v_esal);
dbms_output.put_line(func_first()||v_name||'--'||v_esal);
v_name:=func_first();
dbms_output.put_line(v_name);
end;
--执行有参函数
declare
begin
dbms_output.put_line(func_find(7369));
end;
4、删除
语法
DROP FUNCTION function_name;
其中,function_name 是函数的名称。
--删除函数
drop function func_first;