问题描述
我们有一个带有merge语句的ETL作业。之前工作正常。上周发生了节点驱逐事件,由于DB被退回。在弹跳DB后,过程开始失败,ORA-08006错误。当我们尝试手动运行语句时,会出现相同的错误。以下是声明:
声明
LV_SR_SYSTEM_ID编号;
LV_SR_SYS_ID编号;
开始
选择不同的源 _ 系统 _ 标识
进入LV_SR_SYSTEM_ID
来自DM_SOURCE_ENTITY
其中UPPER(SOURCE_SYSTEM_NAME)= 'clsc';
选择不同的源 _ 系统 _ 标识
进入LV_SR_SYS_ID
来自DM_SOURCE_ENTITY
其中UPPER(SOURCE_SYSTEM_NAME)= 'INTREPID';
合并到DM_SERVICE_ORDER A使用
(选择
A.ID为SOF_ID,
作为ID为NULL,
B.作为订单id的销售订单id,
B.订单管理器作为订单管理器,
B.订单状态为订单状态,
B.ORD_TYPE作为ORDER_TYPE,
B.MDD作为MDD,
LV_SR_SYSTEM_ID作为源 _system_id
从 (选择id,服务订单id,row_number() 通过服务订单id分区
按id desc订购) rn
从f _ 服务 _ 订单
其中service_order_id不为空
) A,
Tbl_bi_cla_svc _ord B
其中A.服务订单id = B.销售订单id
和A.RN = 1
) B
ON (A.SOF_ID = B.SOF_ID和A.ORDER_ID = B.ORDER_ID和A.SOURCE_SYSTEM_ID = B.SOURCE_SYSTEM_ID
和 (A.ID为NULL,B.ID为NULL)
)
当匹配时,然后
更新集
-- A.订单id = B.订单id,
A.订单管理器 = A.订单管理器,
A.订单类型 = A.订单类型,
A.MDD = B.MDD,
-- A.SOURCE_SYSTEM_ID = SOURCE_SYSTEM_ID,
A.Edw _ 更新 _ 日期 = 系统日期
当不匹配时
插入 (
A.ROW_ID,
A.软件id,
A.身份证,
A.订单id,
A.订单管理器,
A.订单状态,
A.订单类型,
A、MDD,
A.SOURCE_SYSTEM_ID,
A.EDW_UPDATE_DATE,
A.Edw _ 创建 _ 日期
)
值
(
Dm _ 服务 _ 订单 _ seq.下一个,
B.软件id,
B.身份证,
B.订单id,
B.订单管理器,
B.订单状态,
B.订单类型,
B.MDD,
B.SOURCE_SYSTEM_ID,
系统日期,
系统日期
);
提交;
结束;
错误报告:
ORA-08006: 指定的行不再存在
ORA-06512: 在第16行
08006. 00000-“指定的行不再存在”
* 原因: 自操作开始以来,该行已被其他用户删除
* 操作: 重试操作
声明
LV_SR_SYSTEM_ID编号;
LV_SR_SYS_ID编号;
开始
选择不同的源 _ 系统 _ 标识
进入LV_SR_SYSTEM_ID
来自DM_SOURCE_ENTITY
其中UPPER(SOURCE_SYSTEM_NAME)= 'clsc';
选择不同的源 _ 系统 _ 标识
进入LV_SR_SYS_ID
来自DM_SOURCE_ENTITY
其中UPPER(SOURCE_SYSTEM_NAME)= 'INTREPID';
合并到DM_SERVICE_ORDER A使用
(选择
A.ID为SOF_ID,
作为ID为NULL,
B.作为订单id的销售订单id,
B.订单管理器作为订单管理器,
B.订单状态为订单状态,
B.ORD_TYPE作为ORDER_TYPE,
B.MDD作为MDD,
LV_SR_SYSTEM_ID作为源 _system_id
从 (选择id,服务订单id,row_number() 通过服务订单id分区
按id desc订购) rn
从f _ 服务 _ 订单
其中service_order_id不为空
) A,
Tbl_bi_cla_svc _ord B
其中A.服务订单id = B.销售订单id
和A.RN = 1
) B
ON (A.SOF_ID = B.SOF_ID和A.ORDER_ID = B.ORDER_ID和A.SOURCE_SYSTEM_ID = B.SOURCE_SYSTEM_ID
和 (A.ID为NULL,B.ID为NULL)
)
当匹配时,然后
更新集
-- A.订单id = B.订单id,
A.订单管理器 = A.订单管理器,
A.订单类型 = A.订单类型,
A.MDD = B.MDD,
-- A.SOURCE_SYSTEM_ID = SOURCE_SYSTEM_ID,
A.Edw _ 更新 _ 日期 = 系统日期
当不匹配时
插入 (
A.ROW_ID,
A.软件id,
A.身份证,
A.订单id,
A.订单管理器,
A.订单状态,
A.订单类型,
A、MDD,
A.SOURCE_SYSTEM_ID,
A.EDW_UPDATE_DATE,
A.Edw _ 创建 _ 日期
)
值
(
Dm _ 服务 _ 订单 _ seq.下一个,
B.软件id,
B.身份证,
B.订单id,
B.订单管理器,
B.订单状态,
B.订单类型,
B.MDD,
B.SOURCE_SYSTEM_ID,
系统日期,
系统日期
);
提交;
结束;
错误报告:
ORA-08006: 指定的行不再存在
ORA-06512: 在第16行
08006. 00000-“指定的行不再存在”
* 原因: 自操作开始以来,该行已被其他用户删除
* 操作: 重试操作
专家解答
如果在合并操作期间一行重新定位,则可能会遇到此问题。
这是一个缩小的例子
因此,“u” 的第一行是:
-我在分区p1中的行上有一个匹配项
-我将行更新为pk = 2,将行 * 移动到分区p2
“U” 的第二行是:
-我在该行上得到一个匹配项,该匹配项位于合并的 * start * 的分区p1中,并且不再存在 (已移至P2)。
因此出现错误。您可以看到当我们 “重新访问” 在合并中已经遇到的行时会发生这种情况。在我的情况下,我在合并集中有两行,这两行都链接回相同的主键。
避免重访,你应该没事。
这是一个缩小的例子
SQL> create table t (pk number primary key, x number)
2 partition by list (pk)
3 (partition p1 values(1),
4 partition p2 values(2)
5 )
6 enable row movement;
Table created.
SQL>
SQL> insert into t values (1, 1);
1 row created.
SQL> commit;
Commit complete.
SQL>
SQL> merge into t
2 using (select 1 idx, 2 new_val from dual
3 connect by level <= 2
4 ) u
5 on (t.x = u.idx)
6 when matched then
7 update set pk=new_val;
merge into t
*
ERROR at line 1:
ORA-08006: specified row no longer exists
SQL>
SQL>
因此,“u” 的第一行是:
-我在分区p1中的行上有一个匹配项
-我将行更新为pk = 2,将行 * 移动到分区p2
“U” 的第二行是:
-我在该行上得到一个匹配项,该匹配项位于合并的 * start * 的分区p1中,并且不再存在 (已移至P2)。
因此出现错误。您可以看到当我们 “重新访问” 在合并中已经遇到的行时会发生这种情况。在我的情况下,我在合并集中有两行,这两行都链接回相同的主键。
避免重访,你应该没事。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




