一个存储函数是一个命名的PL/SQL 块,它可以接受参数并且可以被调用。一般来说,函数用于计算一个值。函数和过程有相似的结构,但函数必须返回一个值到主叫环境。反之,过程可以没有返回值,也可以由多个值返回到它的主叫环境。象过程一样,函数有一个头,一个声明部分,一个执行部分和一个异常处理部分。在函数的头中必须有一个RETURN 子句,并且在执行部分至少有一个 RETURN 语句。函数可以作为一个方案对象被存储在数据库中用于反复执行。函数可以作为一个SQL 表达式或 PL/SQL表达式的一部分被调用。


函数语法:

CREATE [OR REPLACE] FUNCTION function_name
[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
. . .)]
RETURN datatype
IS|AS
PL/SQL Block;


PL/SQL 块必须至少有一个RETURN语句


语法说明

参数  说明  

function_name   函数的名字  

parameter   一个 PL/SQL变量的名字,其值被传递到函数中  

mode  参数的类型;可以是 IN、out、inout 参数 ,一般使用IN参数

datatype   参数的数据类型  

RETURNdatatype  RETURN 值的数据类型  

PL/SQLblock   定义要由函数执行的动作的程序体   


使用步骤:


1.在一个编辑器中输入CREATE FUNCTION语句的文本并且将它保存为一个SQL 脚本文件


2.运行存储源代码的脚本文件并且编译函数


3.用SHOW ERRORS查看编译错误

​<span style="font-size:24px;">CREATE OR REPLACE FUNCTION get_sal  (p_id IN emp.empno%TYPE)
RETURN NUMBER
IS
v_sal emp.sal%TYPE :=0;
BEGIN
SELECT sal
INTO v_sal
FROM emp
WHERE empno = p_id;
RETURN v_sal;
END get_sal;
/ </span><span style="font-size: 24pt;">
</span>
在sql*plus创建函数并调用

VARIABLE g_sal NUMBER

EXEC :g_sal := get_sal(7369)

Print g_sal


调用用户定义函数的位置


SELECT语句的Select 列表中

WHEREHAVING子句的条件中

START WITHORDER BYGROUPBY子句中

INSERT语句的VALUES子句中

UPDATE语句的SET子句中

SELECT empno, tax(sal)

FROM  emp

WHERE tax(sal)>(SELECTMAX(tax(sal))

       FROM  emp

       WHERE deptno = 30)

ORDER BY tax(sal) DESC;


SQL中调用函数的限制


为了从SQL 表达式中调用函数,用户定义函数必须:

只接受IN参数

只接受有效的SQL 数据类型,而不接受PL/SQL特殊的类型

 作为参数

返回数据类型为有效的SQL数据类型,而非PL/SQL 特殊的

 类型

在一个表上的UPDATEDELETE语句中调用的函数不能查询及更新同一个表

SQL 语句中调用的函数不能包含结束事务的语句


函数删除:

​DROP FUNCTION function_name