Nano Hash - криптовалюты, майнинг, программирование

Получение исключения 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, я попытался заменить установщик clob на временный установщик строк и тот же код, выполненный без каких-либо проблем, и все строки были правильно вставлены !!!.

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

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

peparedstatement.setString (columnIndex, «Строка»)

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

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


  • Ну, я полагаю, таблицы или представления не существует. Можете ли вы показать нам определение таблицы, а также ваше утверждение? 03.07.2011
  • @aquero: Возможно, вам поможет печать (и отображение здесь) запроса, вызывающего эту ошибку. 03.07.2011
  • @aquero: Покажите, пожалуйста, код Java, который вы используете. 03.07.2011
  • Для [BC] Lob в oracle, я думаю, вам нужно сначала вставить новую запись с null Lob и сразу после этого обновить ее данными Lob. (Это было какое-то время, поэтому я не совсем уверен ›) 03.07.2011
  • @rsp - это верно для очень старых версий базы данных. Я полагаю, что это все еще может быть правдой с вызовами JDBC. 03.07.2011
  • Oracle выдает (бесполезную) ошибку ORA-00942, если вы пытаетесь вставить / обновить данные LOB неправильно. У меня была аналогичная проблема с большими двоичными объектами, и я не мог использовать setString() обходной путь. Правильный способ - сначала записать данные в большой двоичный объект, используя OutputStream из Blob.setBinaryStream(), а затем использовать этот объект Blob в setBlob(). Дополнительную информацию см. В этом документе. 24.01.2012

Ответы:


1

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

03.07.2011
  • Это был именно мой случай с многопользовательским приложением, которому требовался доступ (также для SELECT) к другой схеме. Совет для разработчиков: еще раз проверьте эту проблему для НОВЫХ таблиц, которые вы можете добавить, потому что их легко забыть (это я) 19.02.2021

  • 2

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

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

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

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

    12.07.2011

    3

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

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

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

    peparedstatement.setString (columnIndex, «Строка»)

    19.07.2011
  • Это неправильное решение! Если вы попытаетесь перенести данные учетной записи между базами данных, вы потеряете clob, данные blob, доступные в этих столбцах. 25.03.2019

  • 4

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

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

    18.07.2011
  • Для меня это ответ, поскольку это общий случай (также для SELECT). Это был именно мой случай с многопользовательским приложением, которому требовался доступ (также для SELECT) к другой схеме. Совет для разработчиков: еще раз проверьте эту проблему для НОВЫХ таблиц, которые вы можете добавить, потому что их легко забыть (это я) 19.02.2021

  • 5

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

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

    Мне кажется, что использование characterStream работает. Я читаю таблицы из одной базы данных и пишу в другую с помощью jdbc. И я получал ошибку table not found, как указано выше. Вот как я решил проблему:

    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;
    

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

    15.03.2012

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

    7

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

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

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

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

    03.07.2011
  • Я изменил свой запрос на вставку, чтобы включить схему, но все равно получаю то же исключение 03.07.2011
  • @aquero, можете ли вы отредактировать свой вопрос и включить оператор и код Java, который подготавливает, связывает значения и выполняет? 03.07.2011
  • пожалуйста, найдите комментарии, добавленные в мой вопрос выше. Это было проблемой при вставке данных clob. Но возникшее исключение было ошибкой таблицы не существует. Спасибо большое за вашу помощь..:) 03.07.2011

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

    9

    Возможно ли, что вы делаете INSERT для VARCHAR, но делаете INSERT, а затем UPDATE для CLOB?

    Если это так, вам необходимо предоставить UPDATE разрешений для таблицы в дополнение к INSERT.

    См. https://stackoverflow.com/a/64352414/1089967

    20.10.2020

    10

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

    введите описание изображения здесь

    16.11.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..