Oracle SQL存储过程调用与执行

Oracle SQL存储过程调用与执行,sql,oracle,stored-procedures,call,execute,Sql,Oracle,Stored Procedures,Call,Execute,问题 我试图理解Oracle SQL命令调用和执行之间的区别 我一直在使用CALL启动存储过程,但在与另一位开发人员交谈时,我发现他几乎完全使用EXECUTE。我在网上做了一些研究,看看我是否做了一些错误的事情,但我没有看到这两个命令之间的明确区别,人们似乎可以互换使用它们 根据文档,它们看起来非常相似,至少在与存储过程的交互方面是如此 它看起来确实是一个通用的SQL命令,而EXECUTE似乎是专有的,所以我倾向于使用CALL over EXECUTE,但我不知道这对性能意味着什么 问题 在启动

问题

我试图理解Oracle SQL命令调用和执行之间的区别

我一直在使用CALL启动存储过程,但在与另一位开发人员交谈时,我发现他几乎完全使用EXECUTE。我在网上做了一些研究,看看我是否做了一些错误的事情,但我没有看到这两个命令之间的明确区别,人们似乎可以互换使用它们

根据文档,它们看起来非常相似,至少在与存储过程的交互方面是如此

它看起来确实是一个通用的SQL命令,而EXECUTE似乎是专有的,所以我倾向于使用CALL over EXECUTE,但我不知道这对性能意味着什么

问题

在启动存储过程方面,一个比另一个更可取吗?这有关系吗? 如果这真的很重要,在什么情况下两者都是合适的? 两者之间有什么性能差异吗?什么是最佳实践?
如果调用使用Toad返回sys_refcursor的proc,则CALL和EXEC之间存在差异

创建程序fooi in number,o out sys\u refcursor 像 开始 开放给 从双通道中选择i; 结束

exec foo1,:r;-输出1行

调用foo1,:r;-输出0行

-注意:当您在参数前面加冒号时,Toad将提示您输入类型,在本例中,该类型是光标。

在SQL*Plus中可以使用EXEC[ute]SP和CALL SP来执行SP。顺便说一句,您也可以使用BEGIN SP;结束

但也有一些不同之处

调用是Oracle SQL,应该在任何地方都可以使用。可以与Oracle对话的其他DB客户端可能支持也可能不支持SQL*Plus EXEC。例如,OracleSQLDeveloper、SQLWorkbench/J等都有,但有些并没有分解

CALL语句传递的参数的数据类型必须是SQL数据类型。它们不能是纯PL/SQL数据类型,例如布尔值

EXEC不仅可用于执行SP,还可用于执行任意语句

如果SP没有参数,则可以使用EXEC SP;语法,但CALL需要空括号:CALL SP


EXECUTE是一个SQL*PLUS命令。您使用的是什么SQL客户端?我们主要使用TOAD 11.6和两个命令compile/run。因此,不会出现性能问题。他们只是调用过程。我认为,您可以将过程的参数以任意顺序命名为参数的语法也仅适用于EXECUTE和SQL*Plus。@MirkoKLemm实际上,它在call中也对我有用:call r_mv method=>'C',mv=>'core_project_appls';对于VARCHAR2中的创建或替换过程r_mv mv,VARCHAR2中的方法:=,跳过VARCHAR2中的索引:='*无*'