0

我们创建了一些针对实际应用数据副本运行良好的物化视图。该应用程序不会监管自己的数据。从那时起,一些用户可能在他们的数据输入中要么粗心大意,要么有创意。Mview 现在窒息而死。错误消息表明我们正在从一个或多个函数返回多行。

我们一直在尝试使用 EXCEPTIONS ——在 DBMS_Output 上取得了一些成功,第一行 object_id 导致(其中一个)函数失败。最好能够完成 MView 的运行,并记录导致每个函数出现问题的 object_ids。我们还没有成功地将异常数据插入到表中。

平台是Oracle 10g2。我一直试图将 DML Error Logging 塞进我的脑海。我知道这应该适用于 BULK 数据,并且我假设创建一个物化视图是合格的。这对 MViews 有用吗?这是最好的方法吗?

4

1 回答 1

1

如果您只是尝试刷新物化视图,我不知道使用 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
于 2011-09-13T18:57:29.650 回答