Oracle SQL 存储过程调用与执行

Posted

技术标签:

【中文标题】Oracle SQL 存储过程调用与执行【英文标题】:Oracle SQL Stored Procedures Call vs. Execute 【发布时间】:2014-01-01 12:36:48 【问题描述】:

问题

我正在尝试了解 Oracle SQL 命令 CALLEXECUTE 之间的区别。

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

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

http://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_4008.htm http://docs.oracle.com/cd/B19306_01/server.102/b14357/ch12022.htm http://docs.oracle.com/cd/B28359_01/olap.111/b28126/dml_app_dbms_aw026.htm

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

问题

就启动存储过程而言,一个比另一个更可取吗?有关系吗? 如果确实重要,在什么情况下两者都合适? 两者之间是否存在性能差异?最佳做法是什么?

【问题讨论】:

EXECUTE 是一个 SQL*PLUS 命令。您使用的是什么 SQL 客户端? 我们主要使用 TOAD 11.6,两个命令都编译/运行。 所以,不会有性能问题。他们只是调用程序。 【参考方案1】:

EXEC[ute] SP()CALL SP() 都可以在 SQL*Plus 中用于执行 SP。顺便说一句,你也可以使用BEGIN SP(); END;

但也有一些不同。

    CALL 是 Oracle SQL,应该可以在任何地方使用。其他可以与 Oracle 通信的 DB 客户端可能支持也可能不支持 SQL*Plus EXEC。许多可以(例如,Oracle SQL Developer、SQLWorkbench/J),但有些不可以(Liquibase)。

    CALL语句传递的参数的数据类型必须是SQL数据类型。它们不能是仅限 PL/SQL 的数据类型,例如 BOOLEAN。

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

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

【讨论】:

我认为可以以任意顺序将 proc 的参数作为“命名参数”的语法也仅适用于 EXEC(UTE) 和 SQL*Plus。 @MirkoKLemm 实际上,它在CALL 中也对我有用:CALL r_mv (method => 'C', mv => 'core_project_appls');CREATE OR REPLACE PROCEDURE r_mv( mv IN VARCHAR2, method IN VARCHAR2 := '', skip_index IN VARCHAR2 := '*NONE*')【参考方案2】:

如果您使用 Toad 调用返回 sys_refcursor 的 proc,则 CALL 和 EXEC 之间存在差异。

创建过程 foo(i in number,o out sys_refcursor) 作为 开始 为 从对偶中选择 i; 结束;

执行 foo(1,:r); -- 输出 1 行

调用 foo(1,:r); -- 输出 0 行

-- 注意:当您在参数前加上冒号时,Toad 会提示您输入类型(在本例中为光标)。

【讨论】:

以上是关于Oracle SQL 存储过程调用与执行的主要内容,如果未能解决你的问题,请参考以下文章

oracle SQL语句中怎么样调用存储过程

oracle数据库调用存储过程

oracle存储过程里调用存储过程

VB调用SQL存储过程异步执行问题

sql server 怎么服务器连接调用oracle的存储过程

请问oracle怎么执行存储过程