2015-07-28 2 views
0

Я читаю набор полей из источника Oracle и вставляю извлеченные данные в другой источник Oracle, когда я пытаюсь вставить в область clob, мне случается «java.sql.SQLException : ORA-00942: таблица или представление не существует "исключение, все поля вставлены успешно, но область clob. Ниже я добавлю поля целевой таблицы и мой пример кода. Я также узнал об этом solution on stackoverflow, который не помог мне. Целевая таблица Oracle ExadataПроблема с вставкой Oracle JDBC Clob ORA-00942

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); 
      } 
     } 
    } 
+0

Почему не помогли решения в связанном вопросе? Вы все еще получали ORA-00942 с помощью 'setString' или символьного потока, который предполагал бы, что вы подключены, так как у вас нет доступа к таблице, и это не связано с CLOB? Или что-то другое? –

+0

Решение в ссылке предлагает использовать setString, тогда как данные, хранящиеся в этих полях, огромны, что невозможно сохранить в виде типа String, поскольку оно ограничит данные до 4K. –

ответ

-1

Перед вызовом метода insertSampleClob сделать это:

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

, а затем:

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

Он должен решить твоя проблема.

+0

Я думаю, что это просто утечка временной LOB до закрытия сессии – gpeche

+0

Вы пробовали до проголосовать? –

+0

вы создаете временное LOB и затем отбрасываете его локатор, чтобы сохранить тот, который поступает из 'resultSet'. – gpeche

Смежные вопросы