oracle数据库对象-函数

函数的作用是计算一个功能,往往是用来计算并返回一个计算结果。

1、函数和存储过程的区别:
1)函数和过程比较类似,不同的是函数必须返回一个值,而过程仅是为了执行一系列的操作。

2)在调用的时候,函数可以作为表达式的一部分进行调用,并且可以使用在SELECT中。而过程只能作为一个PL/SQL语句进行调用,且不能在SELECT语句中使用。

3)函数的语法结构和过程比较类似,除了函数使用FUNCTION进行定义之外。外一个重要的特点就是,函数具有RETURN子句,指定函数的返回类型。

4)函数和存储过程都可以使用out参数来返回内容。

2、基本语法:

CREATE [OR REPLACE] FUNCTION function_name
[(parameter_name [IN | OUT | IN OUT]  TYPE[,....])]
RETURN TYPE
{IS | AS}
BEGIN
  FUNCTION BODY
END function_name;



例子:计算税率

--/
CREATE OR REPLACE FUNCTION sal_tax
  (v_sal number)
  return number
is
begin
  if (v_sal < 2000) then
    return 0.10;
  elsif (v_sal < 2750) then
    return 0.15;
  else
    return 0.20;
  end if;
end;
/


调用:

select sal_tax(2000) from dual;

例子2:

--/
CREATE OR REPLACE FUNCTION get_emp_name (v_no in NUMBER)
RETURN VARCHAR2
IS
  v_tmp emp%rowtype;
BEGIN
  select * into v_tmp from emp where empno = v_no;
  return v_tmp.ename;
END;
/


调用:

select get_emp_name(7839) from dual;

3、参数传递方式
在调用子程序的时候,可以有两种向子程序中传递实际参数的方式:
一种是我们在之前使用的位置传递,还有一种就是名称传递。二者的混合使用我们称作混合传递。

大部分情况下我们使用的都是位置传递方式,只要传输的实际参数的位置匹配形式参数的位置定义即可:
COMPARE(V_N1, V_N2, V_COMPARE);

还可以使用名称传递的方式,这种方法也称作关联的操作符,把左边的实参和右边的形参关联起来:
COMPARE(N1 => V_N1, N2 => V_N2, N3 => V_COMPARE);

混合/组合传递:
COMPARE(V_N1, N3 => V_COMPARE, N2 => V_N2);

4、函数小结
--函数必须要有return返回值
--函数的参数是可选的,如果参数不存在,不要加()
--函数中一般不会用dbms_output.put_line打印信息,因为函数是用来计算并返回一个计算结果的,当然加了打印也没关系
例子:

--/
CREATE OR REPLACE FUNCTION hello RETURN VARCHAR2 IS
var VARCHAR2(40) := 'hello function';
BEGIN
--dbms_output.put_line('aaaaaaaaaaa');
return var;
END;
/

select hello() from dual;