我有一个全局临时表(在提交-删除行时(,名为"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:对象不再存在
通话内容完全相同。由于这些过程背后的业务逻辑非常庞大,我试图简化它们。
更改全局临时表后,问题就消失了。我做了一个简单的改变。代替使用";提交时删除行";我用了">提交时保留行";
也许您已经了解了oracle支持和Doc ID 8103.1。当您的sql正在运行时,其他会话正在对表或索引执行ddl语句时,通常会引发此异常,即截断表或索引重建。
建议:通过设置跟踪ddl
ALTER SYSTEM SET enable_ddl_logging=TRUE scope=memory
然后运行您的代码,希望没有异常,稍后检查文件ddl_.log的诊断目录。它应该包含ddl语句和时间戳。
希望它有帮助-不要忘记重置ddl日志
ALTER SYSTEM SET enable_ddl_logging=FALSE scope=memory