Часто это из-за того, что новое диалоговое окно соединения находится за пределами экрана (обычно из-за изменения настроек монитора, например, 1-2 мониторов или изменения разрешения и т. Д.).
Если это так, то простое исправление :
Согласно ответам здесь из @Eirik Тофт и здесь от @Lee Chetwynd
Решение, использующее предложение SAVE EXCEPTIONS:
SQL> create table my_table (my_column)
2 as
3 select level from dual connect by level <= 9
4 /
Table created.
SQL> create function do_something
2 ( p_my_column in my_table.my_column%type
3 ) return my_table.my_column%type
4 is
5 begin
6 return 10 + p_my_column;
7 end;
8 /
Function created.
SQL> alter table my_table add check (my_column not in (12,14))
2 /
Table altered.
SQL> declare
2 e_forall_error exception;
3 pragma exception_init(e_forall_error,-24381)
4 ;
5 type t_my_columns is table of my_table.my_column%type;
6 a_my_columns t_my_columns := t_my_columns()
7 ;
8 begin
9 select my_column
10 bulk collect into a_my_columns
11 from my_table
12 ;
13 forall i in 1..a_my_columns.count save exceptions
14 update my_table
15 set my_column = do_something(a_my_columns(i))
16 where my_column = a_my_columns(i)
17 ;
18 exception
19 when e_forall_error then
20 for i in 1..sql%bulk_exceptions.count
21 loop
22 dbms_output.put_line(a_my_columns(sql%bulk_exceptions(i).error_index));
23 end loop;
24 end;
25 /
2
4
PL/SQL procedure successfully completed.
Для очень больших наборов данных вы, вероятно, не захотите увеличивать память PGA, поэтому обязательно используйте предложение LIMIT в этом чехол.
Это можно сделать с помощью журнала ошибок DML, если вы используете 10gR2 или новее.
Пример:
SQL> create table my_table (my_column)
2 as
3 select level from dual connect by level <= 9
4 /
Tabel is aangemaakt.
SQL> create function do_something
2 ( p_my_column in my_table.my_column%type
3 ) return my_table.my_column%type
4 is
5 begin
6 return 10 + p_my_column;
7 end;
8 /
Functie is aangemaakt.
SQL> alter table my_table add check (my_column not in (12,14))
2 /
Tabel is gewijzigd.
SQL> exec dbms_errlog.create_error_log('my_table')
PL/SQL-procedure is geslaagd.
Это создает таблицу регистрации ошибок с именем err $ _my_table . Эта таблица заполняется путем добавления предложения об ошибках журнала в оператор обновления:
SQL> begin
2 update my_table
3 set my_column = do_something(my_column)
4 where my_column is not null
5 log errors reject limit unlimited
6 ;
7 end;
8 /
PL/SQL-procedure is geslaagd.
SQL> select * from err$_my_table
2 /
ORA_ERR_NUMBER$
--------------------------------------
ORA_ERR_MESG$
--------------------------------------------------------------------
ORA_ERR_ROWID$
--------------------------------------------------------------------
OR
--
ORA_ERR_TAG$
--------------------------------------------------------------------
MY_COLUMN
--------------------------------------------------------------------
2290
ORA-02290: check constraint (RWK.SYS_C00110133) violated
AAGY/aAAQAABevcAAB
U
12
2290
ORA-02290: check constraint (RWK.SYS_C00110133) violated
AAGY/aAAQAABevcAAD
U
14
2 rijen zijn geselecteerd.
До 10gR2 вы можете использовать предложение SAVE EXCEPTIONS: http://rwijk.blogspot.com/2007/11/save-exceptions .html
попробуйте вывести свою ошибку и посмотрите, дает ли она вам информацию, которую вы ищете. Например:
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
Попробуйте это (не проверено):
DECLARE
cursor c1 is
select key_column, my_column
from my_table
WHERE my_column IS NOT NULL
ORDER BY key_column;
my_table_rec my_table%ROWTYPE;
BEGIN
FOR my_table_rec in c1
LOOP
UPDATE my_table SET my_column = do_something(my_column)
WHERE key_column = my_table_rec.key_column;
END LOOP;
EXCEPTION
when others then
insert into log_error (msg) values ('Error updating key_column: ' || my_table_rec.key_column || ', my_column: ' || my_table_rec.my_column);
END;
Для получения более подробной информации о том, как исполнение достигло рассматриваемой строки, вы можете попробовать отобразить вывод, возвращаемый этими функциями:
DBMS_UTILITY.format_error_stack
:
Отформатируйте текущий стек ошибок. Это можно использовать в обработчиках исключений для просмотра полного стека ошибок.
DBMS_UTILITY.format_error_backtrace
:
Отформатируйте трассировку от точки текущей ошибки до обработчика исключения, в котором была обнаружена ошибка. Строка NULL возвращается, если в настоящее время не обрабатывается никакая ошибка.
PL / SQL определяет 2 глобальные переменные для ссылки на ошибки:
SQLERRM: Сообщение об ошибке SQL
SQLERRNO: Номер ошибки SQL
Это можно прочитать в блоке EXCEPTION в вашем PL / SQL.
DECLARE
x number;
BEGIN
SELECT 5/0 INTO x FROM DUAL;
EXCEPTION
WHEN OTHERS THEN:
dbms_output.put_line('Error Message: '||SQLERRM);
dbms_output.put_line('Error Number: '||SQLERRNO);
END;