函数是一种以表达式的方式调用的SPL程序。当函数运行完毕后,它将返回一个值代替在表达式中调用函数的地方。

函数可以以输入参数的形式从调用该函数的程序接收数值。函数除了可以自己返回数值外,还可以以输出参数的方式向函数的调用者返回数值。 但是应该注意,在实际编写程序的过程中,不提倡在函数中使用输出参数。

创建函数

CREATE FUNCTION 命令定义和命名了一个将要存放在数据库中的函数。
CREATE [ OR REPLACE ] FUNCTION name [ (parameters) ]
RETURN data_type [ AUTHID { DEFINER | CURRENT_USER } ] { IS | AS }
[ declarations ] BEGIN
statements
END [ name ];                

name 就是函数的标识符。 如果定义了[ OR REPLACE ] 并且在模式中存在了有相同名字的函数,那么新创建的函数将替代已存在的同名函数。反之,新创建的函数则无法替代在同一模式下已存在的函数。parameters是一个正式参数的列表。data_type是函数返回值的类型。如果省略了AUTHID子句或者指定了DEFINER子句,就会使用函数的所有者的权限和搜索路径分别用来确定数据库对象的访问优先级, 解析对未限定数据库对象的引用。如果指定了CURRENT_USER子句,就会使用当前执行存储过程的用户的权限和搜索路径来决定访问的优先级和解析对未限定对象的引用。declarations就是变量,游标或者类型的声明。statements是SPL应用程序所使用的语句。BEGIN-END块包含一个捕获异常的部分。

下面是一个函数的示例,这个函数很简单,它不带任何参数。
CREATE OR REPLACE FUNCTION simple_function
    RETURN VARCHAR2
IS
BEGIN
    RETURN 'That''s All Folks!';
END simple_function;
下面是另外一个函数的示例,这个函数带有两个输入参数。关于参数的详细信息在本章节的后面将会讨论到。
CREATE OR REPLACE FUNCTION emp_comp (
    p_sal           NUMBER,
    p_comm          NUMBER
) RETURN NUMBER
IS
BEGIN
    RETURN (p_sal + NVL(p_comm, 0)) * 24;
END emp_comp;

调用函数

在SPL语句中表达式可以出现的地方,都可以使用函数。您可以通过指定函数名称和名称后面括号中的参数,来调用一个函数。
name [ ([ parameters ]) ] 
name是函数的名称,parameters是实际参数的列表。
说明 如果没有实际参数, 函数可以以空参数列表的方式调用,函数后面的括号可以省略。
下面的示例显示如何从SPL应用程序中调用函数。
BEGIN
    DBMS_OUTPUT.PUT_LINE(simple_function);
END;

That's All Folks!
函数通常是在如下所示的SQL语句中调用。
SELECT empno "EMPNO", ename "ENAME", sal "SAL", comm "COMM",
    emp_comp(sal, comm) "YEARLY COMPENSATION" FROM emp;

 EMPNO | ENAME  |   SAL   |  COMM   | YEARLY COMPENSATION
-------+--------+---------+---------+---------------------
  7369 | SMITH  |  800.00 |         |            19200.00
  7499 | ALLEN  | 1600.00 |  300.00 |            45600.00
  7521 | WARD   | 1250.00 |  500.00 |            42000.00
  7566 | JONES  | 2975.00 |         |            71400.00
  7654 | MARTIN | 1250.00 | 1400.00 |            63600.00
  7698 | BLAKE  | 2850.00 |         |            68400.00
  7782 | CLARK  | 2450.00 |         |            58800.00
  7788 | SCOTT  | 3000.00 |         |            72000.00
  7839 | KING   | 5000.00 |         |           120000.00
  7844 | TURNER | 1500.00 |    0.00 |            36000.00
  7876 | ADAMS  | 1100.00 |         |            26400.00
  7900 | JAMES  |  950.00 |         |            22800.00
  7902 | FORD   | 3000.00 |         |            72000.00
  7934 | MILLER | 1300.00 |         |            31200.00
(14 rows)

删除函数

DROP FUNCTION 命令可以从数据库中删除一个函数。
DROP FUNCTION name [ (parameters) ]; 
name 是要删除函数的名称。
说明 POLARDB要求参数列表的指定要在某种环境下进行。Oracle则常常要求省略参数列表。
在下面这个示例中,删除了一个已创建的函数:
DROP FUNCTION simple_function;