估计要写个过程来处理,搜一下吧,以前有类似的例子

解决方案 »

  1.   

    解决方案:
    写一个存储过程
    根据数据,动态生成create view ..的语句
    利用触发器进行动态调用SQL> select * from tbname;COL1             COL2       COL3
    ---------- ---------- ----------
    a                   1        123
    a                   2         23
    a                   3         33
    b                   5        456
    b                   3        756
    c                  66          3
    c                  67          3已选择7行。已用时间:  00: 00: 00.60
    SQL> create or replace procedure p_createview(v_sql varchar2) 
      2  as
      3  pragma autonomous_transaction; --注意,此部分为独立事务处理
      4  begin
      5    execute immediate v_sql;
      6  end p_createview;
      7  /过程已创建。已用时间:  00: 00: 01.02
    SQL> create or replace trigger trg_tbname after insert or delete or update on tbname 
      2  declare
      3  v_sql varchar2(4000):='create or replace view v_tbname as select col1,';
      4  cursor cur_name is select distinct col2 from tbname;
      5  begin
      6    for c in cur_name loop
      7       v_sql:=v_sql||'max(decode(col2,'||c.col2||',col3,null)) "'||c.col2||'",';
      8    end loop;
      9       v_sql:=substr(v_sql,1,length(v_sql)-1)||' from tbname group by col1';
     10    p_createview(v_sql);
     11  end trg_tbname;
     12  /触发器已创建已用时间:  00: 00: 00.80
    SQL> insert into tbname values('c',68,3);已创建 1 行。已用时间:  00: 00: 00.80
    SQL> select * from v_tbname;COL1                1          2          3          5         66         67
    ---------- ---------- ---------- ---------- ---------- ---------- ----------
            68
    ----------
    a                 123         23         33
    b                                       756        456
    c                                                               3          3
             3
    已用时间:  00: 00: 00.50
    SQL> OK!有些地方可能不是很合理,如果数据量大的话,自己进一步优化一下
    比如,重新创建view之前进行 检查,看是否需要重新创建view。
      

  2.   

    可使用一个存储过程实现。方法如下: 第一,先找到Col2的全部值。
          第二,再通过一个Cursor把Col2的值全部生成语句。
          第三,创建这个View即可。