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

标题: 实验记录:Oracle定时任务(Job)执行失败;ORA-06576调用的存储过程/函数无效 [打印本页]

作者: Inkcup    时间: 4 小时前
标题: 实验记录:Oracle定时任务(Job)执行失败;ORA-06576调用的存储过程/函数无效
本帖最后由 Inkcup 于 2026-5-8 00:29 编辑

步骤1:创建用户(如果未创建)

CONN / AS SYSDBA

-- 创建用户
CREATE USER ZLHIS IDENTIFIED BY ZLHIS
DEFAULT TABLESPACE USERS
QUOTA UNLIMITED ON USERS;

-- 授予权限
GRANT CONNECT, RESOURCE, CREATE JOB TO ZLHIS;
GRANT CREATE PROCEDURE TO ZLHIS;
GRANT EXECUTE ON DBMS_JOB TO ZLHIS;
GRANT EXECUTE ON DBMS_SCHEDULER TO ZLHIS;

步骤2:切换到 ZLHIS 用户CONN ZLHIS/ZLHIS

步骤3:创建空的存储过程(模拟真实场景)-- 创建一个简单的存储过程
CREATE OR REPLACE PROCEDURE ZLHIS.AUTOMASSAGEDEL
IS
BEGIN
  -- 稍后会添加真正的业务逻辑
  DBMS_OUTPUT.PUT_LINE('AUTOMASSAGEDEL executed at: ' || TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));
  
  -- 模拟删除过期消息
  -- DELETE FROM MESSAGES WHERE CREATE_DATE < SYSDATE - 30;
  -- COMMIT;
END;
/

-- 验证存储过程状态
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'AUTOMASSAGEDEL';

步骤4:创建定时任务-- 使用 DBMS_JOB 创建
DECLARE
  jobno NUMBER;
BEGIN
  DBMS_JOB.SUBMIT(
    job       => jobno,
    what      => 'AUTOMASSAGEDEL;',
    next_date => SYSDATE,
    interval  => 'SYSDATE + 1/1440'  -- 每分钟执行一次
  );
  COMMIT;
  DBMS_OUTPUT.PUT_LINE('Job created successfully, Job ID: ' || jobno);
END;
/

-- 查看创建的任务
SELECT JOB, WHAT, NEXT_DATE, BROKEN, FAILURES, LAST_DATE
FROM USER_JOBS;

步骤5:模拟问题场景


场景A:让存储过程变为无效-- 删除依赖的对象(如果有)
-- 或者修改存储过程引入错误
CREATE OR REPLACE PROCEDURE ZLHIS.AUTOMASSAGEDEL
IS
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count FROM NON_EXISTENT_TABLE;  -- 这个表不存在
  DBMS_OUTPUT.PUT_LINE('Count: ' || v_count);
END;
/

-- 查看状态(应该是 INVALID)
SELECT OBJECT_NAME, STATUS FROM USER_OBJECTS WHERE OBJECT_NAME = 'AUTOMASSAGEDEL';

-- 查看编译错误
SHOW ERRORS
8741669fcbce43b49c.png
登录/注册后可看大图