Знатоки баз данных узнают имя Oracle как мощную силу в мире реляционных систем управления базами данных (СУБД). Oracle производит очень мощные решения для СУБД на протяжении десятилетий и остается лидером в этой области. Многие конечные пользователи продуктов баз данных могут быть сбиты с толку или озадачены, когда они используют готовое решение, а оно выдает сообщение об ошибке. Одним из распространенных сообщений об ошибке, выдаваемых Oracle, является ошибка ORA-06512.
Содержание
Oracle — это система управления базами данных, которая существует уже сорок лет в различных формах. Первоначально она использовала схему SCOTT, названную в честь одного из первых сотрудников Oracle. Вы даже впервые вошли в Oracle с именем пользователя «scott» и паролем «tiger», названным в честь кота Скотта. Сейчас существует несколько схем, используемых в зависимости от того, для чего вы используете Oracle.
Если вы хотите узнать больше о Oracle с нуля, эта страница очень полезна .
Исправление ошибок ORA-06512
В Oracle ошибка ORA-06512 — это ошибка общего исключения, которая говорит вам, где что-то идет не так. Это одна из наименее специфичных ошибок, выдаваемых Oracle, поскольку она сообщает только о наличии проблемы, но не о том, что именно идет не так.
Например, типичное сообщение об ошибке может выглядеть так:
«ORA-01422: exact fetch returns more than requested number of rows
ORA-06512: at «DATABASE_NAME», line 66
ORA-06512: at line 1′′
Первая строка говорит о типе ошибки, в данном случае запрос возвращает больше данных, чем ожидает запрос, поэтому он не знает, как это обработать. Код ‘ORA-01422’ — это фактический код ошибки, на который вам нужно обратить внимание. ORA-06512 — это просто общий код ошибки.
Вторая строка говорит вам, где происходит ошибка. DATABASE_NAME — это имя базы данных, в которой вы работаете в данный момент. Строка 66 — это строка, в которой происходит ошибка, и именно ее нужно проверить, чтобы исправить ошибку.
Третья строка в синтаксисе ошибки говорит вам, откуда происходит вызов. Проверьте первую строку и вы увидите обращение к DATABASE_NAME.
Чтобы исправить эту конкретную ошибку, вам нужно исправить проблему, вызванную ORA-01422, а именно ‘exact fetch возвращает больше запрошенного количества строк’ или добавить обработчик исключений, чтобы сказать Oracle игнорировать ее. Поскольку исправление основной проблемы всегда предпочтительнее, то лучше поступить следующим образом.
Вы можете сделать две вещи. Если вы ожидаете, что запрос вернет больше одной строки, вы можете изменить его так, чтобы он не был удивлен. Если вы ожидаете, что запрос вернет только одну строку, вы можете изменить его и для этого.
Ожидая больше одной строки:
for X in ( select * from t where … )
loop
— обработать запись X здесь
end loop;
Это должно устранить ошибку в запросах к базе данных, где возвращается более одной строки.
Если вы ожидаете возврата только одной строки, вы можете попробовать:
begin
select * into ….
from t where ….
process….
exception
when NO_DATA_FOUND then
error handling code when no record is found
when TOO_MANY_ROWS then
error handling code when too many records are found
end;
Этот второй метод должен доставить только один ряд без выброса ошибки ‘ORA-01422: exact fetch returns more than requested number of rows’ и, следовательно, оригинальной ошибки ORA-06512.
Вы также можете изменить запрос так, чтобы он возвращал только первую строку ответа из нескольких строк. Это может сработать, если у вас нет полного контроля над базой данных или вы не хотите сильно возиться, но ответ все равно нужен.
declare
c1 cursor for select * from t where …
begin
open c1;
fetch c1 into ….
if ( c1%notfound ) then
error handling for no record found
end if;
close c1;
end;
(Если вы знаете SQL, вас могут немного смутить эти командные строки… Oracle использует не Transact-SQL, а собственное процедурное расширение языка SQL, PL/SQL. Хотя он похож на Transact-SQL, PL/SQL делает много умных вещей и является очень мощным инструментом сам по себе. Вы можете найти этот FAQ по PL/SQL полезным при попытке изучить Oracle.)
Итак, основной урок заключается в том, что ошибка ORA-06512, сама по себе, не является чем-то, что вы можете исправить напрямую. Вместо этого вы должны выяснить, в чем собственно заключается ошибка, о чем вам расскажут другие коды ошибок, а затем устранить эти ошибки одну за другой.
У вас есть советы или рекомендации по Oracle, которыми вы можете поделиться? Расскажите нам о них в комментариях!