【问题标题】:Trying to setClob() In JDBC to insert a string to Oracle database尝试在 JDBC 中使用 setClob() 将字符串插入 Oracle 数据库
【发布时间】:2016-11-15 10:19:24
【问题描述】:

我正在尝试将数据作为 clob 插入到 oracle 数据库中,我用于插入的代码如下:

Connection connection = getConnection();
    PreparedStatement ps = null;
    try
    {
        System.out.println("datra i retrive is : " + status + "  " + operationType + "   " + errorLog + "    " + clipBoardId);
        int i = 0;
        ps = connection.prepareStatement(SQL_CODELIST_BATCH_UPDATE);
        ps.setString(++i, status);
        
        /*ByteArrayInputStream inputStream = new ByteArrayInputStream(errorLog.getBytes());
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream);*/
        
        Clob clob = (java.sql.Clob)oracle.sql.CLOB.createTemporary(
                  connection, false, oracle.sql.CLOB.DURATION_SESSION);
        clob.setString(1, errorLog);
        
        ps.setClob(++i, clob);
        ps.setString(++i, operationType);
        ps.setString(++i, clipBoardId);
        ps.executeUpdate();
    }catch(Exception e){
        e.printStackTrace();
    }
    finally
    {
        close(ps);
        close(connection);
    }

如果我试图在setClob() 方法中插入上面的代码,它会给出如下异常:

java.lang.ClassCastException: $Proxy43 无法转换为 oracle.jdbc.OracleConnection

在 oracle.sql.CLOB.createTemporary(CLOB.java:676)

在 oracle.sql.CLOB.createTemporary(CLOB.java:640)

如果我尝试创建CLOB 如下

Clob clob = connection.createClob() 

并将字符串值设置为

clob.setString(1, "test code");

它卡在createClob();

【问题讨论】:

  • 你在什么环境下运行你的代码,例如在雄猫?您如何创建或检索数据库连接?
  • “卡在 createClob()”是什么意思?它会崩溃吗?它不会编译吗?还是代码挂起,即不继续执行?
  • 卡住意味着在 createClob() 之后它将直接阻塞并且环境是 tomcat 并且在执行操作之前我正在执行插入然后我尝试更新数据并且其中一个数据列是块
  • CLOB.createTemporary 如果不使用 oracle.jdbc.driver.OracleConnection 有一个BUG。
  • 这不是错误。这是一种仅适用于 oracle.jdbc.driver.OracleConnection 实例的方法。并且 Tomcat 只会向您传递一个代理连接,该连接会主动防止被解包以访问真正的 Oracle 连接。此外,整个 oracle.sql.CLOB 类现在已被弃用。

标签: java oracle jdbc


【解决方案1】:

最后我得到了解决方案,它对我有用

而不是创建

Clob clob = connection.createClob();
clob.setClob(<parameter>, clob object);

我做的是用方法

ps.setCharacterStream(<parameter>, inputStreamReader, inputStream.available());

它对我来说很好用

【讨论】:

    【解决方案2】:

    如果您有大量数据要存储到CLOB,您的解决方案是最好的。否则,您可以只使用ps.setString,就像列是VARCHAR 而不是CLOB

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-19
      • 2016-08-27
      • 2014-01-13
      • 2015-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多