我啥时候应该在 PL/SQL 中使用过程或函数?

Posted

技术标签:

【中文标题】我啥时候应该在 PL/SQL 中使用过程或函数?【英文标题】:when should I go for procedure or function in PL/SQL?我什么时候应该在 PL/SQL 中使用过程或函数? 【发布时间】:2012-03-24 03:32:57 【问题描述】:

我是 PL/SQL 新手,正在尝试一些练习示例。我对 PL/SQL PROCEDUREFUNCTION 有几个问题:

我什么时候应该选择PROCEDUREFUNCTION?

意味着,无论我使用FUNCTION 执行什么任务,使用PROCEDURE 都会执行相同的任务。 那我为什么要去做这个功能呢? FUNCTION 比 PL/SQL 中的 PROCEDURE 有什么优势吗?

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

【问题讨论】:

这些答案都不可接受? 【参考方案1】:

我想澄清一下,是否应该使用存储过程或函数的答案完全取决于您的业务需求和设计工作流程,前提是您清楚自己的程序目标。如果你不清楚你的目标,就像你的问题一样,再多的编码过程和函数都不会有用。

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

    存储过程:

    一个。存储过程表示能够接受参数并对其进行处理的命名块(相对于匿名块)。

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

    c。存储过程不必返回值。因此,不能从 SQL 语句内部调用它们。存储过程必须从命名或匿名的 PL/SQL 块执行。

    d。优点:

    过程不必返回值(这也可能是缺点)。 可用于执行一系列 DML 或 DDL(是的,这可以通过具有一些限制的动态 SQL 实现)操作。

    可以简单地作为独立语句从 PL/SQL 块中调用。例如,

    myProcedure (x, y);
    

    e。缺点:

    无法从 SQL 查询中调用 - DML 或 SELECT 语句。 不能用于索引。

    功能:

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

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

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

    d。优点:

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

    e。缺点:

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

如需进一步参考,请访问Oracle Docs。

【讨论】:

【参考方案2】:

用户定义的函数,有一定的限制,可以在SELECT 语句和PL/SQL IF 语句中使用,而PROCEDURE 不能。

您可以使用管道和PIPE ROW 语句从FUNCTIONCAST 作为表的SELECT,但这是您可以在以后使用的高级PL/SQL 功能。

在线查阅 Oracle Developer 文档,因为它是免费且非常好的:Developing and Using Stored Procedures

【讨论】:

这些限制是什么?一个过程可以做所有功能可以做的事情,甚至更多。例如,您可以返回一个表作为 out refcursor 参数。我对使用可能产生非确定性结果的函数持怀疑态度,例如涉及日期/时间的函数参数。在一个过程中,您没有这样的限制。管道行是最简单的语句之一。你的回答比鼓励新手观众更令人沮丧。 @TonyP 对于不了解 PL/SQL 基础知识的人,我不打算展开 Function pragma settings 等的详细信息 - docs.oracle.com/cd/B12037_01/appdev.101/b10807/13_elems039.htm- 我的回复是为了提供进一步学习的方向和不是一站式的 Clif 笔记版本。【参考方案3】:
    函数将返回一个值,A "value" 是许多事物之一,包括 PL/SQL 表、引用游标等。此外,可以在 SQL 语句中使用函数,而不能使用过程。 过程用于执行业务逻辑,我们可以使用OUTIN OUT 参数从过程中返回多个值。 我个人使用函数进行计算 - 例如:检查特定条件,例如根据条件检索值、检查条件的真假。

    您可以在函数中包含 DML(插入、更新、删除)语句。但是,您不能在 SQL 查询中调用这样的函数。 *例如:如果您有一个正在更新表的函数,则不能在任何 SQL 查询中调用该函数。

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

使用程序或功能取决于您的要求和您的舒适度。

【讨论】:

您可以在 SQL 语句中使用的函数中使用 DML 和 DDL,但您需要将其声明为 AUTONOMOUS_TRANSACTION。 (尽管这样做可能是一个非常糟糕的主意。) 第 5 点是错误的。您可以像在过程中一样在函数中执行 ddl。【参考方案4】:

主要优点:

    函数必须返回一个值,而过程可能会或可能不会返回值。 函数主要用于计算一个值。主要用于执行业务逻辑的程序。 用于检索值的函数,作为操作值的过程。 函数它必须只返回一个值,但它接受多种返回类型。

【讨论】:

【参考方案5】:

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

【讨论】:

很难理解你想说什么。【参考方案6】:

使用过程比函数更有优势:

    如果我们想使用立即执行语句执行动态 SQL 语句,那么我们使用过程。它不能在函数内部完成。

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

【讨论】:

【参考方案7】:

当你想要返回某个值并且必须进一步使用该值时,请使用函数。如果要返回某个值作为最终结果,请执行过程。

【讨论】:

【参考方案8】:

当然你可以在函数中执行动态sql。编写一个简单的函数来进行测试,你会看到它确实有效。

大多数时候您可以使用函数或过程。区别在于您是想在 SQL 语句中使用它们还是在 IF 语句中使用函数然后使用函数。否则,请使用最适合您和调用应用程序的方式。

【讨论】:

以上是关于我啥时候应该在 PL/SQL 中使用过程或函数?的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 中调用 Oracle PL/SQL 中的过程或函数。返回结果集 false

pl/sql函数和过程

我啥时候应该在 JPA 中使用 @JoinColumn 或 @JoinTable?

将 BLOB/CLOB 作为参数传递给 PL/SQL 函数

我啥时候应该传递“T* const&”类型的指针?

我啥时候应该使用一对一的关系?