Oracle SQL 存储过程调用与执行
Posted
技术标签:
【中文标题】Oracle SQL 存储过程调用与执行【英文标题】:Oracle SQL Stored Procedures Call vs. Execute 【发布时间】:2014-01-01 12:36:48 【问题描述】:问题
我正在尝试了解 Oracle SQL 命令 CALL
和 EXECUTE
之间的区别。
我一直使用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 存储过程调用与执行的主要内容,如果未能解决你的问题,请参考以下文章