IF 条件 THEN
    EXECUTE IMMEDIATE 'TRUNCATE 备份表1';
    INSERT INTO 备份表1 SELECT * FROM 表1;
    COMMIT;
    EXECUTE IMMEDIATE 'TRUNCATE 表1';
    BEGIN
          EXECUTE IMMEDIATE 'DROP 索引1';
          EXCEPTION
              WHEN OTHERS THEN
                  NULL;    
    END;
    BEGIN
          INSERT INTO 表1
          SELECT 字段... FROM 表...;
          COMMIT;
          DELETE FROM 表1 WHERE 字段1 IS NULL;
          DELETE FROM 表1 WHERE 字段2 IS NULL;
          COMMIT;
          DBMS_STATS.gather_table_stats(……);
          BEGIN
                  EXECUTE IMMEDIATE 'CREATE 索引1 NOLOGGING TABLESPACE "INDEX"'
                  DBMS_STATS.gather_index_stats(……);
                  EXCEPTION
                       WHEN OTHERS THEN
                             NULL;    
          END;
          INSERT INTO 日志表1;
          COMMIT;
          EXCEPTION
              WHEN OTHERS THEN --恢复
              V_ERROR_MESSAGE := 'OTHER ERROR: '||substr(sqlerrm(SQLCODE),1,255);
              INSERT INTO 日志表1;
              EXECUTE IMMEDIATE 'TRUNCATE 表1';
              INSERT INTO 表1 SELECT * FROM 备份表1;
              COMMIT;
              DBMS_STATS.gather_table_stats(……);
              BEGIN
                     EXECUTE IMMEDIATE 'CREATE 索引1 NOLOGGING TABLESPACE "INDEX"';
                     DBMS_STATS.gather_index_stats(……);
                     EXCEPTION
                          WHEN OTHERS THEN
                                NULL;    
              END;
      END;
END IF;
------------------------------------
提问:1、恢复前的那个Exception(红色标注的),会由哪些操作触发呢?
      2、为什么对表1插入数据后紧接着分析表1呢?分析有什么用,分析的结果在哪?同理,为什么创建索引后接着分析该索引呢?
      3、创建索引时加的NOLOGGING TABLESPACE "INDEX"有什么用处?

解决方案 »

  1.   

    分析表和索引是为了让oracle在查询时候制定更加确切的执行计划,
    分析表后会在user_tables,还有user_indexes等其他系统表里面生产相应的数据。
    你可以简单的新建一张表,然后查看user_tables表,然后在插入一些数据,
    再分析表,然后在查看user_tables,对比一下前后的差别就明白了。
      

  2.   

    嗯,那那个Exception会由上面哪些操作触发呢
      

  3.   

    只要Exception上面抛出了任何异常就要执行Exception后的操作~