oracle - 带有包常量的 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;
/
是否可以DBMS_XMLSCHEMA.<constant>
结合使用CALL
(搜索可信/官方来源)?
解决方案
根据SQL 语言参考:
使用 CALL 语句从 SQL 中执行例程(独立过程或函数,或在类型或包中定义的过程或函数)。
关键是最后两个词——在 SQL中。很容易认为它CALL
类似于 SQL*Plus 命令EXEC
,但CALL
在 SQL 上下文中EXEC
运行,而在 PL/SQL 上下文中运行。
PL/SQL 包变量不能在 SQL 语句中使用(PL/SQL WITH 函数除外,但该功能在这种情况下不起作用)。不幸的是,我找不到该声明的权威来源(这就是为什么这是一个 Wiki 答案;希望其他人可以添加该来源,然后删除这句话。)
推荐阅读
- jquery - 选中复选框的递增/递减计数
- sql-server - 如何在 Designer 窗口中为 Alter Table 生成完整的 DML T-SQL 命令?(包括 DATABASE INSERT 等)
- hyperledger-fabric - 是否可以使用 Hyperledger Fabric 的排序服务来交换其他消息?
- android - 如何使用 Kotlin 验证两个 arrayList 中的相等性
- c# - 当Window的大小改变时如何知道它是增加还是减少
- xml - Sabre 取消行程段错误 (OTA_CancelRQ)
- php - PHP opcache 预加载未在 Apache 上加载
- node.js - 使用 VISA API 生成 VISA 卡号
- git - 在 Gitlab 中推送存储库被拒绝错误
- javascript - ReactJS:第一个 useEffect 在第二个被触发之前不会更新状态