如何创建带SYSDATE参数的Oracle Job?运行报ORA-12011错误是什么原因?
Oracle 11g DBMS_JOB运行报ORA-12011错误的常见原因及解决方案
你创建Job的代码、手动执行存储过程的逻辑均无语法错误,手动执行存储过程正常但Job运行报错,可按以下优先级排查问题:
排查方向
权限适配问题(最高概率)
DBMS_JOB运行时默认仅识别用户直接持有权限,通过角色(如DBA、RESOURCE)授予的权限在Job执行上下文不会生效。- 执行以下SQL验证权限:
SELECT * FROM USER_TAB_PRIVS WHERE TABLE_NAME = 'SP_XXX' AND OWNER = 'XXX' AND GRANTEE = '创建Job的用户名';- 若无返回结果,让DBA执行授权语句即可解决:
GRANT EXECUTE ON XXX.SP_XXX TO 你的用户名;Job ID使用错误
你提交Job时job_id是PL/SQL块内的局部变量,执行dbms_job.run时若没有传入正确的Job编号会触发报错。- 先执行以下SQL查询你创建的Job正确编号:
SELECT JOB, WHAT, BROKEN FROM USER_JOBS WHERE WHAT LIKE '%SP_XXX%';- 用查询得到的JOB字段值替换
dbms_job.run的参数即可。
Job被标记为中断(BROKEN)
若之前Job运行失败次数超过16次,Oracle会自动将Job标记为中断状态,无法直接运行。- 执行语句解除中断状态:
EXEC DBMS_JOB.BROKEN(正确的JobID, FALSE);- 再重新运行Job即可。
存储过程内部逻辑限制
若SP_XXX内部存在校验当前会话用户、读取会话级临时表等逻辑,Job运行的会话上下文与你手动执行的会话上下文不一致也会触发报错,可在存储过程开头增加运行日志打印,定位具体错误点。
内容的提问来源于stack exchange,提问作者orzalter
相关产品推荐
相关产品推荐

