Oracle 创建JOB调用存储过程自动归档删除LOG类表

-- 查询定时任务的语句: SELECT * FROM user_scheduler_jobs;
-- 查询所有用户的定时任务:  SELECT * FROM ALL_SCHEDULER_JOBS; 
-- 注意定时任务的OWNER
-- 查询定时任务执行的LOG表: SELECT *  FROM user_scheduler_job_log  WHERE job_name = 'JOB_PROC_QUALITY_STATISTICS_DAILY'  ORDER BY log_date DESC;
-- 这个定时任务的执行,需要系统权限


-- 1. 创建存储过程:
-- 日期格式需要转译: 3/18/2024 2:18:33 PM 
-- SELECT to_char((SYSDATE - 30),'d/mm/yyyy hh24:mi:ss AM') FROM dual ;

CREATE OR REPLACE PROCEDURE PROC_DELETE_EXPIRED_RECORDS(p_input_param IN NUMBER)
AS
BEGIN
  DELETE LOG_T WHERE CREATE_TIME < SYSDATE - p_input_param;
  DELETE LOG_S WHERE UPDATETIME < to_char((SY

<think>首先,用户的问题是:"我想查找与OracleJob相关的存储过程信息或使用方法请问Oraclejob使用的存储过程如何查询Oracledbms_job或dbms_scheduler相关存储过程"。所以,用户想了解如何查询与dbms_job或dbms_scheduler相关的存储过程。用户提供了几个引用:-引用[1]:谈论dbms_job调用存储过程需要显式授权,而dbms_scheduler不需要;还提到dbms_scheduler有日志视图。-引用[2]:官方文档链接。-引用[3]:关于dbms_scheduler.create_job的示例,用于调用存储过程。-引用[4]:dbms_job和dbms_scheduler的使用方法示例。这些引用是针对Oracle的定时任务,具体是dbms_job和dbms_scheduler包。我的角色是根据系统级指令回答问题:-所有行内数学达式用$...$。-独立公式用$$...$$并单独成段。-LaTeX语法正确。-用中文回答。-生成相关问题。-引用的段落末尾添加引用标识。在回答中,我需要参考用户上一次的问题和我的回答。但这是这个对话的初始问题,所以我应该直接基于用户的问题。用户的具体查询:"如何查询Oracledbms_job或dbms_scheduler相关存储过程"意思是他们想知道如何查找、查询这些存储过程的用法或方法。在Oracle中,dbms_job和dbms_scheduler是内置的包,不是普通存储过程;但它们可以用来调用存储过程。用户可能想知道如何定义或查询这些包相关的信息。从引用中:-dbms_scheduler可以调用存储过程作为job动作。-dbms_job也可以调用存储过程。用户想知道如何查询这些相关的存储过程。查询存储过程的方法可以是:1.使用Oracle数据字典视图来查看存储过程。2.查询特定的包如dbms_job或dbms_scheduler的文档。最佳实践是查询数据字典或查看Oracle官方文档。根据系统指令,我需要生成相关问题。步骤结构:1.理解用户需求:他们想学习如何使用dbms_job或dbms_scheduler来调用或管理job,但具体是"查询"存储过程,可能意味着查看定义、参数或调用方式。用户说:"如何查询Oracledbms_job或dbms_scheduler相关存储过程",所以可能是查询数据库中的存储过程定义。在Oracle中,存储过程的定义可以在USER_PROCEDURES,USER_SOURCE等视图中查询。例如:-查找所有存储过程:`SELECT*FROMUSER_OBJECTSWHEREOBJECT_TYPE='PROCEDURE'`;-查看存储过程源码:`SELECTTEXTFROMUSER_SOURCEWHERENAME='PROCEDURE_NAME'`;对于dbms_job或dbms_scheduler特定的调用,这些是包的方法。dbms_scheduler有存储过程如create_job等。用户可能想知道如何查询这些包的详细信息或如何查询job调用存储过程。从引用[3]和[4],他们给出了创建job的例子,调用存储过程。所以,我应该解释:-如何查询现有的存储过程定义。-如何创建job使用dbms_scheduler或dbms_job调用存储过程。用户特别问到"如何查询",所以重点在查询部分。参考引用:-引用[2]有官方文档链接。-引用[3]和[4]有创建job的代码示例。在回答中,我需要包含引用。结构回答:1.介绍:简述dbms_job和dbms_scheduler的区别,基于引用[1]。2.解释如何查询存储过程:使用数据字典视图。3.提供查询示例。4.解释如何使用dbms_scheduler或dbms_job调用存储过程。5.生成相关问题。用中文回答。确保LaTeX:这里可能没有数学公式,但如果涉及SQL查询,可以使用行内格式,如`SELECT*FROM...`。系统指令说数学达式,但SQL查询可以视为代码块,不需要LaTeX。在指令中说:"所有行内数学达式(包括变量、不等式、方程等)必须使用$...$",所以对于SQL代码,我会像在示例中那样用代码块。在示例中,代码用了```python...```。似地,用```sql...```。现在,内容大纲:-第一部分:概述dbms_job和dbms_scheduler。-引用引用[1]。-第二部分:如何查询存储过程。-介绍数据字典视图如USER_PROCEDURES,ALL_PROCEDURES,DBA_PROCEDURES;USER_SOURCE等。-SQL查询例子。-例如:`SELECTOBJECT_NAMEFROMUSER_OBJECTSWHEREOBJECT_TYPE='PROCEDURE'`;-第三部分:对于dbms_scheduler或dbms_job调用存储过程。-基于引用[3]和[4]。-解释create_job方法。-第四部分:生成相关问题。引用标识:[^1],[^2],etc.添加引用在相关段落末尾。例如:dbms_scheduler更便于调用存储过程不需要显式授权[^1]。详细文档见[^2]。现在,生成相关问题:似于示例格式。相关问题例子:1.dbms_scheduler如何创建定期任务调用存储过程?2.dbms_job和dbms_scheduler的主要区别是什么?3.如何查询job运行日志?4.Oracle官方文档在哪里可以找到dbms_scheduler的详细信息?确保语言是中文。</think> ### Oracle Job 相关存储过程的查询和使用方法 在Oracle数据库中,`DBMS_JOB` 和 `DBMS_SCHEDULER` 是用于管理定时任务(如调度存储过程执行)的包。`DBMS_JOB` 是旧版方法(现已不推荐),而 `DBMS_SCHEDULER` 在Oracle 10g以后成为首选,因为它功能更强且便于使用,例如调用存储过程不需显式授权,并提供日志视图方便查询[^1]。以下是详细步骤,帮助您查询和使用这些相关的存储过程。 #### 1. 查询存储过程的定义和方法 要查询数据库中的存储过程(包括定义、参数或源码),可以使用Oracle的数据字典视图。这些视图存储在系统中,您可以通过SQL语句访问。常用视图包括: - **`USER_PROCEDURES`**: 查询当前用户拥有的存储过程信息,包括参数。 - **`USER_SOURCE`**: 查看存储过程的源代码。 - **`USER_OBJECTS`**: 列出所有对象(包括存储过程)。 - 对于`DBMS_JOB` 或 `DBMS_SCHEDULER`包相关的存储过程(如创建job的方法),官方文档是最权威资源[^2]。 以下SQL查询示例可帮助您操作: - **查询所有存储过程名称**: ```sql SELECT OBJECT_NAME FROM USER_OBJECTS WHERE OBJECT_TYPE = 'PROCEDURE'; ``` 这列出当前用户的存储过程名,便于后续查询。 - **查看具体存储过程的源码**: 例如,查询名为`AUTOMATIC_CLOCK_IN`的存储过程源码: ```sql SELECT TEXT FROM USER_SOURCE WHERE NAME = 'AUTOMATIC_CLOCK_IN' ORDER BY LINE; ``` 结果将显示每行代码,帮助您理解定义。 - **查询存储过程的参数信息**: ```sql SELECT OBJECT_NAME, ARGUMENT_NAME, DATA_TYPE FROM USER_ARGUMENTS WHERE PACKAGE_NAME IS NULL AND OBJECT_NAME = '存储过程名'; ``` 替换“存储过程名”为目标名称,可获取输入输出参数。 通过这些查询,您可以快速定位存储过程的具体实现。如果需要更详细文档(如`DBMS_SCHEDULER.CREATE_JOB`方法),请参考Oracle官方链接[^2]。 #### 2. 使用 `DBMS_SCHEDULER` 调用存储过程创建定时任务 `DBMS_SCHEDULER` 是推荐方式,因为它不需要显式授权存储过程,且支持日志查询[^1][^3]。以下步骤和代码示例展示如何创建定时任务调用存储过程: - **步骤简述**: - 确保存储过程创建(例如`AUTOMATIC_CLOCK_IN`)。 - 使用`DBMS_SCHEDULER.CREATE_JOB`创建job,指定`job_type`为`'STORED_PROCEDURE'`和`job_action`为存储过程名。 - 设置`repeat_interval`指定调度频率(如每天8点)。 - 可通过`USER_SCHEDULER_JOB_LOG`视图查询job运行日志。 - **代码示例(基于引用[3][^3])**: ```sql -- 检查并删除现有job,避免冲突 DECLARE v_count INT := 0; BEGIN SELECT COUNT(*) INTO v_count FROM USER_SCHEDULER_JOBS WHERE JOB_NAME = 'TEST_JOB1'; IF v_count > 0 THEN DBMS_SCHEDULER.DROP_JOB('TEST_JOB1'); END IF; -- 创建定时任务,每天8点执行存储过程AUTOMATIC_CLOCK_IN DBMS_SCHEDULER.CREATE_JOB( job_name => 'TEST_JOB1', job_type => 'STORED_PROCEDURE', job_action => 'AUTOMATIC_CLOCK_IN', -- 存储过程名 start_date => SYSDATE, repeat_interval => 'Freq=DAILY; BYHOUR=8', -- 调度频率 enabled => TRUE, comments => 'Daily automatic task' ); END; / ``` 执行后,任务将自动调用存储过程。日志查询使用: ```sql SELECT LOG_DATE, STATUS FROM USER_SCHEDULER_JOB_LOG WHERE JOB_NAME = 'TEST_JOB1'; ``` #### 3. 使用 `DBMS_JOB` 调用存储过程(遗留方法) `DBMS_JOB` 仍可用,但需显式授权存储过程(即使定义为`AUTHID CURRENT_USER`也可能失败),且缺少高级功能如内置日志[^1]。示例代码(基于引用[4][^4]): ```sql BEGIN DBMS_JOB.SUBMIT( job => job_id, -- job_id是OUT参数 what => 'my_test;', -- 存储过程名,注意分号结尾 next_date => SYSDATE, interval => 'SYSDATE + 1/1440' -- 每分钟运行一次 ); COMMIT; END; / ``` 查询现有job: ```sql SELECT JOB, WHAT FROM USER_JOBS; -- 显示调用存储过程 ``` ### 关键注意事项 - **授权问题**:`DBMS_JOB` 需要存储过程被显式授权给用户,而`DBMS_SCHEDULER`不需额外步骤[^1]。 - **日志查询**:`DBMS_SCHEDULER`提供`USER_SCHEDULER_JOB_LOG`视图,便于调试故障[^1]。 - **官方文档**:所有包方法的完整定义请查询[Oracle官方文档](https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_SCHEDULER.html)[^2][^4]。 通过以上方法,您可以有效查询存储过程定义,并利用job包调度任务。实践前,建议测试在开发环境。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值