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

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

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

Я могу подтвердить, что таблица существует в БД, и я могу вставить данные в эту таблицу, используя оракул 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, я попробовал, заменив установщик clob на временный установщик строк, и тот же код был выполнен без проблем, и все строки были правильно вставлены !!! *

т. peparedstatement.setClob (columnIndex, clob)

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

peparedstatement.setString (columnIndex, "String")

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

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

Ответы [ 9 ]

13 голосов
/ 03 июля 2011

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

10 голосов
/ 12 июля 2011

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

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

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

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

7 голосов
/ 19 июля 2011

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

т.е.peparedstatement.setClob (columnIndex, clob)

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

peparedstatement.setString (columnIndex, "String") *

3 голосов
/ 18 июля 2011

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

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

2 голосов
/ 14 июля 2014

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

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

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

Мне кажется, что использование 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;

Все хорошо.

1 голос
/ 03 июля 2011

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

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

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

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

0 голосов
/ 16 ноября 2017

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

enter image description here

0 голосов
/ 12 июня 2015

у меня работает:

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