问题描述
嗨,康纳,克里斯,
您能否看一下与dbms_scheduler程序和作业setu相关的以下场景:
我的要求是调用具有集合作为输入的过程 (对于某些应用程序处理逻辑)。
这个过程应该独立运行 (即在不同的会话中),而不是运行一个。
因此,我使用了dbms_scheduler (下面是相同的设置)。
我使用了dbms_scheduler.run_job (job_name => l_job_name,use_current_session => false); 要在不同的会话中运行该过程,
但是,采用这种方法,即使成功完成了作业,作业也不会自动掉落。
您能帮我解决以下问题吗:
1.在这种情况下如何实现自动下降
2.由于set_job_anydata_value用于将集合输入到scheduler:
a.这些值存储在哪里,就像在SGA、PGA中一样?
b.是否有任何用户 _ * 视图来查找每个作业的输入值?
c.因为我的收集计数可能是大约500条记录和预期的并发作业可以同时运行 (大约100)
是否可以使用更好的方法来实现以下调度方法?
您能否看一下与dbms_scheduler程序和作业setu相关的以下场景:
-------------- Start Use Case Setup -------------- --------------------------------------------------------------------------------------------------- -- 1. Create Record and Collection create or replace TYPE table_rec as object (create_dt DATE ,dept_id NUMBER(11,0) ,emp_id NUMBER(11,0) ) / show errors; / create or replace TYPE t_table_coll as table of table_rec / show errors; / --------------------------------------------------------------------------------------------------- -- 2. Create Procedure create or replace procedure populate_coll_into_table(p_job_id in varchar, p_t_table_coll in t_table_coll, p_no_of_reties in number) is begin dbms_output.put_line('Inside Procedure - p_job_id='||p_job_id||'- p_t_table_coll='||p_t_table_coll.count||'- p_no_of_reties='||p_no_of_reties); for rec in p_t_table_coll.first .. p_t_table_coll.last loop dbms_output.put_line('Iteration #'||rec); dbms_output.put_line('create_dt='||p_t_table_coll(rec).create_dt||'#emp_id='||p_t_table_coll(rec).emp_id||'#dept_id='||p_t_table_coll(rec).dept_id); end loop; exception when others then dbms_output.put_line('Error=>'||SQLERRM); end populate_coll_into_table; / show errors; / --------------------------------------------------------------------------------------------------- -- 3. Create Program set serveroutput on; begin dbms_scheduler.create_program(program_name => 'PRG_POPULATE_COLL_INTO_TABLE', program_action => 'POPULATE_COLL_INTO_TABLE', program_type => 'STORED_PROCEDURE', number_of_arguments => 3, enabled => false ); dbms_output.put_line('Program: PRG_POPULATE_COLL_INTO_TABLE created..'); dbms_scheduler.define_anydata_argument(program_name => 'PRG_POPULATE_COLL_INTO_TABLE', argument_position => 1, argument_name => 'P_JOB_ID', argument_type => 'VARCHAR2', default_value => null ); dbms_output.put_line('Set Program: PRG_POPULATE_COLL_INTO_TABLE | Parameter 1.'); dbms_scheduler.define_anydata_argument(program_name => 'PRG_POPULATE_COLL_INTO_TABLE', argument_position => 2, argument_name => 'P_T_TABLE_COLL', argument_type => 'T_TABLE_COLL', default_value => NULL); dbms_output.put_line('Set Program: PRG_POPULATE_COLL_INTO_TABLE | Parameter 2.'); dbms_scheduler.define_anydata_argument(program_name => 'PRG_POPULATE_COLL_INTO_TABLE', argument_position => 3, argument_name => 'P_NO_OF_RETIES', argument_type => 'NUMBER', default_value => null ); dbms_output.put_line('Set Program: PRG_POPULATE_COLL_INTO_TABLE | Parameter 3.'); dbms_scheduler.enable('PRG_POPULATE_COLL_INTO_TABLE'); dbms_output.put_line('Enable Program: PRG_POPULATE_COLL_INTO_TABLE.'); end; / -------------- End Use Case Setup --------------复制
我的要求是调用具有集合作为输入的过程 (对于某些应用程序处理逻辑)。
这个过程应该独立运行 (即在不同的会话中),而不是运行一个。
因此,我使用了dbms_scheduler (下面是相同的设置)。
我使用了dbms_scheduler.run_job (job_name => l_job_name,use_current_session => false); 要在不同的会话中运行该过程,
但是,采用这种方法,即使成功完成了作业,作业也不会自动掉落。
您能帮我解决以下问题吗:
1.在这种情况下如何实现自动下降
2.由于set_job_anydata_value用于将集合输入到scheduler:
a.这些值存储在哪里,就像在SGA、PGA中一样?
b.是否有任何用户 _ * 视图来查找每个作业的输入值?
c.因为我的收集计数可能是大约500条记录和预期的并发作业可以同时运行 (大约100)
是否可以使用更好的方法来实现以下调度方法?
------------ create and execute scheduler ------ ---------- declare l_job_name varchar2(30 char) := 'SCOTT_1234'; gv_t_table_coll t_table_coll := t_table_coll(); gv_table_rec table_rec := table_rec(NULL,NULL,NULL); gv_no_of_reties number := 2; begin gv_table_rec.create_dt := trunc(sysdate-1); gv_table_rec.emp_id := 1001; gv_table_rec.dept_id := 100; gv_t_table_coll.extend; gv_t_table_coll(1) := gv_table_rec; gv_table_rec.create_dt := trunc(sysdate-2); gv_table_rec.emp_id := 1002; gv_table_rec.dept_id := 100; gv_t_table_coll.extend; gv_t_table_coll(2) := gv_table_rec; dbms_scheduler.create_job(l_job_name, program_name => 'PRG_POPULATE_COLL_INTO_TABLE', start_date => systimestamp, enabled => false); dbms_scheduler.set_job_anydata_value(l_job_name, 1, sys.anydata.convertvarchar2(l_job_name)); dbms_scheduler.set_job_anydata_value(l_job_name, 2, sys.anydata.convertcollection(gv_t_table_coll)); dbms_scheduler.set_job_anydata_value(l_job_name, 3, sys.anydata.convertnumber(gv_no_of_reties)); dbms_scheduler.run_job (job_name => l_job_name, use_current_session => false); gv_t_table_coll.delete; exception when others then dbms_output.put_line('Error=>'||SQLERRM); end;复制
专家解答
1.只需启用作业,它就会在后台会话中运行。然后下降:
2.
a.变量存储在PGA中
b.我不知道有什么。它们不会出现在用户调度器作业运行详细信息/作业日志中
c.我对你想做什么还不够了解。这里的目标是什么?为什么提交那么多并发作业?
declare l_job_name varchar2(30 char) := 'SCOTT_1234'; gv_t_table_coll t_table_coll := t_table_coll(); gv_table_rec table_rec := table_rec(NULL,NULL,NULL); gv_no_of_reties number := 2; begin gv_table_rec.create_dt := trunc(sysdate-1); gv_table_rec.emp_id := 1001; gv_table_rec.dept_id := 100; gv_t_table_coll.extend; gv_t_table_coll(1) := gv_table_rec; gv_table_rec.create_dt := trunc(sysdate-2); gv_table_rec.emp_id := 1002; gv_table_rec.dept_id := 100; gv_t_table_coll.extend; gv_t_table_coll(2) := gv_table_rec; dbms_scheduler.create_job(l_job_name, program_name => 'PRG_POPULATE_COLL_INTO_TABLE', start_date => systimestamp, enabled => false, auto_drop => true); dbms_scheduler.set_job_anydata_value(l_job_name, 1, sys.anydata.convertvarchar2(l_job_name)); dbms_scheduler.set_job_anydata_value(l_job_name, 2, sys.anydata.convertcollection(gv_t_table_coll)); dbms_scheduler.set_job_anydata_value(l_job_name, 3, sys.anydata.convertnumber(gv_no_of_reties)); gv_t_table_coll.delete; exception when others then dbms_output.put_line('Error=>'||SQLERRM); end; / select start_date from user_scheduler_jobs where job_name = 'SCOTT_1234'; START_DATE 11-FEB-2020 13.42.28 +00 exec dbms_scheduler.enable ( 'SCOTT_1234' ); select start_date from user_scheduler_jobs where job_name = 'SCOTT_1234'; no rows selected复制
2.
a.变量存储在PGA中
b.我不知道有什么。它们不会出现在用户调度器作业运行详细信息/作业日志中
c.我对你想做什么还不够了解。这里的目标是什么?为什么提交那么多并发作业?
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
756次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
647次阅读
2025-04-15 17:24:06
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
569次阅读
2025-04-20 10:07:02
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
525次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
516次阅读
2025-04-17 17:02:24
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
497次阅读
2025-04-22 00:20:37
一页概览:Oracle GoldenGate
甲骨文云技术
482次阅读
2025-04-30 12:17:56
火焰图--分析复杂SQL执行计划的利器
听见风的声音
440次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
381次阅读
2025-04-15 14:48:05
OR+DBLINK的关联SQL优化思路
布衣
372次阅读
2025-05-05 19:28:36