重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 28|回复: 0
打印 上一主题 下一主题

ORA-12012;ORA-06576: 不是有效的函数或过程名

[复制链接]
跳转到指定楼层
楼主
发表于 4 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ORA-12012: error on auto execute of job "ZLHIS"."AUTOMASSAGEDEL"
ORA-06576: 不是有效的函数或过程名

============================
这个错误是因为 Oracle 在尝试自动执行一个名为 "ZLHIS"."AUTOMASSAGEDEL" 的作业时失败了。

核心原因很明确:作业 AUTOMASSAGEDEL 试图调用的目标对象(一个存储过程或函数)无效、不存在,或者调用方式有误。


========
可能原因                                            详细说明
1. 目标存储过程/函数不存在或已损坏                    作业要调用的数据库对象(如一个名为 AUTOMASSAGEDEL 的过程)可能已被删除、重命名或其状态变为 INVALID。
2. 调用语法错误                                    最常见的情况是,作业在调用一个无参数的存储过程时,没有加上括号 ()。例如,错误地写成了 CALL AUTOMASSAGEDEL 而不是 CALL AUTOMASSAGEDEL()。
3. 权限不足                                        执行作业的用户(这里是 ZLHIS)可能没有被授予执行目标存储过程的权限。
4. 作业与对象类型不匹配                            作业配置中指定的 JOB_TYPE 与其要调用的 JOB_ACTION 类型不符。例如,JOB_TYPE 设置为 'STORED_PROCEDURE',但 JOB_ACTION 指向的是一个函数(Function)或包(Package)中的某个元素。
5. 作业元数据损坏                                    在极少数情况下,作业本身的定义在系统表中出现了异常,导致无法正确解析调用。



========
解决方案
==
第一步:确认目标对象的状态
-----
检查作业要调用的存储过程或函数是否完好。

-- 1. 查看作业定义(找到它具体要执行什么)
SELECT OWNER, JOB_NAME, JOB_TYPE, JOB_ACTION, STATE, ENABLED
FROM DBA_SCHEDULER_JOBS
WHERE OWNER = 'ZLHIS' AND JOB_NAME = 'AUTOMASSAGEDEL';

-- 2. 检查 JOB_ACTION 中指定的对象是否存在且有效
--    将 'JOB_ACTION里显示的名称' 替换为实际名称
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE OWNER = 'ZLHIS'
  AND OBJECT_NAME = 'JOB_ACTION里显示的名称';  -- 请替换

----
如果状态不是 VALID:你需要重新编译该存储过程或函数。

如果对象不存在:你需要从备份中恢复它,或者重新创建。

==
第二步:修复调用语法(最常见)
----
根据第一步查到的 JOB_TYPE 和 JOB_ACTION,检查并修正调用方式。

场景                                错误的调用方式 (会产生 ORA-06576)                    正确的调用方式
调用无参数存储过程                CALL MY_PROC 或 MY_PROC                            CALL MY_PROC()
在SQL Plus中用CALL调用无参过程        CALL MY_PROC;                                    CALL MY_PROC();
调用有参数存储过程                CALL MY_PROC(100) (参数个数或类型不匹配)            CALL MY_PROC(param1=>100); (确保参数匹配)

----
如果你的作业是DBMS_SCHEDULER作业,你需要通过重建作业来修正这个问题

-- 先停止并删除有问题的作业
BEGIN
  DBMS_SCHEDULER.STOP_JOB('ZLHIS.AUTOMASSAGEDEL', FORCE => TRUE);
  DBMS_SCHEDULER.DROP_JOB('ZLHIS.AUTOMASSAGEDEL', FORCE => TRUE);
END;
/

-- 重新创建作业,确保调用语法正确
BEGIN
  DBMS_SCHEDULER.CREATE_JOB (
    job_name        => 'ZLHIS.AUTOMASSAGEDEL',
    job_type        => 'STORED_PROCEDURE',  -- 根据实际类型填写
    job_action      => 'ZLHIS.YOUR_PROCEDURE_NAME', -- 替换为你的过程名
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0; BYSECOND=0', -- 替换为你的执行计划
    enabled         => TRUE,
    auto_drop       => FALSE
  );
END;
/


==
第三步:检查并授予权限
----
确保 ZLHIS 用户有执行该对象的权限。

-- 用拥有该对象的用户(或DBA)授予执行权限
GRANT EXECUTE ON ZLHIS.YOUR_PROCEDURE_NAME TO ZLHIS;  -- 请替换对象名

==
第四步:清理并重新启用
----
在完成以上修复后,清理失败的作业记录,并确保作业状态恢复正常。

-- 清除作业的运行历史记录
BEGIN
  DBMS_SCHEDULER.PURGE_LOG(JOB_NAME => 'ZLHIS.AUTOMASSAGEDEL');
END;
/

-- 重新启用作业
BEGIN
  DBMS_SCHEDULER.ENABLE('ZLHIS.AUTOMASSAGEDEL');
END;
/

=====
解决思路:

先查对象 -> 再查语法 -> 最后查权限


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 支持支持 反对反对
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|重庆思庄Oracle、Redhat认证学习论坛 ( 渝ICP备12004239号-4 )

GMT+8, 2026-4-30 09:45 , Processed in 0.231006 second(s), 21 queries .

重庆思庄学习中心论坛-重庆思庄科技有限公司论坛

© 2001-2020

快速回复 返回顶部 返回列表