之前有人是这样设计的,没有用表分区来弄,就是有一张系统日志表 sys_log (当前月的数据)以前的数据以日期命名表来分表。
sys_log_201802.....sys_log_201801.................... sys_log_201712
现在我想实现用一个视图把这些所有的表union 起来,但是后面这些表还会增加,有没有什么办法可以时行判断有这个表就加进去。?求助各位大侠。。

解决方案 »

  1.   

    用job 定时查询 然后insert 到一张表。
    或者用物化视图看看能不能行
      

  2.   

    或者考虑用动态sql,根据你的日期条件,拼接对应的日志表。
      

  3.   

    这个动态SQL怎么写?
      

  4.   

    /*******************************************************  
      author:zuozewei  
      time  :2018/03/22 
      功能:抽取当前所有'HIS_YC_'前缀表指定列建立视图 
      eg:exec bulid_his_hc_view();  
    ********************************************************/  
     
     
    create or replace procedure bulid_his_hc_view is
      v_viewname  varchar2(50);
      v_sql       varchar2(500); --视图名称变量
      l_query     long;
      l_query_1   long;
      l_query_SQL long; --创建SQL语句变量
     
     
    begin
      v_viewname := 'view_yc_tables'; --定义视图名称
     
     
      v_sql := 'create or replace view ' || v_viewname || ' as ';
      for x in (select u.table_name from user_tables u where u.table_name like 'HIS_YC_%') --循环取出当前所有表名
       loop
        --拼接SQL语句
        l_query := l_query ||' UNION ALL SELECT OCCUR_TIME 产生时间,TO_CHAR(OCCUR_TIME / (60 * 60 * 24) + TO_DATE(''1970-01-01 08:00:00'',''YYYY-MM-DD HH24:MI:SS''),''YYYY-MM-DD'') 日期,''GK''||DEV_ID 关口编号,DEV_ID 电能表编号,IA_VALUE A相电流,UA_VALUE A相电压,IB_VALUE B相电流,UB_VALUE B相电压,IC_VALUE C相电流,UC_VALUE C相电压,FACTOR_VALUE 功率因数  FROM ' ||x.table_name || '';
      end loop;
      l_query_1   := substr(l_query, 11);
      l_query_SQL := v_sql || l_query_1;
      --打印拼接SQL
      dbms_output.put_line(l_query_SQL);
      --执行SQL
      execute immediate l_query_SQL;
      commit;
    end bulid_his_hc_view;
      

  5.   

    提示一个思路吧,以下内容,应该可以获取所有您需要的表。然后用动态SQL实现。也可能需要用管道函数。
    SELECT TABLE_NAME FROM USER_TABLES WHERE TABLE_NAME LIKE 'SYS_LOG%'