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;
/
原文地址:https://www.cnblogs.com/yhq1314/p/10613366.html