首页 > 解决方案 > 带有包常量的 Oracle 过程 CALL

问题描述

让我们假设一个简单的场景,如下所示:

CALL DBMS_XMLSCHEMA.DELETESCHEMA(
   schemaurl      => 'non_existing_schemaurl',
   delete_option  => DBMS_XMLSCHEMA.DELETE_INVALIDATE);
-- ORA-06553: PLS-221: 'DELETE_INVALIDATE' is not a procedure or is undefined

同时,当提供整数值或在 PL/SQL 块内运行时,不会发生错误:

-- 1)
CALL DBMS_XMLSCHEMA.DELETESCHEMA(
   schemaurl      => 'non_existing_schemaurl',
   delete_option  => 2);

-- 2)
BEGIN
DBMS_XMLSCHEMA.DELETESCHEMA(
   schemaurl      => 'non_existing_schemaurl',
   delete_option  => DBMS_XMLSCHEMA.DELETE_INVALIDATE);
END;
/

db<>小提琴演示

是否可以DBMS_XMLSCHEMA.<constant>结合使用CALL(搜索可信/官方来源)?

标签: oraclestored-procedures

解决方案


根据SQL 语言参考

使用 CALL 语句从 SQL 中执行例程(独立过程或函数,或在类型或包中定义的过程或函数)。

关键是最后两个词——在 SQL中。很容易认为它CALL类似于 SQL*Plus 命令EXEC,但CALL在 SQL 上下文中EXEC运行,而在 PL/SQL 上下文中运行。

PL/SQL 包变量不能在 SQL 语句中使用(PL/SQL WITH 函数除外,但该功能在这种情况下不起作用)。不幸的是,我找不到该声明的权威来源(这就是为什么这是一个 Wiki 答案;希望其他人可以添加该来源,然后删除这句话。)


推荐阅读