函数和存储过程非常类型,都有三种模式的参数。他们都可以被存储在数据库中,并且在快中调用。
存储过程只能作为一个PL/SQL语句调用,而函数作为表达式的一部分调用。并且它们的定义部分、可执行部分和异常处理部分都是不同的。
CREATE [OR REPLACE] FUNCTION schema.function
[(argument[{IN|OUT|IN OUT}]datatype[,...])]
RETURN return_datatype {IS|AS}
PL/SQL_body;
function是函数名
argument是参数名
datatype是参数的类型
return_datatype是函数返回值的类型
PL/SQL_body是函数的处理部分
参数列表时可选的。在没有参数的情况下,函数的定义与调用都没有圆括号。但返回值类型是必需的,因为函数是作为表达式的一部分调用,必须返回一个值。
CREATE OR REPLACE FUNCTION SalaryStat(
p_Sex auths.sex%TYPE)
RETURN BOOLEAN IS
v_MaxAuthors NUMBER;
v_ReturnValue BOOLEAN;
BEGIN
SELECT COUNT(author_code)
INTO v_MaxAuthors
FROM auths;
IF v_MaxAuthors> 10 THEN
v_ReturnValue:=TRUE;
ELSE
v_ReturnValue:=FALSE;
END IF;
RETURN v_ReturnValue;
END SalaryStat;
DECLARE CURSOR c_Auths IS
SELECT distinet sex
FROM auths;
BEGIN
FOR v_AuthsRecord IN c_Auths LOOP
IF SalaryStat(v_AuthsRecord.sex) THEN
UPDATE auths
SET salary = salary-50
WHERE sex=v_AuthsRecord.sex;
END IF;
END LOOP;
END;
在函数内,是通过RETURN语句来返回值的。
RETURN expression;
expression是准备返回的值。如果expression的类型和函数头中指定的类型不符,expression类型会自动转换。RETURN语句被执行后,控制权立刻返回给调用环境。
在函数体重可以有多条RETURN语句,但还只能有一条被执行。在函数结束的时候,如果没有执行RETURN语句会产生错误。
CREATE OR REPLACE FUNCTION SalaryStat(
p_Sex auths.sex%TYPE)
RETURN VARCHAR2 IS
v_MaxAuthors NUMBER;
BEGIN
SELECT COUNT(author_code)
INTO v_MaxAuthors
FROM auths;
IF v_MaxAuthors> 10 THEN
RETURN v_ReturnValue;
ELSE
RETURN v_ReturnValue;
END IF;
END SalaryStat;
RETURN也可以用在存储过程中。在这种情况下,它没有参数。当执行了不带参数的RETURN语句后,立刻将控制权返回到调用环境,并将OUT和IN OUT模式的形参的当前值传给实参,然后继续执行调用存储过程后的语句。
函数和存储过程的相同点:
都可以通过OUT模式的参数返回一个活多个值。
代码都有定义部分、可执行部分和异常部分。
都可以使用缺省值。
都可以用位置表示法和命名表示法调用。
一般情况下,如果只有一个返回值,使用函数;如果有多个返回值则使用存储过程。

扫描二维码关注我的微学堂
搜索刘老师微信号:Rman-2014,备注“Oracle学习与咨询”,即可添加好友;或者扫描下面二维码,关注我的“微学堂”公众号,了解最新OCP认证动态、题库及答案解析、培训机构及讲师介绍、课堂授课内容等。每天还有一篇技术文章发布哦!





