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; /