BatchUpdateException: ORA-00942: ТАБЛИЦА ИЛИ ВИДА НЕ СУЩЕСТВУЕТ - PullRequest
0 голосов
/ 03 сентября 2018

Эта проблема возникла в пакетной вставке jdbc. Я запросил у источника данных Oracle, проанализировал набор результатов и затем вставил в другой источник данных Oracle. Я получил метаданные подключения и напечатал текущее имя пользователя вместе с URL, оба недействительны. Но когда дело дошло до пакетного обновления, я получил исключение ora-00942. Я уверен, что все вышеперечисленное прекрасно работает в базе данных. Кто-нибудь сталкивался с этим исключением и можете ли вы дать мне совет?

EDIT: Хорошо, я получил таблицу с именем photos, например, в REMOTE_USER, и запросил ее. Это дало мне набор результатов, а затем я анализирую его, ВСТАВЛЯЙТЕ его в LOCAL_USER.photos. Я запросил LOCAL_USER.photos, где я вхожу в PL / SQL Developer. Интересно то, что я мог выполнить команду select, но не insert. Ниже приведена часть кода.

     conn = datasource.getConnection(); // notice that it was target datasource
            DatabaseMetaData connMetaData = conn.getMetaData();
            String userName = connMetaData.getUserName();
            resultSet = ds.getResultSet();
            ResultSetMetaData metaData = resultSet.getMetaData();
            int count = metaData.getColumnCount();

      String insertSql = generateInsertSql(count, metaData, userName);
      // this was generated through metaData , the output should be 
      // "insert into LOCAL_USER.photos(col1,col2) values(?,...)"

        logger.error("insert clause is {}", insertSql);
        ps = conn.prepareStatement(insertSql);
        conn.setAutoCommit(false);
        while (resultSet.next()) { // this was the original datasource
            stageTotalNum++;
            for (int i = 1; i <= count; i++) {
                Object object = resultSet.getObject(i);
                dealClobColumn(ps, i, object);
            }
            ps.addBatch();

            if (stageTotalNum % 500L == 0L) {
                ps.executeBatch(); // throws batchupdateexception.
                ps.clearBatch();
                conn.commit();
            }
        }

        ps.executeBatch();

        conn.commit();

1 Ответ

0 голосов
/ 03 сентября 2018

Это должен быть столбец типа blob, который я неправильно обработал. Сначала я запросил исходный источник данных, а затем получил столбец blob набора результатов: conn.getObject(index). Затем я вставляю столбец BLOB в целевой источник данных с помощью conn.setObject. Конечно, этот способ вообще не работал, поэтому я переключился на следующее:

 conn.setBlob(rs.getBlob(index)).

Хотя в моем собственном окружении это работало нормально, но когда приложение запускалось на удаленном сервере, оно продолжало раздражать «таблица или представление не существует». Третья версия:

conn.setBinaryStream(rs.getBlob(index).getBinaryStream());

Хорошо, на этот раз это сработало как на моем компьютере, так и на удаленном сервере. Благодаря совету и ссылке @ codeLover, это действительно помогло мне и сэкономило мое время. Ценю это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...