【问题标题】:Insert xml file into XMLTable using JDBC使用 JDBC 将 xml 文件插入 XMLTable
【发布时间】:2014-01-27 22:05:03
【问题描述】:

我在 Oracle 中创建了一个 XMLType 表。我正在尝试使用 JDBC 将 XML 文件插入到表中。它在扔 -

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();

【问题讨论】:

    标签: jdbc oracle11g xmltype


    【解决方案1】:

    正如我在官方文档here 中看到的,您可以通过以下两种方式之一在 Java 中插入 XMLType:

    • 通过 CLOB 或字符串绑定
    • 通过 setObject() 或 setOPAQUE() 使用

    我会将文件读取为字符串,然后将其用于插入查询

    【讨论】:

      【解决方案2】:

      您正在尝试将二进制数据直接插入 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 问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-28
        • 1970-01-01
        • 2020-04-29
        • 2020-10-17
        相关资源
        最近更新 更多