`
mengqingyu
  • 浏览: 333290 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

oracle定时调用存储过程

阅读更多
要求:每月24日定时抽取表mlk_flag_2012最新月份的数据作为当月的数据插入到表mlk_flag_2012中,例如,7月24号前,表mlk_flag_2012中只有1-6月份的数据,7月24号抽取6月份的数据作为7月份的初始值。

步骤:

一:创建存储过程MLK_FLAG_PROC  作用:抽取表mlk_flag最新月份的数据作为当月的数据插入。对于表不存在及无历史数据的情况都做了处理,也可以作为oracle初始化之用。
create or replace procedure MLK_FLAG_PRO_NEW as
    year_ varchar2(4); 
    create_table_ varchar2(3000); 
    insert_data_  varchar2(3000); 
    is_latest_year varchar2(100); 
    delete_sql_ varchar2(3000); 
    is_exists_sql_ varchar2(3000); 
    is_exists_ number(10); 
    username varchar(200); 
    columns_name_sql varchar(3000); 
    columns_name varchar(3000);
 
begin year_ := to_char(sysdate,'yyyy');
 --处理mlk flag  
DBMS_OUTPUT.PUT_LINE('处理mlk flag');  
select substr(max(table_name),length(max(table_name))-3,4) into is_latest_year from user_tables   where table_name like 'MLK_FLAG_%';  
--判断当年表是否存在  
--1.当年表存在  
if is_latest_year=year_ then 
    --判断当前月份是否存在数据,若存在,删除当前月份数据,然后倒入最新数据  
    is_exists_sql_ :=' select count(*)   from  MLK_FLAG_'||year_||'  where time_ =  to_char(sysdate,''yyyymm'') ';    
    execute immediate is_exists_sql_ into is_exists_;   
    if is_exists_>0 then  
        delete_sql_  :='delete from MLK_FLAG_'||year_||' where time_ =  to_char(sysdate,''yyyymm'') ';   
        execute immediate delete_sql_;   
        commit;     
    end if;   
    columns_name_sql :='select substr(max(sys_connect_by_path(NAME, '','')), 2, 10000)  columns_name  
                        from (                         
                    SELECT COLUMN_NAME as NAME, rownum ro FROM USER_TAB_COLUMNS                         
                    WHERE TABLE_NAME = ''MLK_FLAG_'||year_||''' AND COLUMN_NAME!=''TIME_''                        
                     ORDER BY COLUMN_ID                  
                ) newtab                   
                start with newtab.ro = 1                  
                connect by prior newtab.ro = newtab.ro-1';    
    DBMS_OUTPUT.PUT_LINE(columns_name_sql);   
    execute immediate columns_name_sql into columns_name;   
    DBMS_OUTPUT.PUT_LINE(columns_name);  
    insert_data_ := ' insert into MLK_FLAG_'||year_||'   
            ('||columns_name||',time_)   
            select '||columns_name||' ,to_char(sysdate,''yyyymm'')  as TIME_      
            from MLK_FLAG_'||year_||'     
            where time_=(select max(time_) from MLK_FLAG_'||year_||')' ;     
    DBMS_OUTPUT.PUT_LINE(insert_data_); execute immediate insert_data_; 
    commit; 
end if; 
--2.当年表不存在,创建当年表,并将上年的最后一个月份的数据倒入当当年表中 
select user into username from dual; 
execute immediate 'grant create table to '||username; 
if is_latest_year<year_ then 
    create_table_ := ' create table MLK_FLAG_'||year_|| ' as   
            select * from MLK_FLAG_'||is_latest_year||' where rownum<1' ; 
    execute immediate create_table_;  
    columns_name_sql :='select substr(max(sys_connect_by_path(NAME, '','')), 2, 10000)  columns_name                   
                from (                         
                    SELECT COLUMN_NAME as NAME, rownum ro FROM USER_TAB_COLUMNS                        
                    WHERE TABLE_NAME = ''MLK_FLAG_'||is_latest_year||''' AND COLUMN_NAME!=''TIME_''                         
                    ORDER BY COLUMN_ID                  
                ) newtab                  
                start with newtab.ro = 1                   
                connect by prior newtab.ro = newtab.ro-1';   
    --DBMS_OUTPUT.PUT_LINE(columns_name_sql);   
    execute immediate columns_name_sql into columns_name;   
    --DBMS_OUTPUT.PUT_LINE(columns_name); 
    insert_data_ := ' insert into MLK_FLAG_'||year_||' 
             ('||columns_name||',time_)   
            select '||columns_name||',to_char(sysdate,''yyyymm'') as TIME_ from MLK_FLAG_'||is_latest_year||' 
            where time_=(select max(time_) from MLK_FLAG_'||is_latest_year||')'; 
    Dbms_output.Put_line(insert_data_); 
    execute immediate insert_data_; 
    commit; 
end if;
end MLK_FLAG_PRO_NEW;


二:执行定时任务
declare  

   jobno number;  

 begin  

   dbms_job.submit(

     jobno,

     'MLK_FLAG_PROC;', --what

     to_date('24-07-2012 02:00:00', 'dd-mm-yyyy hh24:mi:ss'), --next_date

     ' TRUNC(LAST_DAY(SYSDATE))+24+2/24' --interval,关键设置 每月24号凌晨2点执行

  );  

 commit;  

end; 


三: 查看定时任务的详细情况

select * from user_jobs;



四:关闭定时任务

begin  dbms_job.remove(n);  end;  



n为任务号,通过三察看任务号。

五:Interval的相关设置

   1、 每分钟执行

Interval => TRUNC(sysdate,'mi') + 1 / (24*60)

Interval =>'sysdate+1/1440'

2、 每天定时执行

例如:每天的凌晨2点执行

Interval => TRUNC(sysdate) + 1 +2 / (24)

3、 每周定时执行

例如:每周一凌晨2点执行

Interval => TRUNC(next_day(sysdate,2))+2/24 --星期一,一周的第二天

4、 每月定时执行

例如:每月1日凌晨2点执行

Interval =>TRUNC(LAST_DAY(SYSDATE))+1+2/24

5、 每季度定时执行

例如每季度的第一天凌晨2点执行

Interval => TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 2/24

6、 每半年定时执行

例如:每年7月1日和1月1日凌晨2点

Interval => ADD_MONTHS(trunc(sysdate,'yyyy'),6)+2/24

7、 每年定时执行

例如:每年1月1日凌晨2点执行

Interval =>ADD_MONTHS(trunc(sysdate,'yyyy'),12)+2/24


8、 每3小时执行一次

Interval =>sysdate+180/1440'
分享到:
评论

相关推荐

    oracle定时器调用存储过程

    oracle定时器调用存储过程

    Oracle定时执行存储过程

    Oracle 定时执行存储过程 Oracle 定时执行存储过程是一种高效的方式来执行存储过程,通过使用 Oracle 提供的 job 机制来实现。Job 机制允许开发者创建、计划和执行存储过程,实现自动化和批量处理。 Broken() ...

    oracle 定时任务,使用存储过程更新数据

    5. **文件名称列表**:`oracle定时任务`和`存储过程`这两个文件名可能是指包含有关如何在实际环境中设置和使用这些功能的文档或脚本。在学习和实践中,可以参考这些文件以获取更具体的步骤和示例。 综上所述,...

    VFP调用ORACLE存储过程数据库接口程序.pdf

    总体设计思想是在Oracle服务器上建立用户所需的存储过程,用户在远端客户机上通过调用存储过程来获取所需数据,这样既不影响服务器的数据库运行,也实现了数据的自动转换。数据库接口程序的主要内容包括调用存储过程...

    利用windows任务计划调用oracle存储过程

    结合Oracle数据库,我们可以利用任务计划程序调用Oracle存储过程,实现定时的数据处理、备份或其他业务逻辑。本文将深入探讨如何实现这一功能。 首先,理解Oracle存储过程是关键。存储过程是预编译的SQL和PL/SQL...

    oracle存储过程+日期+定时任务Job

    在 Oracle 中,可以使用 `DBMS_SCHEDULER` 包来创建定时任务,以自动调用存储过程。定时任务的创建主要包括以下几个步骤: 1. **定义程序**: - 使用 `DBMS_SCHEDULER.create_program` 创建程序对象。 - 需要指定...

    oracle job调度存储过程 触发器 定时更新数据库

    1. **创建存储过程**:首先,你需要编写一个存储过程,包含你希望定时执行的逻辑,比如更新数据库中的某些记录。这个过程可能涉及复杂的查询、数据处理或者与业务逻辑相关的操作。 2. **创建调度作业**:使用DBMS_...

    oracle中job调度存储过程 触发器 定时更新数据库.rar

    总结,Oracle中的Job调度存储过程和触发器是强大的数据库管理工具,它们可以帮助你实现自动化和定时执行数据库任务。通过合理地组合使用这两者,可以提高效率,减少人为错误,并确保数据的准确性和一致性。务必根据...

    Oracle触发器与存储过程高级编程

    例如,一个触发器可能调用存储过程来执行特定任务,或者存储过程内部可能包含触发器的逻辑。这种结合可以创建强大的数据管理和业务流程,尤其是在需要跨多个表进行复杂操作的场景下。 在“Oracle触发器与存储过程...

    Oracle数据库存储过程.pdf

    最后,Java代码调用存储过程、过程和函数是Java应用程序与数据库交互的一种方式。通过JDBC接口,Java代码可以执行SQL语句和调用存储过程,从而实现业务逻辑。 在优化方面,SQL语句的执行效率直接关系到数据库的性能...

    job调用的存储过程

    这些操作可能包括数据备份、清理、分析或者调用存储过程等。存储过程则是一组预编译的SQL语句集合,封装了特定的功能,供应用程序或数据库管理员调用。 在Oracle、SQL Server、MySQL等数据库系统中,都有内置的调度...

    oracle存储过程超详细使用手册

    Oracle存储过程是一组为了完成特定功能的SQL语句集,它被编译并存储在数据库中,可以被多次调用执行,提高代码的复用性并减少网络流量。本手册将详细介绍Oracle存储过程的创建、变量使用、控制结构、游标等高级特性...

    项目里用到用java写oracle的存储过程,做个备份

    通过Java调用存储过程,我们可以将复杂的数据库操作封装起来,提高代码的可维护性和复用性。 要使用Java与Oracle数据库交互,你需要引入Oracle JDBC驱动(ojdbc)到你的项目中。Oracle JDBC驱动提供了连接数据库、...

    oci.rar_VC 数据库_bash_oci_vc oracle_vc 存储过程

    这些文件将提供具体的实现细节,包括如何配置Oracle环境、如何使用OCI API、如何编写bash脚本以及如何创建和调用存储过程。 总之,这个压缩包涵盖了在VC环境中使用Oracle数据库的关键技术,包括OCI接口、bash命令行...

    oracle发送邮件存储过程

    在Oracle数据库中,发送邮件的功能通常通过自定义的存储过程实现,这有助于自动化数据库相关的通知或报告任务。本文将深入探讨如何使用Oracle存储过程来发送邮件,并基于提供的"procsendemail.sql"文件来解析和理解...

    在Oracle数据库里用存储过程定期分割表

    总结来说,通过在Oracle数据库中使用存储过程定期分割表,可以有效地管理不断增长的时间相关数据,优化数据库性能,便于数据管理和归档。通过创建并调用适当的存储过程,这一过程可以自动化,确保了数据库系统的稳定...

    Oracle存储过程定时进行调度的方法.doc

    这个脚本最后会调用存储过程`test`,并将输出重定向到`test.log`文件。 2. **利用crontab执行定时调度**:在Unix环境中,使用`crontab -e`命令编辑crontab配置,设置定时任务。例如,以下配置将在每天13:30执行`...

    oracle定时导出

    - **数据安全性**:对于敏感数据,应采取加密措施保护,防止在传输和存储过程中泄露。 通过上述方法和技术,我们可以有效地实现Oracle数据库的定时导出,从而增强数据安全性,降低数据丢失的风险,为企业的数据管理...

Global site tag (gtag.js) - Google Analytics