Oracle 19c(Azure云)DBMS_SCHEDULER作业执行失败求助
Oracle 11迁移至Azure Oracle 19c后DBMS_SCHEDULER作业执行失败排查方案
问题背景
将应用从本地Oracle 11迁移到Azure云Oracle 19c后,原有DBMS_SCHEDULER作业执行失败。该作业调用包内存储过程加载记录类型数据到表中,作业创建代码如下:
BEGIN DBMS_SCHEDULER.CREATE_JOB ( job_name => 'e_job', job_type => 'PLSQL_BLOCK', job_action => 'BEGIN a_pkg.load_payload; END;', start_date => TRUNC (SYSDATE) + (ROUND ( (SYSDATE - TRUNC (SYSDATE)) * 48) / 48), repeat_interval => 'FREQ=MINUTELY;BYMINUTE=25,55;', end_date => NULL, enabled => TRUE, comments => 'Creates Notifications'); END;
执行时触发错误:
ORA-06550: line 1, column 763: PLS-00201: identifier 'a_pkg.load_payload' must be declared ORA-06550: line 1, column 500: PL/SQL: Statement ignored
已尝试授予PUBLIC对SYS.DBMS_SCHEDULER及目标包的EXECUTE权限,但问题未解决。
排查与解决步骤
1. 确认作业执行用户的权限与包的可见性
- 查看作业的执行用户:执行
SELECT owner, job_name, username FROM dba_scheduler_jobs WHERE job_name = 'E_JOB';,确认作业运行的身份用户。 - 检查该用户是否被显式授予目标包
a_pkg的EXECUTE权限:执行SELECT grantee, privilege FROM dba_tab_privs WHERE table_name = 'A_PKG' AND privilege = 'EXECUTE';,确保作业执行用户在列表中,不要仅依赖PUBLIC角色的权限。 - 若包属于其他用户,作业的PLSQL块需指定包的所有者,比如
BEGIN schema_a.a_pkg.load_payload; END;,避免因schema路径问题找不到对象。
2. 检查包的存在性与有效性
- 确认包在Azure Oracle 19c中存在且状态有效:
确保两者状态均为SELECT object_name, status FROM dba_objects WHERE object_name = 'A_PKG' AND object_type = 'PACKAGE'; SELECT object_name, status FROM dba_objects WHERE object_name = 'A_PKG' AND object_type = 'PACKAGE BODY';VALID。 - 若包状态无效,重新编译包:
ALTER PACKAGE a_pkg COMPILE;和ALTER PACKAGE a_pkg COMPILE BODY;,解决编译错误后再测试作业。
3. 排查Azure Oracle 19c的CDB/PDB环境差异
- Azure Oracle 19c默认采用容器数据库(CDB)架构,确认包和作业是否在同一个可插拔数据库(PDB)中:
确保两者的SELECT con_id, owner, object_name FROM dba_objects WHERE object_name = 'A_PKG'; SELECT con_id, owner, job_name FROM dba_scheduler_jobs WHERE job_name = 'E_JOB';con_id一致。 - 如果作业和包不在同一PDB,需将包迁移到作业所在PDB,或调整作业执行环境到包所在PDB。
4. 检查DBMS_SCHEDULER作业的权限设置
- 确认作业执行用户拥有
CREATE JOB或MANAGE SCHEDULER权限:SELECT grantee, privilege FROM dba_sys_privs WHERE grantee = '作业执行用户名' AND (privilege LIKE '%JOB%' OR privilege LIKE '%SCHEDULER%'); - 给作业执行用户显式授予所需权限,包括对
DBMS_SCHEDULER的EXECUTE权限,避免依赖PUBLIC角色。
5. 验证PLSQL块的直接执行情况
- 以作业执行用户身份登录数据库,直接运行作业中的PLSQL块:
BEGIN a_pkg.load_payload; END;,如果同样报错,说明问题出在用户权限或包本身,而非DBMS_SCHEDULER配置。 - 如果直接执行成功,再检查作业的其他配置,比如
start_date表达式在19c中的兼容性,或作业的job_class是否影响权限。
内容的提问来源于stack exchange,提问作者vana
相关产品推荐
相关产品推荐

