语法:
create or replace function 函数名字(
参数1 数据类型(不能有长度),
参数2 数据类型(不能有长度),
参数3 数据类型(不能有长度)
)return 数据类型(没有长度)
is
参数4 数据类型(可以有长度);
参数5 数据类型(可以有长度);
begin
函数要执行的内容;
return 返回值;
end;
例子1:给定一个员工编号,查询员工的工资
create or replace function findSalFun(
eno emp.empno%type
)return emp.sal%type
is
v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=eno;
return v_sal;
end;
测试:
declare
v_sal emp.sal%type;
begin
v_sal:=findSalFun(7369);
--xxx:=length('abc');
--yyy:=to_char(,);
dbms_output.put_line(v_sal);
end;
set serveroutput on;
call findSalFun(7369);
函数还可以放在sql语句中调用
select empno,findSalFun(empno) from emp;
例子2:给定一个名字,根据名字,计算员工的税金
create or replace function computeFaxFun(
v_name emp.ename%type
)return emp.sal%type
is
v_sal emp.sal%type;
mid_sal emp.sal%type;
fax emp.sal%type;
begin
select sal into v_sal from emp where ename=v_name;
mid_sal:=v_sal - 3500;
if mid_sal<=0 or mid_sal is null then fax:=0;
elsif mid_sal<=1500 then fax:=mid_sal*0.03-0;
else fax:=mid_sal*0.45-13505;
end if;
return fax;
end;
测试
select empno,ename,sal,computeFaxFun(ename) fax from emp;
例子3:给员工编号,函数返回一行数据;
create or replace function findEmpInfoFun(
eno emp.empno%type
)return emp%rowtype
is
v_emp emp%rowtype;
begin
select * into v_emp from emp where empno=eno;
return v_emp;
end;
测试
sql语句中无法解析rowtype行对象,所以sql无法调用该函数
select findEmpInfoFun(empno) from emp;--报错
declare
eno emp.empno%type:=7369;
empinfo emp%rowtype;
begin
empinfo:=findEmpInfoFun(eno);
dbms_output.put_line(empinfo.empno||','||empinfo.ename||','||empinfo.sal);
end;
例子4:函数返回多行数据呢?
函数中,没有参数传入的时候,不能写小括号
create or replace function findallEmpFun return sys_refcursor
is
allemp sys_refcursor;
begin
open allemp for select * from emp;
return allemp;
end;
测试
declare
allemp sys_refcursor;
empinfo emp%rowtype;
begin
allemp:=findallEmpFun;
loop
fetch allemp into empinfo;
if allemp%notfound then exit;end if;
dbms_output.put_line(empinfo.empno||','||empinfo.ename||','||empinfo.sal);
end loop;
if allemp%isopen then close allemp; end if;
end;
过程与函数的区别:
1.关键字不一样,过程使用procedure,函数使用function
2.在过程中,所有的参数都放在小括号里面,通过in来表示传入的参数,通过out来表示返回的数据; 在函数中,小括号中放的都是传入的参数,也没有in/out的写法,返回的数据都通过return 来完成
3.在过程中,对于需要返回的结果,只需要存放到out修饰的参数里面就可以了 在函数中,过程语句执行完之后,必须通过return 返回执行结果
4.调用过程时,如果有返回数据,需要把变量放到过程的小括号中来接收结果; 调用函数的时候,则通过给变量赋值的方式来接收函数执行的结果
5.过程一般供程序调用,而函数一般由其他过程或者函数来调用