求抽取不同用户下不同表数据高效方法

[复制链接]
查看11 | 回复9 | 2008-1-2 17:35:53 | 显示全部楼层 |阅读模式
--实现要求:从表db_aa.db_aa获取满足条件的一个记录集,并逐条获取每条记录中的每列值,同时将逐条获取每条记录中的col1列值通过查询条件来
--抽取其它用户下的不同表的数据后插入到指定的用户下的相应表中
表db_aa.db_aa(col1,col2,col3,col4,col5,col6,col7...)
declare
--定义表行变量
type Rec_table_type is table of db_aa.table1%rowtype;
Var_rows Rec_table_type;
--db_aa用户下的table1表
Var_table1_col1 db_aa.table1.col1%type;--用作查询条件

--定义要抽取相应表中的数据变量
--db_bb用户下的table2表
Var_table2_col1 db_bb.table2.col1%type;
Var_table2_col2 db_bb.table2.col2%type;
--db_bb用户下的table3表
Var_table3_col1 db_bb.table3.col1%type;
Var_table3_col2 db_bb.table3.col2%type;
--db_bb用户下的table4表
Var_table4_col1 db_bb.table4.col1%type;
Var_table4_col2 db_bb.table4.col2%type;
Var_table4_col3 db_bb.table4.col3%type;
Var_table4_col4 db_bb.table4.col4%type;
--db_bb用户下的table5表
Var_table5_col1 db_cc.table5.col1%type;
Var_table5_col2 db_cc.table5.col2%type;
Var_table5_col3 db_cc.table5.col3%type;

begin
--处理该分局下的分局税管员数据

selecta.* BULK COLLECT INTO Var_rowsfrom db_aa.table1 a where ......;

if (Var_rows.count > 0) then

--逐条获取db_aa.table1满足条件的记录,同时通过获取的db_aa.table1表中的col1列查询出其它用户表下的相关数据(问题1:请况这样的处理方式是否可理)

for i in Var_rows.first .. Var_rows.last loop

begin

Var_table1_col1
:= Var_rows.col1(i);



--抽取不同用户下的表中列数据(问题2:请问如果以后的SQL增加时 If Sql%Rowcount = 0 就要增加是否有更简洁的写法处理)

select col1,col2 into Var_table2_col1,Var_table2_col2 from db_bb.table2 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table2_col1:=null;

Var_table2_col2:=null;

endif;

select col1,col2 into Var_table3_col1,Var_table3_col2 from db_bb.table3 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table3_col1:=null;

Var_table3_col2:=null;

endif;


select col1,col2,col3,col4 into Var_table4_col1,Var_table4_col2,Var_table4_col3,Var_table4_col4 from db_bb.table4 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table4_col1:=null;

Var_table4_col2:=null;

Var_table4_col3:=null;

Var_table4_col4:=null;

endif;



select col1,col2,col3 into Var_table5_col1,Var_table5_col2,Var_table5_col3 from db_cc.table5.col1 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table5_col1:=null;

Var_table5_col2:=null;

Var_table5_col3:=null;

endif;



--将抽取的数据插入到相应用户下的不同表中

insert into db_dd(col1,cole2,col3,col4,col5,col6,col7,col8,clo9,col10)

values (Var_table1_col1,Var_rows.col2(i),Var_rows.col3(i),Var_rows.col4(i),Var_rows.col5(i),Var_table2_col1,Var_table2_col2,Var_table3_col1,Var_table3_col2,sysdate);



insert into db_cc(col1,cole2,col3,col4,col5,col6,col7,col8,clo9,col10)

values (Var_table1_col1,Var_rows.col6(i),Var_rows.col7(i),Var_table4_col1,Var_table4_col2,Var_table4_col3,Var_table4_col4,Var_table5_col1,Var_table5_col2,Var_table5_col3);



commit;

end;

end loop;



end if;
end;
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
insert first
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
INSERT WHEN可以根据条件插入到不同表。
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
支持LS做法
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
INSERT WHEN可以根据条件插入到不同表。
-----------------------------------------------
其实在我的要求中用不到INSERT WHEN,因为我的查询条件是从table1获取的集合并把取出的table1.col1,作为table2,table3,table4,table5表r的查询条件,所以这个条件是一样的
表db_aa.db_aa(col1,col2,col3,col4,col5,col6,col7...)
每天会在JOB固定的时间处理以上的方法一次,每次处理的数据在100万的数据量左右;
其中的数据的特点是col1的数据含有相同,同时col1有索引
问题1:对于使用BULK COLLECT后循环逐条处理数据的处理方式是否可理;
问题2:请问如果以后的SQL增加时 相应的If Sql%Rowcount = 0 就要增加是否有更简洁的写法处理
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
同时作为SQL查询条件的db_aa.db_aa中的col1列的数据是不确定数据差异在10万左右
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
说明:db_aa.db_aa指的就是db_aa.table1 ,可以以上说明无意间打错了
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
其实在我的要求中用不到INSERT WHEN, 因为作为SQL查询条件的db_aa.table1中的col1列的数据是不确定数据差异在10万左右;
我的查询条件是从table1获取的集合并通过循环逐条将取出集合中的col1列值,作为table2,table3,table4,table5表的查询条件,每次循环获取的col1列值对于以上四个SQL过滤的条件都是一样的
:
select col1,col2 into Var_table2_col1,Var_table2_col2 from db_bb.table2 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table2_col1:=null;

Var_table2_col2:=null;

endif;

select col1,col2 into Var_table3_col1,Var_table3_col2 from db_bb.table3 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table3_col1:=null;

Var_table3_col2:=null;

endif;


select col1,col2,col3,col4 into Var_table4_col1,Var_table4_col2,Var_table4_col3,Var_table4_col4 from db_bb.table4 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table4_col1:=null;

Var_table4_col2:=null;

Var_table4_col3:=null;

Var_table4_col4:=null;

endif;



select col1,col2,col3 into Var_table5_col1,Var_table5_col2,Var_table5_col3 from db_cc.table5.col1 where code=Var_table1_col1;

If Sql%Rowcount = 0 Then

Var_table5_col1:=null;

Var_table5_col2:=null;

Var_table5_col3:=null;

endif;
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
顶一下,没有更优的实现方法吗?
回复

使用道具 举报

千问 | 2008-1-2 17:35:53 | 显示全部楼层
为什么要用循环呢?你的需求完全可以用两个INSERT...SELECT实现。
Var_rows用col1和其他表的code进行外连接即可。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行