2014-01-09 57 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的问题。