2013-08-27 74 views
1

我有一個oracle查詢,我試圖用jdbc執行。以下是查詢。Oracle JDBC:如何知道哪一行拋出唯一鍵約束?

insert into bd_vehicles_temp select * from bd_vehicles_temp_1 

表bd_vehicles_temp_1包含大約7000-10000行。如果bd_vehicles_temp_1中的主鍵已經存在於bd_vehicles_temp中,我會得到一個SQLException:唯一鍵約束。

在我的代碼中,異常線是offcourse pstmt.executeUpdate()。有沒有辦法查明bd_vehicles_temp_1中導致異常的行。

或者我必須做循環遍歷bd_vehicles_temp_1中的行並逐一插入每一行?

在此先感謝!

回答

2

如果你知道,可以使你可以使用異常(Oracle專用)

SELECT col FROM bd_vehicles_temp 
INTERSECT 
SELECT col FROM bd_vehicles_temp_1; 

,以確定兩個表中的所有行的列。

+1

它不是列。我更關心哪一行導致錯誤。 –

+0

我如何交叉?我對數據庫查詢的知識較少。我是前端開發人員 –

+0

而我想用代碼實現這一點。沒有手工直覺參與! –

2

您試圖插入表格嗎?您應該使用pstmt.executeUpdate()而不是pstmt.execute()。如果表中已經存在記錄,那麼最好刪除所有行,並且如果多次執行該語句,則再次添加。

+0

編輯進行更改 –

+0

bd_vehicles_temp包含超過20,000條記錄。 bd_vehicles_temp_1包含約7000條記錄。我想將記錄從bd_vehicles_temp_1附加到bd_vehicles_temp以使其包含27,000條記錄 –

+0

使用'intersect'來檢查哪些是常見行。然後將其餘行添加到'bd_vehicles_temp'中。 http://www.techonthenet.com/sql/intersect.php,http://technet.microsoft.com/en-us/library/ms188055.aspx – Aashray

5

找出哪一行導致問題的唯一方法(我知道)是使用Oracle的「將錯誤記錄到」功能。這樣insert不會拋出異常,任何違反任何約束的行都將被寫入指定的錯誤表中。

要做到這一點,你首先需要創建包含被拒絕的行日誌表:

EXECUTE DBMS_ERRLOG.CREATE_ERROR_LOG('BD_VEHICLES_TEMP'); 

這將創建一個名爲ERR$_BD_VEHICLES_TEMP

然後運行更改您的發言到此表:

insert into bd_vehicles_temp 
select * 
from bd_vehicles_temp_1 
LOG ERRORS REJECT LIMIT UNLIMITED; 

即使行未能驗證約束,該語句也會繼續。語句結束後,您可以檢查表ERR$_BD_VEHICLES_TEMP中違反約束的行的內容,包括錯誤消息和值。

(編輯):如果您想停在第一個錯誤(並在日誌表中看到該錯誤),則省略REJECT LIMIT UNLIMITED子句。

更多細節都在手冊中:

+0

這些東西是由oracle提供給我的。我怎樣才能使用相同的使用jdbc。 –

+0

可能值得注意的是,REJECT LIMIT UNLIMITED會導致部分INSERT。 @AbishekSingh:爲了避免這種情況,您可以簡單地省略REJECT LIMIT UNLIMITED子句。 –

+1

@AbhishekSingh:只需通過JDBC運行INSERT即可。錯誤表的創建可以使用SQL * Plus完成,因爲只需要執行一次(但當然也可以通過JDBC調用該過程)。 –