程序或功能(Pl / sql)

时间:2013-10-09 12:25:57

标签: sql stored-procedures plsql oracle10g stored-functions

我目前正在使用oracle 10g学习pl / sql 我有一些困惑 我应该何时使用存储过程以及何时应该使用存储过程? 请帮我解决一些现实世界的例子。 谢谢。

3 个答案:

答案 0 :(得分:2)

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

此外,只能使用以下内容定义一个函数(从11.1开始):

  1. DETERMINISTIC选项,有助于优化器避免冗余函数调用。
  2. PARALLEL_ENABLED选项,允许在并行DML评估的从属会话中安全地使用该函数。
  3. PIPELINED选项,它迭代地返回表函数的结果。
  4. RESULT_CACHE选项,用于将函数结果存储在PL / SQL函数结果缓存中。
  5. RESULT_CACHE子句,它指定函数结果的数据源。
  6. 因此,如果您需要返回多个值,请使用一个过程。但请注意,上述五个功能无法使用。

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

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

答案 1 :(得分:0)

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
*/

答案 2 :(得分:0)

区别在于存储过程执行某些操作,而函数执行某些操作并返回结果(变量或表)。