Способ записи данных, вызывающих ошибки в материализованном представлении Oracle? - PullRequest
0 голосов
/ 13 сентября 2011

Мы создали несколько материализованных представлений, которые отлично работали с копией реальных данных приложения.Приложение не контролирует свои собственные данные.С тех пор некоторые пользователи, возможно, были либо небрежны, либо креативны при вводе данных.Mview сейчас задыхается и умирает.Сообщения об ошибках указывают на то, что мы получаем несколько строк, возвращаемых одной или несколькими функциями.

Мы пытались использовать ИСКЛЮЧЕНИЯ - с некоторым успехом в DBMS_Output для первого ряда object_id, который приводит к сбою (одной из) функций,Было бы лучше иметь возможность выполнить прогон для MView и зарегистрировать object_ids, которые вызывают проблемы у каждой функции.Нам не удалось вставить данные исключений в таблицу.

Платформа - Oracle 10g2.Я пытался втиснуть DML Error Logging в мою голову.Я понимаю, что это должно работать для данных BULK, и я предполагаю, что создание материализованного представления будет приемлемым.Было бы это работать для MViews?Это лучший способ?

1 Ответ

1 голос
/ 13 сентября 2011

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

Потенциально, вы можете заполнить эту таблицу вручную, а затем создать материализованное представление для этой готовой таблицы . Это может создать проблемы в зависимости от того, как именно используется материализованное представление и какие виды перезаписи запросов включены, поскольку в построенной таблице будут отсутствовать некоторые данные из базовой таблицы (строки, записанные в журнал ошибок).

Создать таблицу и журнал ошибок

SQL> create table t (
  2    col1 number,
  3    col2 number
  4  );

Table created.

Elapsed: 00:00:00.00

SQL> ed
Wrote file afiedt.buf

  1  begin
  2    dbms_errlog.create_error_log( 'T', 'T_ERR' );
  3* end;
SQL> /

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
SQL> create function f1
  2    return varchar2
  3  is
  4  begin
  5    return 'A';
  6  end;
  7  /

Function created.

Попробуйте вставить 10 строк. 3 не удастся, потому что LEVEL будет кратным 3 и строка, возвращаемая функцией, не может быть преобразована в число

Elapsed: 00:00:00.01
SQL> insert into t( col1, col2 )
  2    select level,
  3           (case when mod(level,3) = 0
  4                 then to_number( f1 )
  5                 else mod(level,3)
  6             end)
  7      from dual
  8   connect by level <= 10
  9       log errors into t_err
 10           reject limit unlimited;

7 rows created.

Elapsed: 00:00:00.01

SQL> ed
Wrote file afiedt.buf

  1  select ora_err_mesg$, col1, col2
  2*   from t_err
SQL> /

ORA_ERR_MESG$                  COL1       COL2
------------------------------ ---------- ----------
ORA-01722: invalid number      3          0
ORA-01722: invalid number      6          0
ORA-01722: invalid number      9          0

Elapsed: 00:00:00.00

Теперь используйте эту готовую таблицу, чтобы создать материализованное представление

SQL> ed
Wrote file afiedt.buf

  1  create materialized view t
  2      on prebuilt table
  3  as
  4  select 1 col1, 1 col2
  5*   from dual
SQL> /

Materialized view created.

Elapsed: 00:00:00.11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...