具有函数 ORA-08103 的 Oracle 存储过程
Posted
技术标签:
【中文标题】具有函数 ORA-08103 的 Oracle 存储过程【英文标题】:Oracle stored procedure with function ORA-08103 【发布时间】:2021-12-03 04:07:26 【问题描述】:我有一个具有函数调用的存储过程,运行大约 10 分钟后出现以下错误:
[错误] 执行 (1:1): ORA-08103: 对象不再存在 ORA-06512:在“CRYSTAL_REPORTS.FT_PAYCOM_ASOF”,第 141 行 ORA-06512:在“CRYSTAL_REPORTS.PROC_DASHQS_PRODUCTION”,第 26 行 ORA-06512: 在第 2 行
但是该功能确实存在并且按预期工作。剥离查询返回结果,所以我担心复杂性可能是原因。感谢您的帮助,以下是程序:
select
to_char(dt.dt,'YYYYMM') yearmonth,
ud.user_id,
CRYSTAL_REPORTS.FT_PAYCOM_ASOF(ud.user_eecode, dt.dt, 'DEPT') department,
CRYSTAL_REPORTS.FT_PAYCOM_ASOF(ud.user_eecode, dt.dt, 'PDEPT') par_department,
sum(case when clm.event_desc = 'NEW-OPEN' then 1 else 0 end) new_claim,
sum(case when clm.event_desc in ('INITIAL-CLOSE', 'RECLOSE', 'VOID') then 1 else 0 end) close_claim,
sum(case when clm.event_desc ='REOPEN' then 1 else 0 end) reopen_claim,
sum(case when clm.event_desc ='TRANSFER-IN' then 1 else 0 end) trans_in_claim,
sum(case when clm.event_desc ='TRANSFER-OUT' then 1 else 0 end) trans_out_claim,
sum(case when res.event_desc ='NEW-OPEN' then 1 else 0 end) new_res,
sum(case when res.event_desc in ('INITIAL-CLOSE','RECLOSE','VOID') then 1 else 0 end) close_res,
sum(case when res.event_desc ='REOPEN' then 1 else 0 end) reopen_res,
sum(case when res.event_desc ='TRANSFER-IN' then 1 else 0 end) trans_in_res,
sum(case when res.event_desc ='TRANSFER-OUT' then 1 else 0 end) trans_out_res,
sum(clm_wh.pending) pending_claims,
sum(res_wh.pending) pending_reserves
from
(select "DATE" dt from CRYSTAL_REPORTS.MV_CALENDAR_MONTHDATE) dt
cross join
crystal_reports.user_director ud
left join
CRYSTAL_REPORTS.MV_PROD_CLM_EVENT clm on clm.USER_ID = ud.USER_ID and to_char(clm.event_date,'YYYYMM') = to_char(dt.dt,'YYYYMM')
left join
CRYSTAL_REPORTS.MV_PROD_RES_EVENT res on res.USER_ID = ud.USER_ID and to_char(res.event_date,'YYYYMM')=to_char(dt.dt,'YYYYMM')
left join
crystal_reports.TBL_CLAIM_PROD_WH clm_wh on clm_wh.ADJUSTER=ud.user_id and clm_wh.type='MONTH' and to_char(dt.dt,'YYYYMM')= clm_wh.datadate
left join
crystal_reports.TBL_FEAT_PROD_WH res_wh on res_wh.ADJUSTER=ud.user_id and res_wh.type='MONTH' and to_char(dt.dt,'YYYYMM')= res_wh.datadate
where
to_char(dt.dt,'YYYYMMDD') = 20210901
and ud.user_id not like '%TEST%'
group by
to_char(dt.dt,'YYYYMM'), ud.user_id,
CRYSTAL_REPORTS.FT_PAYCOM_ASOF(ud.user_eecode, dt.dt, 'DEPT'),
CRYSTAL_REPORTS.FT_PAYCOM_ASOF(ud.user_eecode, dt.dt, 'PDEPT')
该函数经过几个 IF 语句,最终使用:
SELECT upper(case when uc_dept.detaildesc is null and orig_dept.detaildesc is null then upper(pext_dept.detaildesc) else upper(nvl(uc_dept.detaildesc,orig_dept.detaildesc)) end)
INTO xout_val
FROM crystal_reports.API_PAYCOM_USER_EXTENDED pext
left join crystal_reports.API_PAYCOM_USER_CHANGES uc on pext.EECODE = uc.EECODE and changedesc='PAF: Department Change' and (to_date(substr(changetime, 1,10), 'yyyy-mm-dd')) <= asof
left join crystal_reports.api_paycom_category pext_dept on pext_dept.detailcode=pext.DEPARTMENT_CODE
left join crystal_reports.api_paycom_category uc_dept on uc_dept.DETAILCODE=uc.new_value
left join (select eecode, orig_value,rn
from
(
select eecode,old_value orig_value, row_number() over (partition by eecode order by (to_date(substr(changetime, 1,10), 'yyyy-mm-dd')) asc) rn
from
crystal_reports.API_PAYCOM_USER_CHANGES orig_val
where changedesc='PAF: Department Change'
)
) orig_val on pext.eecode=orig_val.eecode and orig_val.rn=1
left join crystal_reports.api_paycom_category orig_dept on orig_dept.detailcode=orig_val.orig_value
where
acct=pext.eecode
order by (to_date(substr(changetime, 1,10), 'yyyy-mm-dd')) desc
FETCH NEXT 1 ROWS ONLY
【问题讨论】:
这是 PROC_DASHQS_PRODUCTION 过程,对吧?它使用 FT_PAYCOM_ASOF 函数。函数的第 141 行是什么? 是的,就是过程名。函数中的第141行是:SELECT upper(case when uc_dept.detaildesc is null and orig_dept.detaildesc is null then upper(pext_dept.detaildesc) else upper(nvl(uc_dept.detaildesc,orig_dept.detaildesc)) end) 您需要发布完整的函数或至少包含上述内容的整个语句以及围绕它的代码。实际的例外是ORA-08103: object no longer exists
。造成这种情况的原因有多种,但一个常见的原因(至少我已经看到)是一个 temp_table,它具有 ON COMMIT DELETE ROWS
并且在处理该表时提交。但这只是暗中的一击。通过更新问题而不是评论来发布功能。注意ORA-06512
是 Oracle 试图帮助您找出问题所在。
谢谢您的建议,我已添加代码
使用此查询来帮助查找可能导致错误的最近修改的对象:select * from dba_objects order by last_ddl_time desc
这些错误通常是由对依赖对象执行 DDL 的进程引起的,例如截断命令。尽管在 Oracle 中读取器和写入器不会相互阻塞,但对象上的 DDL 可能会破坏当前正在使用已更改对象的查询。
【参考方案1】:
远程诊断此类错误非常困难,但根据我的经验,此错误最可能的原因是另一个进程/用户在操作开始后删除了该对象。 或者,还有一些与此错误相关的 Oracle 错误,您可能需要检查警报日志并最终向 Oracle 寻求使用 MOS 的帮助。
【讨论】:
以上是关于具有函数 ORA-08103 的 Oracle 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
Oracle ORA-06512&ORA-08103对象已不存在
异常 ORA-08103: 使用 Hibernate 的 setfetchsize 时对象不再存在