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

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

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

Я могу подтвердить, что таблица существует в БД, и я могу вставить данные в эту таблицу с помощью oracle разработчик sql. Но когда я пытаюсь вставить строки с помощью preparedstatement в 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) 

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

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

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

ie. peparedstatement.setClob (columnIndex, clob)

был заменен

peparedstatement.setString (columnIndex, "String")

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

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

9 ответов


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


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

Я пробовал setClob () с java.язык SQL.Clob и setCLOB () с оракулом.интерфейс jdbc.Но с тем же результатом.

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

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


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

ie. peparedstatement.setClob (columnIndex, clob)

был заменен

peparedstatement.setString (columnIndex, "String")


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

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


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

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

С помощью characterStream, кажется, работает для меня. Я читаю таблицы из одной БД и пишу другой использует 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;

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


мы столкнулись с этой проблемой в столбце 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);
        }

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

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

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

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


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

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"));
}

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

enter image description here