我有嵌套for循环,它迭代同一个表。在内部循环中,我更新同一个表中的列。但是在for循环条件中我检查更新的列,我需要检查这个列不是在开头而是动态,所以我的for循环迭代可能会大大减少。
我这样做是正确的还是for语句不会看到更新的列?
[{
"content": {
"logo": {
"logoimage": "img/home/nitseditorlogo.png",
"logolink": "index.html"
},
"pages": [
{"pagename": "Mysite", "pagelink": "index.html"},
{"pagename": "Templates", "pagelink": "templates.html"},
{"pagename": "About Us", "pagelink": "aboutus.html"},
{"pagename": "Contact Us", "pagelink": "contactus.html"}
]
}
}]
注意:我使用oracle 11g和pl / sql开发人员 对不起我的英文。
答案 0 :(得分:1)
是的,FOR语句不会看到更新的DURUM列,因为FOR语句将查看查询启动时的所有数据!这称为读取一致性,Oracle通过使用生成的UNDO数据来实现此目的。这意味着随着FOR循环的推进和基表的更新,它会有越来越多的工作要做(==运行得更慢)!
这也意味着当UNDO表空间用尽时,您的实现最终会遇到ORA-01555:快照太旧的错误。
使用SQL MERGE语句可能会更好,它也应该运行得更快。
e.g:
Merge Into ORAHANCROSSES C
Using (Select aROW.MI_PRINX aROW_MI_PRIX,
aROW.GEOLOC aROW_GEOLOC,
bROW.MI_PRINX bROW_MI_PRIX,
bROW.GEOLOC bROW_GEOLOC,
SDO_GEOM.RELATE(aRow.geoloc,'anyinteract', bRow.Geoloc,0.02) RES
From ORAHAN aROW,
ORAHAN bROW
Where aROW.ROWID < bROW.ROWID
) Q
On (C.MI_PRIX1 = Q.aROW_MI_PRIX
and C.MI_PRIX2 = Q.bROW_MI_PRIX)
When Matched Then
Delete Where Q.RES = 'FALSE'
When Not Matched Then
Insert Values (Q.aROW_MI_PRIX, Q.bROW_MI_PRIX)
Where Q.RES = 'TRUE'
;
我不确定你ROWID>aRow.ROWID
试图完成什么,但
要使用特定顺序(在本例中为MI_PRINX),请使用以下技术:
Merge Into ORAHANCROSSES C
Using (With D as (select T.*, ROWNUM RN from (select MI_PRINX, GEOLOC from ORAHAN order by MI_PRINX) T)
Select aROW.MI_PRINX aROW_MI_PRIX,
aROW.GEOLOC aROW_GEOLOC,
bROW.MI_PRINX bROW_MI_PRIX,
bROW.GEOLOC bROW_GEOLOC,
SDO_GEOM.RELATE(aRow.geoloc,'anyinteract', bRow.Geoloc,0.02) RES
From D aROW,
D bROW
Where aROW.RN < bROW.RN
) Q
On (C.MI_PRIX1 = Q.aROW_MI_PRIX
and C.MI_PRIX2 = Q.bROW_MI_PRIX)
When Matched Then
Delete Where Q.RES = 'FALSE'
When Not Matched Then
Insert Values (Q.aROW_MI_PRIX, Q.bROW_MI_PRIX)
Where Q.RES = 'TRUE'
;
如果查询花费的时间太长,您可以select * from v$session_longops where seconds_remaining >0
找出它何时完成。