2013-09-19 3 views
1

У нас есть огромный SQL-скрипт, включающий десятки таблиц, подзапросов, сотни атрибутов. Он отлично работает в тестовой базе данных, но возвращает sql subquery returns more than 1 row при запуске в производственной базе данных. Сценарий работал отлично до сих пор. Проблема в том, что все, что я получаю, - это однострочная ошибка, указанная выше, без каких-либо указаний, которые точный подзапрос вызывает ошибку, которая делает ее почти невозможной для отладки. Вопрос в том, как я должен знать, какая строка SQL вызывает ошибку? Есть ли способ «отлаживать» его по строкам, как если бы вы сделали это на языке программирования? Я использую TOAD с Oracle 11g.как отлаживать «sqquery subquery возвращает более 1 строки» ошибка

+3

Поиск '... = (select ...)' местоположений в вашем скрипте. –

+0

Скрипт огромен, я имею в виду огромный. Было бы очень много времени искать каждый подзапрос. Некоторые подзапросы - это взаимосвязанные подзапросы, которые затрудняют их понимание. Предложение select в строке 100 ссылается на таблицу в строке 800, например. Вот почему мне нужно знать, какой подзапрос вызывает ошибку, чтобы я мог ее исправить. Или, по крайней мере, в какой момент выполнения появляется ошибка, которая указывает, какие данные заставляют подзапрос возвращать более одной строки. – Ahmedov

+1

«Он отлично работает в тестовой базе данных»; поэтому здесь есть два варианта. Либо у вас есть проблема с данными в вашей базе данных prod (т. Е. Некоторые отсутствующие ключи и т. Д.), И в этом случае вам нужно это исправить. Проверьте все ограничения на всю таблицу, связанную с этим запросом. Другой вариант заключается в том, что ваша тестовая БД не имела правильных данных, и в этом случае этот запрос неверен и никогда не работал. Самый простой способ отладки такого рода - взять минимальную часть запроса и построить на нем ... продолжать добавлять все больше и больше, пока не нажмете на ошибку. – Ben

ответ

2

Добавить print или DBMS_OUTPUT.PUT_LINE команды для вашего сценария для печати сообщений. И/или использовать обработчики исключений в скрипте. Возможно, добавьте некоторые переменные, которые подсчитывают или маркируют этот оператор, и выводят его в обработчик исключений.

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/errors.htm

После того, как вы нашли запрос, который вызывает проблему, преобразовать его в аналогичный запрос с соответствующим group by и having count(*) > 1, так что вы можете увидеть, что данные причиной проблемы. Например, если у вас есть коррелировала подзапрос, который выглядит как:

(select name from names where id=foo.id) 

затем написать подобный запрос

select id from names group by id having count(*) > 1 

для идентификации данных обижая.

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

Смежные вопросы