过程或函数 (Pl/sql)

Posted

技术标签:

【中文标题】过程或函数 (Pl/sql)【英文标题】:Procedures or Functions (Pl/sql) 【发布时间】:2013-10-09 12:25:57 【问题描述】:

我目前正在使用 oracle 10g 学习 pl/sql 我有一定的困惑 什么时候应该使用存储过程,什么时候应该使用函数? 请帮我举一些现实世界的例子。 谢谢。

【问题讨论】:

【参考方案1】:

一个函数返回一个值,尽管它实际上可能是一个像游标这样的对象。

也只能使用以下方式定义函数(从 11.1 开始):

    DETERMINISTIC 选项,帮助优化器避免冗余函数调用。 PARALLEL_ENABLED 选项,允许在并行 DML 评估的从属会话中安全使用该函数。 PIPELINED 选项,以迭代方式返回表函数的结果。 RESULT_CACHE 选项,将函数结果存储在 PL/SQL 函数结果缓存中。 RESULT_CACHE 子句,它指定函数结果所在的数据源。

因此,如果您需要返回多个值,请使用过程。但是请注意,上述五个功能随后将不可用。

如果您想在 SQL 语句中包含一个 PL/SQL 子程序,那么您可能需要一个函数。

http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/subprograms.htm#CHDBEJGF

【讨论】:

【参考方案2】:
DECLARE
    l_user_id       VARCHAR2(1);
    l_received_user VARCHAR2(30);

    PROCEDURE print_user_name(user_name_in IN VARCHAR2)
    AS
    BEGIN
        DBMS_OUTPUT.PUT_LINE('The user''s name is: ' || INITCAP(user_name_in));
    END print_user_name;

    FUNCTION get_user_name(user_id_in IN VARCHAR2) RETURN VARCHAR2
    AS
        l_user_name VARCHAR2(30);
    BEGIN
        SELECT  'Amanda'
        INTO    l_user_name
        FROM    dual
        WHERE   dummy = user_id_in;

        RETURN  l_user_name;
    END get_user_name;
BEGIN
    -- excute an action --
    print_user_name('John');

    l_user_id := 'X';

    -- hold action's result in a variable --
    l_received_user := get_user_name(l_user_id);

    -- work with the received result/variable --
    DBMS_OUTPUT.PUT_LINE('The received user''s name is: ' || INITCAP(l_received_user));

    IF l_received_user  = 'John' THEN
        DBMS_OUTPUT.PUT_LINE('The received user''s name is John');
    ELSE
        DBMS_OUTPUT.PUT_LINE('The received user''s name is not John');
    END IF;
END;
/*
The user's name is: John
The received user's name is: Amanda
The received user's name is not John
*/

【讨论】:

【参考方案3】:

不同之处在于,排序过程做一些事情,而函数做一些事情并返回结果(变量或表)。

【讨论】:

以上是关于过程或函数 (Pl/sql)的主要内容,如果未能解决你的问题,请参考以下文章

PL-SQL 存储函数和存储过程

PL/SQL轻量版——存储函数/存储过程

PL/SQL程序设计—— 存储函数&存储过程

pl/sql函数和过程

将数据集合从 .NET 传递给 PL/SQL 包过程或函数?

PL/SQL学习笔记_03_存储函数与存储过程