重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛
标题:
ORA-12012;ORA-06576: 不是有效的函数或过程名
[打印本页]
作者:
Inkcup
时间:
4 天前
标题:
ORA-12012;ORA-06576: 不是有效的函数或过程名
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;
/
=====
解决思路:
先查对象 -> 再查语法 -> 最后查权限
欢迎光临 重庆思庄Oracle、KingBase、PostgreSQL、Redhat认证学习论坛 (http://bbs.cqsztech.com/)
Powered by Discuz! X3.2