zoukankan      html  css  js  c++  java
  • ORACLE 11G在存储过程里面遍历游标, 调用job任务定时运行

    ORACLE存储过程里游标遍历、调用job定时运行

    1,第一种使用For 循环

    for循环是比較简单有用的方法。

    首先。它会自己主动open和close游标。攻克了你忘记打开或关闭游标的烦恼。

    其次,自己主动声明一个记录类型及定义该类型的变量,并自己主动fetch数据到这个变量。

    注意C_ROW 这个变量无需要在循环外进行声明,无需为其指定数据类型。它是一个记录类型,详细的结构是由游标决定的。

    这个变量的作用域不过在循环体内。

    最后,与该游标关联的全部记录都已经被取回后。循环无条件结束,不必判定游标的%NOTFOUND属性为TRUE。

    for循环是用来循环游标的最好方法。高效,简洁,安全。

    CREATE OR REPLACE PROCEDURE PRC_LJ IS

     CURSOR C_EMP IS --声明显式游标 

       SELECT EMPNO,ENAME FROM EMP; 

     C_ROW C_EMP%ROWTYPE; --定义游标变量。该变量的类型为基于游标C_EMP的记录 

    BEGIN

     --For 循环 

      FORC_ROW IN C_EMP LOOP 

       DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '--' || C_ROW.ENAME); 

      ENDLOOP; 

     --Fetch 循环 

     OPEN C_EMP;--必需要明白的打开和关闭游标 

     LOOP 

       FETCH C_EMP 

         INTO C_ROW; 

       EXIT WHEN C_EMP%NOTFOUND; 

       DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '++' || C_ROW.ENAME); 

      ENDLOOP; 

     CLOSE C_EMP; 

     --While 循环 

     OPEN C_EMP;--必需要明白的打开和关闭游标 

       FETCH C_EMP INTO C_ROW; 

       WHILE C_EMP%FOUND LOOP 

         DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '**' || C_ROW.ENAME); 

         FETCH C_EMP INTO C_ROW; 

       END LOOP; 

     CLOSE C_EMP; 

    END PRC_LJ;

    2,另外一种使用Fetch循环

    注意,exit when语句一定要紧跟在fetch之后。避免多余的数据处理。

    处理逻辑需要跟在exit when之后。

    循环结束后要记得关闭游标。

    CREATE OR REPLACE PROCEDURE PRC_LJ IS

     CURSOR C_EMP IS --声明显式游标 

       SELECT EMPNO,ENAME FROM EMP; 

     C_ROW C_EMP%ROWTYPE; --定义游标变量,该变量的类型为基于游标C_EMP的记录 

    BEGIN

     --Fetch 循环 

     OPEN C_EMP;--必需要明白的打开和关闭游标 

     LOOP 

       FETCH C_EMP 

         INTO C_ROW; 

       EXIT WHEN C_EMP%NOTFOUND; 

       DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '++' || C_ROW.ENAME); 

      ENDLOOP; 

     CLOSE C_EMP; 

    END PRC_LJ;

    3,第三种使用While循环

    使用while 循环时,需要在循环之前进行一次fetch动作,游标的属性才会起作用。

    并且数据处理动作必须放在循环体内的fetch方法之前。循环体内的fetch方法要放在最后,否则就会多处理一次。

    CREATE OR REPLACE PROCEDURE PRC_LJ IS

     CURSOR C_EMP IS --声明显式游标 

       SELECT EMPNO,ENAME FROM EMP; 

     C_ROW C_EMP%ROWTYPE; --定义游标变量。该变量的类型为基于游标C_EMP的记录 

    BEGIN

     --While 循环 

     OPEN C_EMP;--必需要明白的打开和关闭游标 

       FETCH C_EMP INTO C_ROW; 

       WHILE C_EMP%FOUND LOOP 

         DBMS_OUTPUT.PUT_LINE(C_ROW.EMPNO || '**' || C_ROW.ENAME); 

         FETCH C_EMP INTO C_ROW; 

       END LOOP; 

     CLOSE C_EMP; 

    END PRC_LJ;

    4,存储过程选用FOR循环遍历游标。并做成定时job调用运行

             --存储步骤例如以下:

             createor replace procedure BIS_QUIC_REPORT is

                                --声明游标

                                cursorcur_proids is select t.bis_project_id from bis_project t;

                                --定义游标变量

                                cur_pidscur_proids%rowtype;

                                v_monthvarchar2(2);

                                v_yearvarchar2(4);

             begin

                       /**forjack.liu on 20150331*/

               select to_char(sysdate,'yyyy') into v_yearfrom dual;

               select case whensubstr(to_char(sysdate,'mm'),1,1)='0' then substr(to_char(sysdate,'mm'),2,1)else to_char(sysdate,'mm') end into v_month from dual;

    --開始遍历

               for cur_pids in cur_proids  loop

                       insertinto zzz_test(id,name,create_time)values(v_month,'PKP_BIS_REPORT.buildQuickReport:'||cur_pids.bis_project_id,sysdate);

                       commit;

                       PKP_BIS_REPORT.buildQuickReport(cur_pids.bis_project_id,v_year,v_month,null,null,null,null);   

               end loop;

             endBIS_QUIC_REPORT;

             --job任务例如以下:

             begin

               sys.dbms_scheduler.create_job(job_name            => 'JACK.BUILDQUICKREPORT',

                                                                                        job_type            => 'STORED_PROCEDURE',

                                                                                        job_action          => 'BIS_QUIC_REPORT',

                                                                                        start_date          => to_date('01-04-2015 03:00:00','dd-mm-yyyy hh24:mi:ss'),

                                                                                        repeat_interval     => 'Freq=Daily',

                                                                                        end_date            => to_date(null),

                                                                                        job_class           => 'DBMS_JOB$',

                                                                                        enabled             => true,

                                                                                        auto_drop           => false,

                                                                                        comments            => '');

             end;

             /

      5,在Plsql里面上面sql,job界面显演示样例如以下1.png:


     ----------------------------------------------------------------------------------------------------------------
    <版权全部。文章同意转载,但必须以链接方式注明源地址,否则追究法律责任!>
    原博客地址:       http://blog.itpub.net/26230597/viewspace-1479382/
    原作者:黄杉 (mchdba)
    ----------------------------------------------------------------------------------------------------------------

  • 相关阅读:
    Git -- 分支管理简介
    Git -- 从远程库克隆
    Git -- 添加远程仓库
    C# sha256 加密算法
    如何将IOS版本的更新下载文件指向到自己的服务器
    如何让windows服务器IIS支持.apk/.ipa文件下载
    vistual studio 去除 git 源代码 绑定
    Redis 环境搭建与使用(C#)
    c#图片添加水印
    C#使用WSDL服务总结
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/7344300.html
Copyright © 2011-2022 走看看