【发布时间】:2020-11-05 03:03:48
【问题描述】:
我在存储过程和 FORALL 语句中使用嵌套表来加速过程执行,这需要将近 30 分钟的运行时间,当我从单个系统执行过程时,执行速度很快,我能够获得所需的输出.
问题是当从多个系统同时并行执行相同的过程时,结果是错误的。假设行为是数据同时插入到同一个嵌套表中,但我不确定如何获得正确的结果或如何操作嵌套表的行为。
先创建一个对象:
create or replace TYPE JR_Type AS OBJECT
(
"JOB_ID" NUMBER(38,0),
"E_ID" NCHAR(64),
"USER_NAME" NCHAR(32),
"START_TIME" TIMESTAMP (6),
"END_TIME" TIMESTAMP (6),
);
在这个对象上创建一个嵌套表。
create or replace TYPE JR_Table AS TABLE OF JR_Type ;
下面是我在程序中使用的方式:
我的程序很大,但我以更简单的方式使用以下方式。
create or replace Procedure data_test (E in nchar, J in number)
AS
Exec_data JR_Table; //Created a nested table variable
BEGIN
select JR_Type (job_id, e_id, USER_NAME, start_time, end_time)
bulk collect into Exec_data //Bulk collect into this variable
from ( taBLE);
FORALL counter in Exec_data.first..Exec_data.last //insert using FORALL
insert into DATA_TEMP1 Values
(Exec_data(counter).JOB_ID, Exec_data(counter).E_ID, Exec_data(counter).START_TIME, Exec_data(counter).END_TIME;
commit;
End;
我确信他们应该是处理这个问题的一种方法,但不幸的是,这超出了我的理解,希望我能得到一些帮助。
编辑---------------------------------------------- ---------------------
2 次执行在同一个表中插入数据,FYI 输入数据在 2 次执行中不同。
total records should be 120
1st execution 74
2nd execution 56
有了这个设计记录会根据执行而变化,一旦我得到 80 或 90 0r 60。
【问题讨论】:
-
当你说结果是错误的,你是什么意思?您正在并行运行相同的过程,我猜输入参数不同,但我没有看到输入参数和嵌套表之间有任何关系
-
@RobertoHernandez 是的输入参数是不同的关系这里取决于输入参数查询将获取数据并存储在嵌套表中,在这种情况下,来自两个输入参数的数据被合并或覆盖,结果不是预期的。我假设当程序从第二个系统并行执行时,数据正在替换已经从第一个系统执行插入的数据,最终结果将是错误数据,我需要一种并行执行数据应该单独存储的方法,并且应该被显示而不被覆盖。
-
那么您的事务中需要隔离级别。
-
好的,这是一个新概念,你能解释一下在这种情况下它是如何工作的吗?
-
我给你一个带有解释的答案。我认为它可能会解决您的问题
标签: oracle parallel-processing nested-table