Почему Oracle не говорит Вам, КАКАЯ таблица или представление не существуют?

Посмотрите на этот пример Plnkr

Переменная this сильно отличается timesCalled с каждым нажатием кнопки увеличивается только на 1. Ответ на мой личный вопрос:

.click( () => { } )

и

.click(function() { })

создают одинаковое количество функции при использовании в цикле, как вы можете видеть из подсчета Guid в Plnkr.

59
задан Lalit Kumar B 18 December 2015 в 06:35
поделиться

7 ответов

Можно установить СОБЫТИЕ в файле параметра (простой текст или spfile), чтобы вынудить Oracle вывести подробный файл трассировки в user_dump_dest, имя объекта могло бы быть там, если не SQL должен быть.

СОБЫТИЕ = "942 имени трассировки errorstack уровень 12"

при использовании файла простого текста необходимо сохранить все настройки EVENT на последовательных строках. Не уверенный, как это относилось к spfile.

13
ответ дан Ethan Post 24 November 2019 в 18:33
поделиться

SQL*Plus действительно говорит Вам таблицу, которая не существует. Например:

SQL> select
  2     *
  3  from
  4     user_tables a,
  5     non_existent_table b
  6  where
  7     a.table_name = b.table_name;
   non_existent_table b
   *
ERROR at line 5:
ORA-00942: table or view does not exist

Здесь это показывает, что название недостающей таблицы и номера строки в SQL-операторе, где ошибка происходит.

Точно так же в коротком SQL-операторе Вы видите, что звездочка выделяет название неизвестной таблицы:

SQL> select * from user_tables a, non_existent_table b where a.table_name = b.table_name;
select * from user_tables a, non_existent_table b where a.table_name = b.table_name
                             *
ERROR at line 1:
ORA-00942: table or view does not exist

С точки зрения Вашего вопроса, я предполагаю причину, сообщение об ошибке не включает название таблицы, то, что само сообщение об ошибке должно быть статическим текстом. Номер строки и местоположение в строке ошибки ясно пасуются назад к SQL*Plus (так или иначе).

12
ответ дан Nick Pierpoint 24 November 2019 в 18:33
поделиться

При использовании средства просмотра SQL как ЖАБА или TORA, поможет Вам с ошибками РТОВ highlightling или указывающий на перемещение курсора туда, где Вы совершили свою ошибку.

Копия и вставка Ваш SQL в к одному из этих инструментов для помощи. Можно также найти проанализировать информацию доступной полезный также.

5
ответ дан Mark Nold 24 November 2019 в 18:33
поделиться

Если не огромный оператор, то самый легкий путь состоит в том, чтобы только проверить словарь данных,

SQL> select * from xx,abc;
select * from xx,abc
                 *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select owner,table_name from all_tables where table_name in ('XX','ABC');

OWNER                          TABLE_NAME
------------------------------ ------------------------------
MWATSON                        XX

SQL> 

, Это не идеально, но за исключением движения и исследования файлов трассировки, я не уверен, как еще сделать это.

3
ответ дан Matthew Watson 24 November 2019 в 18:33
поделиться

@Matthew

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

SQL> select * from tools; 
select * from tools 
              * 
ERROR at line 1: 
ORA-00942: table or view does not exist 

таблица все еще обнаруживается в all_tables хотя:

SQL> select owner, table_name from all_tables where table_name = 'TOOLS'; 

OWNER                          TABLE_NAME 
------------------------------ ------------------------------ 
APPLICATION                    TOOLS 

@erikson Извините, что не помогает многому. Я с Mark - я использовал ЖАБУ.

1
ответ дан Hobo 24 November 2019 в 18:33
поделиться

У меня никогда не было проблем с интерпретацией сообщений об ошибках Oracle. Частично причина в том, что каждый интерактивный инструмент, который я видел для разработки SQL для Oracle, указывает на местоположение, в котором произошел сбой запроса. Это включает в себя SQL * Plus, как уже отмечали другие, и модуль Perl DBI:

$ exec_sql.pl 'select * from daul'
DBD::Oracle::db prepare failed: ORA-00942: table or view does not exist (DBD ERROR: error possibly near <*> indicator at char 14 in 'select * from <*>daul') [for Statement "select * from daul"] at exec_sql.pl line 68.

Хорошо, что немного трудно читать, так как все сжато на одной строке. Но инструмент с графическим интерфейсом мог бы указывать на маркер, где у Oracle начались проблемы с запросом. И если немного поработать над парсером, вы можете написать инструмент для выбора таблицы, которая нарушает работу.

Чтобы ответить на основной вопрос, ошибки Oracle, похоже, не предназначены для того, чтобы работать так, как вы ожидаете. Насколько я могу судить, ни одно из сообщений об ошибках в Oracle не поддерживает переменную text. Вместо этого Oracle возвращает два бита информации: номер ошибки и место, где происходит ошибка. Если у вас есть подходящие инструменты, диагностировать ошибку по этим частям довольно легко. Можно утверждать, что система Oracle более хороша для создателей инструментов, чем система, которая предоставляет различные объемы диагностических данных в зависимости от ошибки. Представьте себе, что нужно написать собственный синтаксический анализатор для всех сообщений об ошибках Oracle (включая будущие ошибки), чтобы выделить ошибочное местоположение.

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

SQL> select * from where dummy = 'X';
select * from where dummy = 'X'
              *
ERROR at line 1:
ORA-00903: invalid table name

Что касается того, почему Oracle решил так поступить, у меня есть некоторые предположения:

  1. IBM использовала этот стиль сообщений об ошибках для System R, который Ларри Эллисон, Боб Майнер и Эд Оутс скопировали для создания Oracle V2. (Обратная совместимость. )

  2. Номер и местоположение ошибки - это наименьшее возможное представление диагностической информации. (Скупость.)

  3. Как я указывал выше, чтобы упростить создание инструментов, которые подключаются к Oracle. (Совместимость.)

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

3
ответ дан 24 November 2019 в 18:33
поделиться

Причина 1: многоязычный интерфейс

Для вашего экземпляра базы данных существует файл конфигурации сообщений для конкретного языка. Сообщения извлекаются оттуда и переводятся из чистой числовой версии в числовую + текстовую версию.

Вероятно, считалось, что лучше иметь жестко закодированные строки, чем рисковать во время выполнения иметь загадочный сбой из-за неправильного отформатированная строка "% s".

(Кстати, я не совсем согласен с этим POV.)

Причина 2: Безопасность

Прямо сейчас вы не особенно раскрываете внутреннюю работу вашего приложения, если вы печатаете PHP и т. д., дамп сообщения об ошибке Oracle в браузер.

Приложения были бы немного более открытыми, если бы по умолчанию печаталось больше деталей ... Например, если Ситибанк напечатал более пояснительное сообщение.

3
ответ дан 24 November 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: