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; /
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构