导航

Oracle笔记(9)---自定义函数

函数

和存储过程类似,可以简单的理解为一段可以执行某个活动/动作的子程序,可以作为一个系统对象被存储在数据库中,可以重复调用。与存储过程不同的是,函数总是向调用者返回一个值,而存储过程不能有返回值。

建立函数 

语法如下:

CREATE [OR REPLACE] FUNCTION function_name

[(argment [ { IN| IN OUT }] type,

 argment [ { IN | OUT | IN OUT } ] type]

RETURN return_type  

{ IS | AS }

<类型.变量的说明> 

BEGIN

FUNCTION_body

EXCEPTION

异常处理语句

END;

 

注解:

IN:输入参数,向存储过程传递值,默认类型,可以不写

OUT:输出参数,用于返回结果。

IN OUT:作为IN参数向存储过程传递值,同时作为OUT参数返回值。

REPLACE:指明若已有同名的存储过程存在,那么将被替换成当前创建的版本。

RETURN只能返回单个值,不能返回多个值。

可以使用DEFAULT关键字为输入参数指定默认值。

 

函数的调用:

把函数作为PL/SQL中的表达式调用

例如:假如函数getID()可以返回值,可以这样调用:SELECT * FROM table WHERE id=getID()

创建一个变量用于接收函数的返回值

       例如:VARIABLE id NUMBER;

                EXECUTE :id  := getID();

                PRINT(id);

调用函数的位置:

l         SELECT 语句的列表部分,eg: SELECT fun(..)….

l         WHERE HAVING 字句 eg:WHERE id=fun(…)…

l         ORDER BY CONNECT BYSTART WITHGROUP BY 字句

l         INSERT 语句的VALUES部分 INSERT INTO  table VALUES(..,fun(),..)

l         UPDATE 语句的SET部分 eg:UPDATE table SET name=fun(…)

l         PL/SQL

要让函数可以在SQL表达式中调用,必须满足以下条件:

    1.  应该是stored function

       2.  只接收IN参数

    3. 传入参数和返回值都必须是SQL支持的类型,不能是PL/SQL中的特殊类型(例如boolean

 

限制:

Functions called from SQL expressions cannot contain DML statements

Functions called from UPDATE/DELETE statements on a table T cannot contain DML on the same table T

Functions called from an UPDATE or a DELETE statement on a table T cannot query the same table

Functions called from SQL statements cannot contain statements that end the transactions 

Calls to subprograms that break the previous restriction are not allowed in the function

 

关于最后的几点限制,个人理解还不是很透彻,会在以后加以解释和完善,也请知道的朋友能帮忙讲解下,谢谢!

posted on 2011-07-02 21:40  @永不止步  阅读(2622)  评论(0)    收藏  举报