首页 文章

在Oracle物化视图中记录导致错误的数据的方法?

提问于
浏览
0

我们创建了一些物化视图,可以对照实际应用数据的副本 . 该应用程序不会监控自己的数据 . 从那时起,一些用户可能在他们的数据输入中粗心或有创意 . Mview现在窒息死亡 . 错误消息表明我们从一个或多个函数返回多行 .

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

平台是Oracle 10g2 . 我一直试图将DML错误记录塞进我的脑海 . 我知道这应该适用于BULK数据,我假设创建物化视图符合条件 . 这对MViews有用吗?这是最好的方法吗?

1 回答

  • 1

    如果您只是尝试刷新物化视图,我不知道如何使用DML错误日志记录来捕获所有问题行 . 另一方面,您可以创建一个表并在填充表时使用DML错误日志记录来捕获刷新实例化视图时遇到的所有错误 .

    可能您可以手动填充此表,然后create a materialized view on this prebuilt table . 这可能会产生问题,具体取决于物化视图的确切使用方式以及启用了哪种查询重写,因为您构建的表将丢失基础表中的一些数据(写入错误日志的行) .

    创建表和错误日志

    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
    

相关问题