You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 22:15:15