-1

我有一个名为“GLOBAL_T”的全局临时表(在提交删除行上)和一个将 SYS_REFCURSOR 作为 OUTPUT 参数的存储过程。

所以你可以这样想一个存储过程:

PROCEDURE test (POT_CURSOR OUT SYS_REFCURSOR)
IS
BEGIN

--TO FILL THE GTT, CALL ANOTHER PROCEDURE
--BTW, FOLLOWING PROCEDURE HAS NO COMMIT
A_SCHEMA_NAME.A_PACKAGE_NAME.ANOTHER_PROCEDURE();

OPEN POT_CURSOR FOR
SELECT STH FROM GLOBAL_T, BUNCH_OF_OTHER_TABLES B
WHERE B.BLABLA = GLOBAL_T.BLABLA
AND B.BUNCH_OF_OTHER_COLUMNS = T.OTHER_COLUMNS;

END;

问题是当我在 pl/sql 块中调用该过程时,它工作正常。但是当我从 .NET 调用该过程时,它给了我ORA-08103:对象不再存在

调用完全相同。由于程序背后的业务逻辑非常庞大,我试图简化它们。

4

2 回答 2

0

更改全局临时表后,问题就消失了。我做了一个简单的改变。我没有使用“提交时删除行”,而是使用了“提交时保留行

于 2020-07-23T06:58:51.443 回答
0

也许您可以查看 oracle-support 和 Doc ID 8103.1。当您的 sql 正在运行时,当其他会话对表或索引执行 ddl 语句时,通常会引发此异常 - 即截断表或索引重建。

建议:通过设置跟踪 ddl

ALTER SYSTEM SET enable_ddl_logging=TRUE scope=memory

然后有希望地运行您的代码,然后检查文件 ddl_.log 的诊断目录。它应该包含 ddl 语句以及时间戳。

希望它有所帮助 - 不要忘记重置 ddl-logging

ALTER SYSTEM SET enable_ddl_logging=FALSE scope=memory
于 2020-07-22T18:49:17.323 回答