更新语句对oracle中的for循环语句有什么影响吗?

时间:2016-07-19 10:42:40

标签: oracle

我有嵌套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开发人员 对不起我的英文。

1 个答案:

答案 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找出它何时完成。