【问题标题】:Oracle JDBC Clob insert issue ORA-00942Oracle JDBC Clob 插入问题 ORA-00942
【发布时间】:2015-07-28 14:15:01
【问题描述】:

我正在从 Oracle 源读取一组字段并将检索到的数据插入另一个 Oracle 源,当我尝试插入 clob 区域时,我碰巧遇到“java.sql.SQLException: ORA-00942: table or view不存在”异常,所有字段都插入成功,除了clob区域。下面我将添加目标表的字段和我的示例代码。我还发现了这个 solution on stackoverflow 并没有帮助我。目标表是oracle exadata

Table PODS.RAP_AUDIT
Column name: EVENT_ID
Column type: VARCHAR2

Column name: RUN_DATE
Column type: DATE

Column name: USER_NAME
Column type: VARCHAR2

Column name: STATUS
Column type: VARCHAR2

Column name: UNIVERSE_NAME
Column type: VARCHAR2

Column name: REPORT_NAME
Column type: VARCHAR2

Column name: CUI_ID
Column type: VARCHAR2

Column name: QUERY_NAME
Column type: VARCHAR2

Column name: REPORT_DURATION
Column type: NUMBER

Column name: ROW_COUNT
Column type: VARCHAR2

Column name: SQL
Column type: CLOB

代码:

private static void retrieveClobArea() {

        String sql = "select E.START_TIME as dateval, 5087472590231472273 as idval,  D.EVENT_DETAIL_VALUE as clobval  from BO41AUD.ADS_EVENT_DETAIL D, BO41AUD.ADS_EVENT E where E.EVENT_ID=D.EVENT_ID and     E.START_TIME >= to_date('28.07.2015 12:19:14','DD.MM.YYYY HH:MI:SS')";

        try {
            Class.forName(jdbcDriver);
            connection = DriverManager.getConnection(sourceDBConnection,
                    sourceDBUser, sourceDBPass);
            statement = connection.createStatement();
            resultSet = statement.executeQuery(sql);
            while (resultSet.next()) {

                insertSampleCLOB(resultSet.getString(2), resultSet.getClob(3));
            }
        } catch (SQLException e) {
            System.err.println(e);
        } catch (ClassNotFoundException e) {
            System.err.println(e);
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                System.err.println(e);
            }
        }

    }


private synchronized static void insertSampleCLOB(String eventId, Clob sql) {
        StringBuilder insertQuery = new StringBuilder();
        insertQuery.append("INSERT INTO PODS.RAP_AUDIT ");
        insertQuery.append("(");
        insertQuery.append("EVENT_ID, ");
        insertQuery.append("SQL");
        insertQuery.append(")  VALUES(?,?)");

        try {
            Class.forName(jdbcDriver);
            connection = DriverManager.getConnection(targetDBConnection,
                    targetDBUser, targetDBPass);
            preparedStatement = connection.prepareStatement(insertQuery
                    .toString());

            preparedStatement.setString(1, eventId);

            preparedStatement.setClob(2, sql);


            preparedStatement.executeUpdate();
            System.out.println("Inserted " + eventId + "  " + new java.util.Date());

        } catch (ClassNotFoundException e) {
            logger.error("insertInRAP_AUDIT exception cnfe " + e);
            System.err.println(e);
        } catch (SQLException e) {
            logger.error("insertInRAP_AUDIT exception sqle " + e);
            System.err.println(e);
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                logger.error("insertInRAP_AUDIT exception connection close e "
                        + e);
                System.err.println(e);
            }
        }
    }

【问题讨论】:

  • 为什么链接问题中的解决方案没有帮助?您是否仍然使用setString 或字符流获得 ORA-00942,这表明您连接的用户只是无权访问表并且与 CLOB 无关?还是别的什么?

标签: java oracle jdbc clob exadata


【解决方案1】:

在调用方法 insertSampleClob 之前,请执行以下操作:

Clob clob = CLOB.createTemporary(connection, false, oracle.sql.CLOB.DURATION_SESSION);
clob= resultSet.getClob(3);

然后:

insertSampleCLOB(resultSet.getString(2),clob);

它应该可以解决您的问题。

【讨论】:

  • 我认为这只会泄漏一个临时 LOB,直到会话关闭
  • 您正在创建一个临时 LOB,然后丢弃其定位器以存储来自 resultSet 的定位器。
猜你喜欢
  • 2016-08-21
  • 1970-01-01
  • 2012-04-16
  • 2015-10-06
  • 2014-04-14
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2023-04-10
相关资源
最近更新 更多