2012-03-24 94 views
6

我是PL/SQL中的新手,尝试一些练习示例。
我有一个关于PL/SQL PROCEDURE & FUNCTION几个问题:什么时候我应该去PL/SQL的程序或功能?

当我应该去为PROCEDUREFUNCTION?

手段,我使用FUNCTION相同的任务将使用PROCEDURE做做什么任务。 那我为什么要去这个功能?在PL/SQL中,它们的优势是FUNCTION而不是PROCEDURE

FUNCTION必须返回值。这是使用函数的唯一优势还是还有其他功能优势?

回答

5

用户定义函数有一定的局限性,可用于SELECT语句和PL/SQL IF语句,而PROCEDURE不能。

您可以SELECTFUNCTIONCAST如使用管道和PIPE ROW报表的表,但是这是一种先进的PL/SQL功能,您可以多备后用。

在线咨询Oracle开发文档,因为它是免费的,很不错的:Developing and Using Stored Procedures

+0

这些限制是什么?一个程序可以完成所有功能以及更多功能。例如你可以返回一个表格作为输出参数(s)。我对使用可能不会产生确定性结果的函数持怀疑态度,例如涉及日期/时间的函数参数。在一个程序中,你没有这样的限制。管排是最简单的陈述之一。你的回答比鼓励新手观众更令人沮丧。 – TonyP 2012-03-24 11:57:38

+2

@TonyP对于不知道PL/SQL基础的人,我不打算扩展Function pragma settings等的详细信息 - http://docs.oracle.com/cd/B12037_01/appdev.101/b10807 /13_elems039.htm-我的回应提供了额外的学习方向,而不是一站式购物Clif笔记本的全部版本。 – tawman 2012-03-24 16:44:24

+0

@jonearles感谢您编辑管道*函数* – tawman 2012-03-25 17:29:33

2
  1. 函数会返回一个值,A "value"有是许多东西,包括PL/SQL表,楼盘光标等添加一个为此,可以在SQL语句中使用函数,而不能使用过程。
  2. 程序用于执行业务逻辑,我们可以使用OUTIN OUT参数返回过程中的多个值。
  3. 个人我使用函数进行计算 - 例如:检查特定的条件,如根据条件检索值,检查条件的真或假。
  4. 您可以在函数中拥有DML(插入,更新,删除)语句。但是,你不能在SQL查询中调用这样的函数。 *例如:如果您有一个更新表的函数,则不能在任何SQL查询中调用该函数。

    select myFunction(field) from sometable; --will throw error. 
    

这是你的选择是否使用过程或函数取决于你的要求,你的舒适性。

+0

您可以在SQL语句中使用的函数中使用DML和DDL,但您需要将其声明为AUTONOMOUS_TRANSACTION。 (虽然这样做可能是一个非常糟糕的主意。) – 2012-03-24 19:58:25

+2

第5点是错误的。您可以按照与过程相同的方式在函数中执行ddl。 – 2012-03-28 08:48:34

+0

@FlorinGhita:谢谢我将在我的回答中编辑这个 – 2012-03-28 09:01:05

0

主要优点:

  1. 功能它必须返回一个值,其中作为程序可能或可能不返回值。
  2. 函数主要用于计算值。程序主要用于执行业务逻辑。
  3. 功能来检索作为过程值来处理值的值。
  4. 函数它只能返回一个值,但它接受许多返回类型。
-1

有使用过的功能程序的更多优势:

  1. 如果我们要执行使用立即执行的语句,然后我们使用程序。它不能在函数内部所做的动态SQL语句。

  2. 过程可以独立执行,而函数必须是可执行语句的一部分,因为它不能独立执行。

-1

函数必须返回一个值,它用于我们使用的计算目的。 函数它必须只返回一个值,但它接受许多返回类型。 函数我们可以使用select语句。 过程它可能会或可能不会返回一个值。 程序是我们可以使用dml操作。 我们只能执行的程序。

+1

这很难理解你想说什么。 – 2013-06-15 06:49:03

-3

当然你可以在函数中执行动态sql。写一个简单的功能来做测试,你会看到它的工作。

大部分时间您都可以使用功能或过程。不同之处在于你想在SQL语句中还是在IF语句中使用它们,然后使用函数。否则,使用最适合你和调用应用程序的东西。

+0

你明白了 – Bren 2014-03-21 13:37:21

4

我想澄清一下,如果您清楚了解您的程序目标,则应该使用存储过程还是函数的答案完全取决于您的业务需求和设计工作流程。如果你不清楚你的目标,只是你的问题的方式,没有大量的编码程序和功能是有用的。

您必须注意,存储过程和函数在PL/SQL编程中有不同的用途。这些如下:

  1. 存储过程:

    一个。存储过程表示可以接受参数并对其进行处理的命名块(而不是匿名块)。

    b。存储过程定义了一个独立的过程工作流程,您可以在其中执行一系列DML和/或其他操作。

    c。存储过程不必返回一个值。因此,它们不能从SQL语句中调用。存储过程必须从PL/SQL块或匿名执行。 d)。优点:

    • 过程不必返回一个值(这也可能是缺点)。
    • 可用于执行一系列DML或DDL(是的,这可以通过动态SQL进行一些限制)操作。
    • 可以简单地称为来自PL/SQL块的独立语句。例如,

      myProcedure (x, y); 
      

    即缺点:

    • 无法从SQL查询--DML或SELECT语句中调用。
    • 不能在索引中使用。
  2. 功能:

    一个。函数是可以接受参数并返回值的命名块。

    b。函数还定义了一个过程工作流程,但在SQL语句中使用时,不能执行任何DML或DDL。

    c。必须从SQL或PL/SQL语句中调用该函数返回的值,即将其分配给作为参数传递的变量,等等。

    d。优点:

    • 可用于SQL查询 - DML或SELECT语句。
    • 如果函数是确定性的(对于确定的一组输入,函数在每次调用时都会返回相同的输出),可用于基于函数的索引。

    e。缺点:

    • 如果从SQL查询调用的函数包含任何DML,则查询失败。
    • 函数返回值是强制性的。因此,函数调用不能像过程调用那样是独立的语句。

更多参考,请访问:Oracle Docs

0

无论何时您想要返回某个值并且必须进一步使用该值,请参阅函数。如果你想返回一些值作为最终结果,请进入程序。

相关问题