打開(kāi)游標(biāo) Oracle連著打開(kāi)兩次游標(biāo),只關(guān)閉一次有問(wèn)題嗎?
Oracle連著打開(kāi)兩次游標(biāo),只關(guān)閉一次有問(wèn)題嗎?您好,對(duì)于同一個(gè)游標(biāo),在第一次打開(kāi)后,將打開(kāi)一個(gè)緩存,將記錄集讀取到緩存中,然后取到下一個(gè)周期。然后再次打開(kāi)。此時(shí),緩存將被清除,新記錄集將再次讀取到
Oracle連著打開(kāi)兩次游標(biāo),只關(guān)閉一次有問(wèn)題嗎?
您好,對(duì)于同一個(gè)游標(biāo),在第一次打開(kāi)后,將打開(kāi)一個(gè)緩存,將記錄集讀取到緩存中,然后取到下一個(gè)周期。
然后再次打開(kāi)。此時(shí),緩存將被清除,新記錄集將再次讀取到緩存中。循環(huán)完成后,釋放游標(biāo)close,即緩存第一次打開(kāi)。所以可以將光標(biāo)放在結(jié)束處。相反,它將節(jié)省大量的關(guān)閉時(shí)間。為了保險(xiǎn)起見(jiàn),可以這樣寫:如果cursor2%打開(kāi)然后關(guān)閉cursor2結(jié)束如果程序的其他部分不確定,也可以按上述形式處理。
plsql中如果我定義一個(gè)游標(biāo),然后打開(kāi)這個(gè)游標(biāo),然后loop循環(huán)把查詢出來(lái)的數(shù)據(jù)全部插入自己定義的表中?
這不會(huì)浪費(fèi)太多時(shí)間。所需時(shí)間分為兩部分。
1. 定義游標(biāo)以獲取結(jié)果集。---這一時(shí)間主要取決于SQL查詢需要多長(zhǎng)時(shí)間。
2. 循環(huán)。----這是跑步時(shí)間。但是,建議不要使用游標(biāo)來(lái)處理大量數(shù)據(jù)。游標(biāo)處理速度很慢。效率相對(duì)較低。最好做批處理。我以前用光標(biāo)處理數(shù)據(jù)。我的商業(yè)邏輯很復(fù)雜。我每小時(shí)只能處理幾十萬(wàn)個(gè)數(shù)據(jù)。效率太低了。后來(lái),我改為多步驟,使用insert into select。。它的書寫速度快了一百八十倍。
ORA-01000:超出打開(kāi)游標(biāo)的最大數(shù)如何處理?
此錯(cuò)誤的原因是resultset或語(yǔ)句未及時(shí)關(guān)閉。當(dāng)您測(cè)試JMeter時(shí),您不必打開(kāi)它,因?yàn)镃ursors降到了3,但是當(dāng)資源正常關(guān)閉時(shí),它仍然可以正常運(yùn)行。
要解決這個(gè)問(wèn)題,我們可以使用V$openuucursorview查看哪個(gè)SQL有問(wèn)題,從而找到問(wèn)題點(diǎn)。
SELECTSID,USERuname,SQLutextfromv$OPENucursor
執(zhí)行上述語(yǔ)句以查看哪些會(huì)話打開(kāi)了光標(biāo)。
此外,由于ora-01000錯(cuò)誤,主要是多循環(huán)處理中出現(xiàn)的問(wèn)題。您可以使用以下SQL來(lái)查看已發(fā)布多次的SQL]SQL>SELECTOC.SID文件, 原用戶姓名ST.SQL文本成本數(shù)字游標(biāo)
2
FROMV$SQLST
3
INNERJOIN(
4
SELECTSID,USERuu NAME,ADDRESS,HASHu VALUE,COUNT(*)NUMu游標(biāo)
5
FROMV$OPENuu游標(biāo)
6
GROUPBYSID,USERu姓名,地址,哈希值
7
HAVINGCOUNT(*)>1
8
)OC
9ONOC.ADDRESS=ST。地址
10ANDOC.HASH值=圣哈希值
11ORDERBYOC.SID
If num_u2;游標(biāo)的數(shù)量非常大,這表示SQL在釋放時(shí)不是正常關(guān)閉的,以便找到問(wèn)題。