北在北方

太白枝头看,花开不计年,杯中浮日月,楼外是青天。

导航

Oracle Function

Posted on 2012-08-15 12:01  CN.programmer.Luxh  阅读(1751)  评论(1编辑  收藏  举报

基本语法如下所示

CREATE OR REPLACE FUNCTION <function_name> [(<parameters>)] 
RETURN <datatype> IS [declare section] 
BEGIN
     [<statement(s)>]
RETURN <expression>;
[EXCEPTION <exception handler(s);]
END [<function_name>];

  从上面的格式可以看出:

  1)Function必须要有一个名字<function_name>;

  2)可能有一个或多个参数;

  3)必须指定返回值的类型<datatype>;

  4)函数体用关键字BEGIN和END包含,必须要有RETURN返回值;

 

一些简单的例子

  1、一个获取名字的函数,直接返回字符串

CREATE OR REPLACE FUNCTION fun_getMyName
RETURN varchar2 is
BEGIN
     RETURN 'Luxh';
END; 

  调用:

select fun_getMyName from dual;
--或者
select fun_getMyName() from dual;

  2、给定雇员ID,从雇员表中计算税收和保险的扣除函数。这个函数包含一个参数、一个本地变量描述和异常处理。

CREATE OR REPLACE FUNCTION fun_deductions(emp_id NUMBER)--emp_id接收输入参数
RETURN NUMBER IS
  total_deductions NUMBER;--定义返回的变量
BEGIN
     SELECT tax + insurance--查出需要的数据
     INTO total_deductions--赋值给变量total_deductions
     FROM emp where id = emp_id;
     
     RETURN total_deductions;--返回结果
     
EXCEPTION
     WHEN no_data_found THEN--找不到数据异常
          RETURN 0;
     WHEN OTHERS THEN--其他异常
          RETURN -1;
END fun_deductions;

  调用:

select fun_deductions(1) from dual;

  3、一个计算环周长的函数,两个输入参数,一个常量定义

CREATE OR REPLACE FUNCTION fun_circum_perimeter(angle NUMBER,radius NUMBER)--定义两个参数,angle:角度,radius:半径
RETURN NUMBER IS
     PI CONSTANT NUMBER := 3.1415926;--定义常量
     circum_perimeter NUMBER;--定义返回变量
BEGIN
     circum_perimeter := ROUND((angle/360)*2*PI*radius,2);--计算
     RETURN circum_perimeter;
END fun_circum_perimeter;

  调用:

SELECT fun_circum_perimeter(360,2) FROM DUAL;

  4、选择结果返回

CREATE OR REPLACE FUNCTION fun_if(n INTEGER)
RETURN INTEGER IS
BEGIN
     IF n = 0 THEN
        RETURN 1;
     ELSIF n = 1 THEN
        RETURN n;
     ELSE
        RETURN -1;
     END IF;
END;

   5、阶乘

CREATE OR REPLACE FUNCTION fun_factorial(n POSITIVE)
RETURN POSITIVE IS
BEGIN
     IF n = 1 THEN
        RETURN n;
     ELSE
         RETURN n*fun_factorial(n-1);
     END IF;
END;

  6、斐波那契

CREATE OR REPLACE FUNCTION fun_fibonacci(n PLS_INTEGER)
RETURN PLS_INTEGER IS
       fib_1 PLS_INTEGER := 0;
       fib_2 PLS_INTEGER := 1;
BEGIN
     IF n = 1 THEN
        RETURN fib_1;
     ELSIF n = 2 THEN
        RETURN fib_2;
     ELSE
        RETURN fun_fibonacci(n-2) + fun_fibonacci(n-1);
     END IF;
END;