• PL/SQL 训练06--字符串处理


      

    现在需要做一个任务调度,请大家设计,满足以下需求
    (1)任务可配置,比如可以配置PKG方法TEST_PROCEDURE(:1,:2...),可以是任意多个入参的方法,也可以没有入参
    (2)每个方法的实际参数可配置,每次运行方法传进方法的相应参数值可能不一样(但参数个数是一样的)
    (3)配置的任务可以隔一段时间执行一次,比如每隔N个小时,或者N天,或者N个月,或者N年
    (4)(选做)考虑每个任务可以配置线程数,每次可以根据线程数启用相应的多任务进行调度(可使用JAVA)

    ----
    --(1)任务可配置,比如可以配置PKG方法TEST_PROCEDURE(:1,:2...),可以是任意多个入参的方法,也可以没有入参
    --(2)每个方法的实际参数可配置,每次运行方法传进方法的相应参数值可能不一样(但参数个数是一样的)
    --(3)配置的任务可以隔一段时间执行一次,比如每隔N个小时,或者N天,或者N个月,或者N年
    create table ma_schedue_task1(task_id varchar2(50),procedure_name varchar2(100),parameter_num number,param_freq number,freq_type varchar2(20),start_time date);
    create table ma_schedue_param1(task_id varchar2(50),param_order number,param_value varchar2(100));
    
    --create or replace procedure ma_add_task(i_table in varchar2 default 'MA_SCHEDUE_TASK',
    --                                     i_col   in varchar2)
    --
    -- is
     declare 
      i_table varchar2(50) default 'MA_SCHEDUE_TASK1';
      i_col varchar2(1000):= 'TEST_PROCEDURE(:1,:2,:3)';
      i_parameter_number number:=3;
      i_param_freq number :=2;
      i_freq_type varchar2(20) :='daily';
      i_start_time date default sysdate;
      v_cur sys_refcursor;
      v_sql varchar2(1000);
       v_task_id varchar(32);
       j number default 1;
       i_param_value varchar2(500):='test1,test2,test3';
       i_value varchar2(32);
       j_value varchar2(32);
    begin
    v_sql:='insert into ma_schedue_task1 values (sys_guid(),:1,:2,:3,:4,:5)   returning task_id into :task_id';
      execute immediate v_sql
      using i_col,i_parameter_number,i_param_freq,i_freq_type,i_start_time,out v_task_id;
      dbms_output.put_line('i_col==' || i_col);
       dbms_output.put_line('v_sql==' || v_sql);
       dbms_output.put_line('v_task_id==' || v_task_id);
      for i in 1..i_parameter_number loop
      i_value:=','||i_param_value||',';
      j_value:=substr(i_value,instr(i_value,',',1,j)+1,instr(i_value,',',1,j+1)-instr(i_value,',',1,j)-1);
       insert into ma_schedue_param1
       values(v_task_id,j,j_value);
       j:=j+1;
       end loop;
      commit;
    end;
    /
    
    
    create or replace procedure TEST_PROCEDURE(i_test1 in varchar2,
                                          i_test2 in varchar2,
                                          i_test3 in varchar2) is
    
    begin
      dbms_output.put_line(i_test1 || i_test2||i_test3);
    end TEST_PROCEDURE;
    /
    
    declare
      cursor cur_task is
        select * from ma_schedue_task1 where task_id ='2EDC5B378BDA1A87E053BD02A8C01B74';
      v_sql varchar2(4000);
    begin
    
      for v in cur_task loop
        v_sql := ' begin execute immediate '' begin ' || v.procedure_name ||
                 ' ; end;'' using ';
        for param in (select r.param_value
                        from ma_schedue_param1 r
                       where r.task_id = v.task_id
                       order by param_order) loop
          v_sql := v_sql || ' ''' || param.param_value || ''',';
        end loop;
       v_sql := rtrim(v_sql, ',') || '; end;';
    
        dbms_output.put_line(v_sql);
       execute immediate v_sql;
      end loop;
    end;
    /
  • 相关阅读:

    转:在自己的工具条中使用ArcGIS Engine提供的命令和工具
    配置Subversion Apache TortoiseSVN
    vc++2005移除自定义向导目录
    NetAdvantage2006 For ASP.NET2.0印象
    三天了!今天终于成功安装ArcIMS9.2!
    vss 去除源代码管理
    转:设计模式趣谈
    转一篇:有关项目报告
    演练:使用 Visual Studio Team Test 进行单元测试
  • 原文地址:https://www.cnblogs.com/yhq1314/p/10613366.html
Copyright © 2020-2023  润新知