2014-01-09 55 views
2

我已經在Oracle中創建了一個XMLType表。我正嘗試使用JDBC將XML文件插入到表中。它扔 -使用JDBC將XML文件插入XMLTable

ORA-00932: inconsistent datatypes: expected - got BINARY

的代碼 -

 OraclePreparedStatement statement = (OraclePreparedStatement) getConnection().prepareStatement 
     ("insert into person values(?)"); 
     FileInputStream fileinp = new FileInputStream(file); 
     statement.setBinaryStream(1, fileinp, fileLength);  
     statement.executeUpdate(); 

回答

1

正如我在官方文檔here中所看到的,你可以通過以下兩種方式之一插入Java中的XMLType:

  • 通過CLOB或字符串綁定
  • 通過setObject()或setOPAQUE()使用

我會讀取文件爲一個字符串,然後用它來插入查詢

1

你試圖二進制數據直接插入到你的XMLType列,並且沒有隱式轉換爲。假設你的文件實際上是文本,你可以把作爲一個CLOB而非BLOB:

OraclePreparedStatement statement = 
    (OraclePreparedStatement) getConnection().prepareStatement(
    "insert into person values(xmltype(?))"); 
FileInputStream fileinp = new FileInputStream(file); 
InputStreamReader filerdr = new InputStreamReader(fileinp); 
pStmt.setCharacterStream(1, filerdr, fileLength); 
pStmt.executeUpdate(); 

注意語句現在使用xmltype(?)(雖然它的工作原理沒有,由於有來自CLOB隱式轉換,但我認爲無論如何,最好是明確的);和我使用的是InputStreamReader通過的文本可以,而且也應該,使用一個緩衝的讀者:

FileInputStream fileinp = new FileInputStream(file); 
InputStreamReader filerdr = new InputStreamReader(fileinp); 
BufferedReader filebuf = new BufferedReader(filerdr); 
pStmt.setCharacterStream(1, filebuf, fileLength); 
pStmt.executeUpdate(); 

與正常表XMLType列測試,並與一個XMLType表。

傳遞帶有setBinaryStream的文本文件會混淆XMLType;用相同的有效文件,使用setBinaryStream()得到錯誤:

ORA-31011: XML parsing failed 
ORA-19202: Error occurred in XML processing 
LPX-00210: expected '<' instead of '3' 

有可能是周圍的一種方式,但我假設你的文件只是文本,不會是一個CLOB的問題。