我目前正在使用 oracle 10g 学习 pl/sql 我有一定的困惑 什么时候应该使用存储过程,什么时候应该使用函数?请帮我举一些现实世界的例子。谢谢你。
问问题
284 次
3 回答
2
一个函数返回一个值,尽管它实际上可能是一个像游标这样的对象。
也只有一个函数可以用以下定义(从 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
于 2013-10-09T12:51:44.830 回答
0
区别在于 sored 过程做一些事情,而函数做一些事情并返回结果(变量或表)。
于 2013-10-09T12:45:19.973 回答
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
*/
于 2013-10-09T12:41:53.383 回答