Подтвердить что ты не робот

Получение исключения ORA-00942: таблица или представление не существует - при вставке в существующую таблицу

Я получаю ниже исключения при попытке вставить пакет строк в существующую таблицу

ORA-00942: таблица или представление не существует

Я могу подтвердить, что таблица существует в db, и я могу вставлять данные в эту таблицу с помощью oracle разработчик sql. Но когда я пытаюсь вставить строки с использованием подготовленного состояния в java, в его металической таблице не существует ошибки.

Найдите трассировку стека ниже

java.sql.SQLException: ORA-00942: table or view does not exist

    at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289) 
    at oracle.jdbc.ttc7.Oall7.receive(Oall7.java:573) 
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1889)
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:1093)
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:2047)
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1940) 
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout>>(OracleStatement.java:2709)
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:589)
    at quotecopy.DbConnection.insertIntoDestinationDb(DbConnection.java:591)
    at quotecopy.QuoteCopier.main(QuoteCopier.java:72) 

Может кто-нибудь предложить причины этой ошибки?

Обновление: Проблема решена

Не было проблем с моими свойствами подключения к базе данных или с моей таблицей или именем представления. Решение проблемы было очень странным. Один из столбцов, которые я пытался вставить, был типа Clob. Поскольку у меня было много проблем с обработкой данных clob в oracle db раньше, попробовал, заменив set set clob на временный набор строк и тот же код, выполненный с любыми проблемами, и все строки были правильно вставлены!!!.

т. peparedstatement.setClob(columnIndex, clob)

был заменен на

peparedstatement.setString(columnIndex, "String" )

Почему в таблице ошибок или представлении существует ошибка, возникающая при ошибке в вставке данных clob. Может ли кто-нибудь из вас объяснить это?

Большое спасибо за ваши ответы и комментарии.

4b9b3361

Ответ 1

Не было проблем с моими свойствами подключения к базе данных или с моей таблицей или именем представления. Решение проблемы было очень странным. Один из столбцов, которые я пытался вставить, был типа Clob. Поскольку у меня было много проблем с обработкой данных clob в oracle db раньше, попробовал, заменив set set clob на временный набор строк и тот же код, выполненный с любыми проблемами, и все строки были правильно вставлены!!!.

т. peparedstatement.setClob(columnIndex, clob)

был заменен на

peparedstatement.setString(columnIndex, "String" )

Ответ 2

Oracle также сообщит об этой ошибке, если таблица существует, но у вас нет никаких прав на нее. Поэтому, если вы уверены, что таблица там, проверьте гранты.

Ответ 3

Кажется, что существует некоторая проблема с setCLOB(), которая вызывает ORA-00942 при некоторых обстоятельствах, когда целевая таблица существует и имеет правильную привилегию. Теперь у меня такая точная проблема, я могу сделать ORA-00942 уйти, просто не привязывая CLOB к той же таблице.

Я попытался setClob() с java.sql.Clob и setCLOB() с oracle.jdbc.CLOB, но с тем же результатом.

Как вы говорите, если вы привязываетесь как строка, проблема уходит - но тогда это ограничивает размер ваших данных до 4k.

От тестирования, похоже, срабатывает, когда транзакция открыта на сеансе до привязки CLOB. Я вернусь, когда решит это... проверит поддержку Oracle.

Ответ 4

@unbeli прав. Отсутствие соответствующих грантов на столе приведет к этой ошибке. Для чего это стоит, я недавно испытал это. Я столкнулся с точной проблемой, которую вы описали, я мог выполнять инструкции insert через sql-разработчик, но сбой при использовании спящего режима. Наконец я понял, что мой код делает больше, чем очевидная вставка. Вставка в другие таблицы, у которых не было соответствующих грантов. Настройка прав доступа разрешила это для меня.

Примечание. У вас нет репутации для комментариев, иначе это может быть комментарий.

Ответ 5

Я нашел, как решить эту проблему, не используя метод JDBC setString(), который ограничивает данные до 4K.

Что вам нужно сделать, так это использовать prepareStatement.setClob(int parameterIndex, Reader reader). По крайней мере, это то, что сработало для меня. Мысль Драйверы Oracle преобразуют данные в поток символов для вставки, похоже, что нет. Или что-то конкретное, вызывающее ошибку.

Использование characterStream, похоже, работает на меня. Я читаю таблицы с одного db и записываю в другой, используя jdbc. И я получал таблицу не найденной ошибкой, как это упоминалось выше. Так вот как я решил проблему:

case Types.CLOB:   //Using a switch statement for all columns, this is for CLOB columns
        Clob clobData = resultSet.getClob(columnIndex); // The source db
        if (clobData != null) {
            preparedStatement.setClob(columnIndex, clobData.getCharacterStream());
        } else {
            preparedStatement.setClob(columnIndex, clobData);
        }
        clobData = null;
        return;

Теперь все хорошо.

Ответ 6

Мы столкнулись с этой проблемой в столбце BLOB. На всякий случай, когда кто-то сталкивается с этим вопросом, когда сталкивается с этой ошибкой, вот как мы решили проблему:

Мы начали с этого:

            preparedStatement.setBlob(parameterIndex, resultSet.getBlob(columnName)); break;

Мы решили проблему, изменив эту строку:

        java.sql.Blob blob = resultSet.getBlob(columnName);
        if (blob != null) {
            java.io.InputStream blobData =  blob.getBinaryStream();
            preparedStatement.setBinaryStream(parameterIndex, blobData);
        } else {
            preparedStatement.setBinaryStream(parameterIndex, null);
        }

Ответ 7

Является ли ваш script именем схемы, или вы полагаетесь на пользователя, зарегистрированного в базе данных, чтобы выбрать схему по умолчанию?

Возможно, вы не называете схему и не выполняете свою партию с системным пользователем, а не с пользователем схемы, что приводит к неправильному контексту выполнения для script, который будет работать нормально, если выполняется пользователем, который имеет целевая схема установлена ​​как схема по умолчанию. Лучше всего было бы включить имя схемы в инструкции insert:

INSERT INTO myschema.mytable (mycolums) VALUES ('myvalue')

update:. Вы пытаетесь связать имя таблицы как связанное значение в своем подготовленном сообщении? Это не сработает.

Ответ 8

Это работает для меня:

Clob clob1;
while (rs.next()) {
   rs.setString(1, rs.getString("FIELD_1"));

   clob1 = rs.getClob("CLOB1");
   if (clob1 != null) {
      sta.setClob(2, clob1.getCharacterStream());
   } else {
      sta.setClob(2, clob1);
   }
   clob1 = null;

   sta.setString(3, rs.getString("FIELD_3"));
}

Ответ 9

Здесь я получил решение для вопроса. Проблема заключается в использовании стеклянной рыбы, если вы ее используете. Когда вы создаете имя JNDI, убедитесь, что имя пула верное, а имя пула - имя созданного вами имени пула соединений.

enter image description here