Как определить ошибку броска строки/значения в МН / SQL-ОПЕРАТОРЕ?

Часто это из-за того, что новое диалоговое окно соединения находится за пределами экрана (обычно из-за изменения настроек монитора, например, 1-2 мониторов или изменения разрешения и т. Д.).

Если это так, то простое исправление :

  1. Alt Tab для SSMS
  2. Alt + Space - контекстное меню
  3. M - выберите Переместить (в контекстном меню за пределами экрана)
  4. Клавиши со стрелками - чтобы переместить его обратно на экран

Согласно ответам здесь из @Eirik Тофт и здесь от @Lee Chetwynd

7
задан JJ. 3 June 2009 в 15:34
поделиться

6 ответов

Решение, использующее предложение 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 в этом чехол.

2
ответ дан 7 December 2019 в 10:06
поделиться

Это можно сделать с помощью журнала ошибок 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

4
ответ дан 7 December 2019 в 10:06
поделиться

попробуйте вывести свою ошибку и посмотрите, дает ли она вам информацию, которую вы ищете. Например:

EXCEPTION
    WHEN OTHERS
    THEN
      DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
0
ответ дан 7 December 2019 в 10:06
поделиться

Попробуйте это (не проверено):

    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;
0
ответ дан 7 December 2019 в 10:06
поделиться

Для получения более подробной информации о том, как исполнение достигло рассматриваемой строки, вы можете попробовать отобразить вывод, возвращаемый этими функциями:

  • DBMS_UTILITY.format_error_stack :

    Отформатируйте текущий стек ошибок. Это можно использовать в обработчиках исключений для просмотра полного стека ошибок.

  • DBMS_UTILITY.format_error_backtrace :

    Отформатируйте трассировку от точки текущей ошибки до обработчика исключения, в котором была обнаружена ошибка. Строка NULL возвращается, если в настоящее время не обрабатывается никакая ошибка.

0
ответ дан 7 December 2019 в 10:06
поделиться

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;
0
ответ дан 7 December 2019 в 10:06
поделиться
Другие вопросы по тегам:

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