2016-10-27 26 views
0

我試圖將CLOB從一個數據庫複製到另一個。但是我得到The Locator is invalid because it has been changed錯誤。Teradata CLOB和JDBC:定位器無效,因爲它已被更改錯誤

這個article說這可能發生,因爲ResultSet,PreparedStamenent已關閉。但是,我的所有物品都已開放。當我嘗試executeBatch()

Statement select = connectionDB1.createStatement(); 
ResultSet rs = select.executeQuery("SELECT TOP 1 myClob FROM myTab"); 
rs.next(); 
PreparedStatement ps = connectionDB2.prepareStatement("INSERT INTO myTab2 SELECT ? "); 
ps.setClob(1, rs.getClob(1)); 
System.out.println("CLOB inserted"); 
ps.addBatch(); 
ps.executeBatch(); // ERROR is thrown here before I close any objects WHY? 
        // java.sql.BatchUpdateException 

爲什麼會發生這種情況是拋出的錯誤?如何防止這一點?


PS:VARCHAR,DECIMAL

回答

1

的文章說,CLOB是一個定位器是在同一個會話有效:上面的代碼與其他任何類型的數據運行良好。

但是,當您嘗試將其應用於另一個連接時,您正在使用它在不同會話中,因此會發生錯誤。

您需要做的是從源數據庫中讀取實際的CLOB內容並將其寫入目標數據庫。

+0

謝謝+1。 「讀取實際的CLOB內容」是什麼意思?你是否想將原始CLOB寫入本地文件,然後從該文件讀取並將其加載到目標數據庫? – john

+0

如果您已經知道您正在討論非常大的文本,並且您可以使用一些Teradata工具進行加載,則這可能是最佳選擇。如果你想留在Jdbc中,我想你可以從源CLOB獲取characterStream並將其設置爲目標CLOB的輸入。 – Insac

+0

您可以在這些Teradata jdbc示例中找到Lob管理的一些很好的示例(http://developer.teradata.com/doc/connectivity/jdbc/reference/current/samplePrograms.html) – Insac

相關問題