|
|
本帖最后由 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
|
|