2010-02-25 61 views
94

我越來越ORA-30926:無法獲得穩定的組行的源表

ORA-30926:無法獲得穩定的組行的源表

在下面的查詢:

MERGE INTO table_1 a 
     USING 
     (SELECT a.ROWID row_id, 'Y' 
       FROM table_1 a ,table_2 b ,table_3 c 
       WHERE a.mbr = c.mbr 
       AND b.head = c.head 
       AND b.type_of_action <> '6') src 
       ON (a.ROWID = src.row_id) 
    WHEN MATCHED THEN UPDATE SET in_correct = 'Y'; 

我已經跑了table_1有數據,並且還我已經跑了內部查詢(src),其中也有數據。

爲什麼會出現這個錯誤,如何解決?

回答

145

這通常是由USING子句中指定的查詢中的重複項引起的。這可能意味着TABLE_A是父表,並且多次返回相同的ROWID。

您可以通過在查詢中使用DISTINCT來快速解決問題(事實上,如果'Y'是一個恆定值,您甚至不需要將其放入查詢中)。

假設你的查詢是正確的(不知道你的表),你可以做這樣的事情:

MERGE INTO table_1 a 
     USING 
     (SELECT distinct ta.ROWID row_id 
       FROM table_1 a ,table_2 b ,table_3 c 
       WHERE a.mbr = c.mbr 
       AND b.head = c.head 
       AND b.type_of_action <> '6') src 
       ON (a.ROWID = src.row_id) 
    WHEN MATCHED THEN UPDATE SET in_correct = 'Y'; 
+0

10x 不錯的答案。它幫助我 – 2011-12-04 14:59:28

+0

從我也是..在頭上 – TonyP 2012-04-13 21:09:55

+1

這可能是爲什麼其他方法(對我來說)也爲我返回其他錯誤(如'程序,函數,包或類型不允許在這裏'和'無法修改一個在嘗試插入視圖時映射到非鍵保留表錯誤的列')。 〜 如果它對別人有幫助,即使在添加了不同的內容之後,我也得到了同樣的錯誤,直到我重新安排了內部查詢的連接,所以我開始使用獲取多於一行的內部表並從內部連接的表。如果這是有道理的。 – jinglesthula 2012-06-06 21:11:05

33

您可能試圖多次更新目標表的同一行。我剛剛在我開發的合併聲明中遇到了同樣的問題。確保您的更新在執行合併時不會多次觸及相同的記錄。

+0

+1,謝謝,這只是發生在一個有少量重複項的目標表上(至少根據合併中使用的關鍵字)。 – tbone 2013-06-13 16:03:56

2

如何解決ORA-30926錯誤? (文件ID 471956.1)

1)識別發生故障的語句

ALTER會話組事件「30926跡名errorstack級別3」;

ALTER SYSTEM SET事件「30926痕跡名errorstack關」;

並在發生UDUMP時監視.trc文件。

2)找到SQL語句後,檢查它是否正確(可能使用explain plan或tkprof檢查查詢執行計劃),並分析或計算有關表的統計信息(如果最近尚未完成)。重建(或刪除/重新創建)索引也可能有所幫助。

3.1)SQL語句是否合併? 評估由USING子句返回的數據以確保聯接中沒有重複值。修改merge語句以包含確定性where子句

3.2)這是通過視圖的UPDATE語句嗎? 如果是這樣,請嘗試將視圖結果填充到表中,然後嘗試直接更新表。

3.3)桌子上是否有觸發器?嘗試禁用它,看看它是否仍然失敗。

3.4)該語句是否在'IN-Subquery'中包含不可合併視圖?如果查詢有「FOR UPDATE」子句,這可能會導致重複的行被返回。參見錯誤2681037

3.5)表中是否有未使用的列?刪除這些可能會防止錯誤。

4)如果修改SQL並不能糾正錯誤,則問題可能出在表上,特別是如果存在鏈接行的話。 4.1)在SQL中使用的所有表上運行'ANALYZE TABLE VALIDATE STRUCTURE CASCADE'語句,查看錶或其索引是否有任何損壞。 4.2)檢查並消除表中任何CHAINED或遷移的ROWS。有很多方法可以最大限度地減少這種情況,例如正確設置PCTFREE。 使用時注意122020.1 - 行鏈接和移植 4.3)如果表是另外索引組織,請參閱: 注102932.1 - 監測對IOT中

3

鏈接行有錯誤今天在12c和沒有配合現有的答案(沒有重複,在WHERE子句中沒有非確定性表達式)。 ,我的情況是有關的錯誤的其他可能的原因根據Oracle的消息文本(以下重點):

ORA-30926:無法獲得穩定的組行的源表
原因:穩定的行集不能得到,因爲大的dml活動或非確定性where子句。

合併是大批量的一部分,並且在具有許多併發用戶的實時數據庫上執行。沒有必要改變陳述。我在合併之前提交了事務,然後單獨運行合併,然後再次提交。因此,解決辦法是在消息的建議行動中發現:

操作:刪除所有非確定性的where子句和重新發出DML

+0

在統計信息收集階段,我收到了通過網絡進行DataPump導入的錯誤消息(使用「NETWORK_LINK」參數,該參數直接連接到源數據庫),並且突出顯示的註釋可能會對其進行解釋。幸運的是,只有統計數據受到影響。 – 2017-01-26 22:00:37

相關問題