估计要写个过程来处理,搜一下吧,以前有类似的例子
解决方案 »
- oracle去除双休日(精确到小时)
- sql迁移到oracle时的一个怪事
- SSB模型测试oracle怎么建表才能使查询性能最优?
- 各位帮忙,我用TOAD恢复数据库,有一些模糊的问题需要弄清,帮忙啊
- 如何在sql*plus执行存储过程,谢谢—求高人
- 100分改错update 问题
- 在oracle10g中怎样可视化的创建数据库,就像在sql server中那样
- ▲▲一个存储过程的特殊参数如何传递?,来者有分▲▲
- 经过大家指教,但是我的Oracle 9i还是有问题???!!!
- 表空间的问题,帮帮忙!!!!!
- 如何修改Oracle数据库的服务名称?
- 抱怨!抱怨!抱怨!oracle要自己手写视图!!!!
写一个存储过程
根据数据,动态生成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。
第二,再通过一个Cursor把Col2的值全部生成语句。
第三,创建这个View即可。