Эти ошибки обычно вызваны другой серьезной ошибкой, например ошибкой ORA-600. Проблема настолько серьезная, что серверный процесс разбился и даже не мог отправить правильное сообщение об ошибке клиенту. (Другой распространенной причиной этих ошибок является сетевое отключение, вызванное SQLNET.EXPIRE_TIME или другим процессом, который убивает старые сеансы.)
Посмотрите на журнал предупреждений, чтобы узнать исходное сообщение об ошибке.
Найдите файл alert_ [name] .log в этом каталоге: select value from v$parameter where name = 'background_dump_dest';
После того, как вы найдете конкретное сообщение об ошибке и подробную информацию, перейдите на страницу support.oracle.com. Используйте «инструмент ora-600», а затем найдите первое число после сообщения ORA-600.
Обычно для этого типа ошибки ORA-600 будет одна или несколько статей. Используйте точную версию и платформу, чтобы сузить список возможных ошибок. (Но не удивляйтесь, если «Версии, затронутые» в этой статье, неверны. Требования Oracle к «исправлены в версии xy» не всегда верны.)
В статьях обычно объясняются более подробно, как проблема, возможные обходные пути и решение, которое обычно включает исправление или обновление.
На практике редко вы хотите решить эти проблемы. «Типичный» совет - обратиться в службу поддержки Oracle, чтобы убедиться, что у вас действительно есть одна и та же проблема, получить патч, получить разрешение и скрыть среду (ы), а затем применить патч. А потом, вероятно, поймите, что патч не работает. Поздравляем, вы просто потратили много времени.
Вместо этого вы обычно можете избегать проблемы с тонким изменением запроса или процедуры. В Oracle есть много возможностей, почти всегда есть другой способ сделать это. Если код окажется немного странным, добавьте комментарий, чтобы предупредить будущих программистов: «Этот код выглядит странным, чтобы избежать ошибки X, которая должна быть исправлена в версии Y.»
Если это действительно ваша целая процедура, вы должны заменить ее на что-то вроде этого:
insert into local.tab3(col1, col2, col3, col4)
select tab1.col1, tab1.col2, tab2.col1, tab2.col2
from tab1@dblink1 tab1
join tab2@dblink1 tab2
on tab1.col1 = tab2.col1
and tab1.col2 = tab2.col2;
В общем, вы всегда должны делать что-то в SQL, если это возможно. Особенно, если вы можете избежать открытия многих курсоров. И особенно , если вы можете избежать открытия многих курсоров в удаленной базе данных.
Можно также сделать это этот путь:
select columnproperty(object_id('mytable'),'mycolumn','IsIdentity')
Возвраты 1, если это - идентификационные данные, 0 если нет.
sp_help tablename
В выводе ищут что-то вроде этого:
Identity Seed Increment Not For Replication
----------- ------- ------------ ----------------------
userid 15500 1 0
Корректируйтесь WHERE
пункт для удовлетворения:
select
a.name as TableName,
b.name as IdentityColumn
from
sysobjects a inner join syscolumns b on a.id = b.id
where
columnproperty(a.id, b.name, 'isIdentity') = 1
and objectproperty(a.id, 'isTable') = 1