gpt4 book ai didi

sql - 从 12.1 更新到 Oracle 12.2 后 Table Operator 出现错误 (ORA-21700)

转载 作者:行者123 更新时间:2023-12-04 12:50:59 25 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





ORA-21700: object does not exist or is marked for delete for Associative Array as input parameter called from ODP.NET

(1 个回答)


去年关闭。




我们的 Oracle 数据库最近从 12.1.0.2 更新到 12.2.0.1 + 补丁集更新 20180417。

自从更新后,我们在调用 plsql 过程时收到以下错误:
ORA-21700: 对象不存在或被标记为删除

我们已经缩小了问题的范围,它似乎是由在包中定义的关联数组上使用表运算符引起的。我所有的研究表明,我们正在做的事情是在 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 中对关联数组使用表运算符有问题吗?问题可能源于其他方面吗?

最佳答案

All my research shows that what we are doing was introduced in 12.1 and should still work in 12.2.



这是真的。之前 Oracle 12c ,您不能在 SQL 的范围内使用关联数组 PLSQL 中的语句堵塞。但是,Oracle 确保在推出新版本时,旧版本不会受到影响。我试图测试你的代码,它在我结束时工作正常。看起来问题在其他地方,可能是使用 C# 时的一些问题。见下面的演示:

我的 Oracle 版本:
SQL> select * from v$version;

BANNER
------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

表数据:
SQL>SELECT * from TEST;
col
---
1
2
3

包裹:
--Package Specification
CREATE OR REPLACE PACKAGE TESTTT
AS
TYPE NUMBER_ARRAY IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;

Procedure GetReadingStatus (
STATUSID_ARR IN NUMBER_ARRAY,
P_RETURNS OUT SYS_REFCURSOR
);
END;
/
--Package Body
CREATE OR REPLACE PACKAGE BODY TESTTT
AS
PROCEDURE GetReadingStatus(
STATUSID_ARR IN NUMBER_ARRAY,
P_RETURNS OUT SYS_REFCURSOR
)
Is
BEGIN
OPEN P_RETURNS FOR
SELECT *
FROM TEST
where col IN (SELECT * FROM TABLE(STATUSID_ARR));
END;
END TESTTT;

电话:
DECLARE
var TESTTT.NUMBER_ARRAY;
v_out sys_refcursor;
num NUMBER;

BEGIN

var(1):= '1';
var(2):= '2';

TESTTT.GetReadingStatus(STATUSID_ARR=>var,
P_RETURNS =>v_out);

Loop
fetch v_out INTO num;
exit WHEN v_out%notfound;
dbms_output.put_line('Return From Procdure--'||num);
end loop;

end;

输出:
Return From Procdure--1
Return From Procdure--2

关于sql - 从 12.1 更新到 Oracle 12.2 后 Table Operator 出现错误 (ORA-21700),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50821267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com