我知道这个问题已经结束了,但是我真的很难理解,我到处都看到函数不能用于对数据库执行粗糙操作(如update语句)这不是真的。除此之外,基本上它们之间的主要区别是过程可以有in和out参数0-〉n但函数有return,并且不将值存储在输出参数中。。是的,有一些小的区别,比如你调用它的方式,如果我没有错的话,函数可以在select语句中调用,而过程不可以。所以老实说,我真的看不出这两者之间有什么区别。如果我被问到“为什么你会选择函数而不是过程”(或者相反),我该怎么回答呢?谢谢
tzcvj98z1#
嗯,这是真的(除了一个错字,在这里):函数可以在select语句中调用,而函数不能(粗体部分应为"过程")当你想把一些东西返回给调用者时,你会选择函数。当你想处理一些东西时,你会选择过程。正如您所说,函数可以在select语句中使用,而select语句可以在SQL和PL/SQL中使用。另一方面,过程需要PL/SQL。调用函数比调用过程简单得多(假定f_today和p_today返回sysdate;作为返回值的函数,通过其输出参数的过程),例如
select
f_today
p_today
select f_today from dual;
比
declare l_today date; begin p_today(l_today); dbms_output.put_line(l_today); end; /
函数可以执行DML操作,但前提是它们是自治事务。这并不是你总是想做的。如果你想执行DML,你--通常--选择一个过程。虽然可能在这两种方法中都可以做 * 所有的事情 *,但是选择一个最适合你当前所做的事情的方法。有时它是一个函数,有时它是一个过程(有时你创建一个函数,然后由过程调用)。这要看情况。
pieyvz9o2#
因为过程可以有OUT参数,所以它们也可以向调用者返回一个值。因为函数是内部PL/SQL块,可以做过程能做的任何事情,所以它们也可以处理一些事情。DML在它们中是一样可能的。我认为真正的区别在于函数必须有且只有一个主返回值(通过RETURN子句传递回来),而过程不必返回任何东西,实际上也不能通过RETURN子句来返回,但两者都可以使用OUT参数来传递信息。当然,在SQL中只能调用函数(与PL/SQL相反)。但除此之外,你几乎可以用函数或过程做任何你需要做的事情。我认为当函数的 * 要点 * 是检索单个原子值时,使用函数是很好的编程意义,并且当"要点"是对数据库进行更改或者有多个事物要被传回并且没有一个条目在概念上是"主要"事物时使用过程。在我的PL/SQL编程中,我倾向于更频繁地使用函数而不是过程,即使主要目的不是要返回一些东西,因为我几乎总是想要返回 * return/status * 代码(成功与失败),所以状态是一个很好的"主返回值",几乎可以用于任何事情,使函数更适合。这种编程风格处理靠近源代码的异常,并从命名函数返回状态,而不是从命名函数中引发异常。但这只是一种方法。无论如何,希望这能帮上忙。
2条答案
按热度按时间tzcvj98z1#
嗯,这是真的(除了一个错字,在这里):
函数可以在select语句中调用,而函数不能(粗体部分应为"过程")
当你想把一些东西返回给调用者时,你会选择函数。当你想处理一些东西时,你会选择过程。
正如您所说,函数可以在
select
语句中使用,而select
语句可以在SQL和PL/SQL中使用。另一方面,过程需要PL/SQL。调用函数比调用过程简单得多(假定f_today
和p_today
返回sysdate;作为返回值的函数,通过其输出参数的过程),例如比
函数可以执行DML操作,但前提是它们是自治事务。这并不是你总是想做的。如果你想执行DML,你--通常--选择一个过程。
虽然可能在这两种方法中都可以做 * 所有的事情 *,但是选择一个最适合你当前所做的事情的方法。有时它是一个函数,有时它是一个过程(有时你创建一个函数,然后由过程调用)。
这要看情况。
pieyvz9o2#
因为过程可以有OUT参数,所以它们也可以向调用者返回一个值。因为函数是内部PL/SQL块,可以做过程能做的任何事情,所以它们也可以处理一些事情。DML在它们中是一样可能的。
我认为真正的区别在于函数必须有且只有一个主返回值(通过RETURN子句传递回来),而过程不必返回任何东西,实际上也不能通过RETURN子句来返回,但两者都可以使用OUT参数来传递信息。
当然,在SQL中只能调用函数(与PL/SQL相反)。但除此之外,你几乎可以用函数或过程做任何你需要做的事情。我认为当函数的 * 要点 * 是检索单个原子值时,使用函数是很好的编程意义,并且当"要点"是对数据库进行更改或者有多个事物要被传回并且没有一个条目在概念上是"主要"事物时使用过程。
在我的PL/SQL编程中,我倾向于更频繁地使用函数而不是过程,即使主要目的不是要返回一些东西,因为我几乎总是想要返回 * return/status * 代码(成功与失败),所以状态是一个很好的"主返回值",几乎可以用于任何事情,使函数更适合。这种编程风格处理靠近源代码的异常,并从命名函数返回状态,而不是从命名函数中引发异常。但这只是一种方法。无论如何,希望这能帮上忙。