【发布时间】:2018-11-22 02:14:30
【问题描述】:
我们的 Oracle 数据库最近从 12.1.0.2 更新到 12.2.0.1 + 补丁集更新 20180417。
自从更新以来,我们在调用 plsql 过程时收到以下错误: ORA-21700: 对象不存在或被标记为删除
我们已经缩小了这个问题的范围,它似乎是由在包中定义的关联数组上使用 table 运算符 引起的。我所有的研究表明,我们正在做的事情是在 12.1 中引入的,并且应该在 12.2 中仍然有效。
以下是失败的过程的简化版本以及相关的类型定义。它是使用托管数据访问从 c# 代码调用的。
这里是包中的关联数组类型定义:
TYPE NUMBER_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
这是一个失败的过程:
PROCEDURE GetReadingStatus(
STATUSID_ARR IN NUMBER_ARRAY,
P_RETURNS OUT SYS_REFCURSOR
)
BEGIN
OPEN P_RETURNS FOR
SELECT * FROM READINGSTATUS rs
WHERE rs.statusID IN (select * from table(STATUSID_ARR));
END;
如果select * from table(STATUSID_ARR) 部分被删除,它就会运行。
在 12.2 中对关联数组使用表运算符有问题吗?问题可能源于其他原因吗?
【问题讨论】:
-
你使用的是定义者权限还是调用者权限?没关系,但是,你永远不会知道......另外,做一个
show parameter compatible,看看它是否以某种方式设置为 -
在 12.2 中为我工作。如果您发布端到端演示,可能会出现一些差异。
-
@MarkStewart 我检查了兼容性并将其设置为 12.1,所以这似乎不是问题。我相信它正在使用定义者的权利。我的理解是,如果它明确告诉它,它只会在 plsql 中使用调用者权限(如果我错了,请纠正我)。
-
使用以下查询检查任何奇怪、无效或丢弃的类型:
select * from dba_types where type_name like 'SYS%';、select * from dba_objects where status <> 'VALID';、select * from dba_recyclebin;。 Oracle 有时会创建系统生成的类型来支持表运算符之类的东西。但是在以后的版本中,它有时不再需要它们了。也许其中一种类型在不需要时被转换了,这让 Oracle 感到困惑? -
由于您可以应用补丁集,因此您似乎拥有 Oracle 支持合同。所以我建议你在 MOS 上提出这个问题,因为它看起来更像是一个错误,而不是我们可以提供的任何帮助。
标签: sql oracle plsql oracle12c oracle-manageddataaccess