我正在尝试使用游标和select语句创建一个新表。
Declare
Cursor c1 is
select store_number from table1 where CLIENT_ID= 1 and ORG_ID = 1 ;
Type C1_TAB_TYPE is table of c1%ROWTYPE;
c1_list c1_TAB_TYPE;
Begin
For r1 in c1
Loop
select store_number
BULK COLLECT INTO c1_list from
(
SELECT store_number,
( (SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(a.geometry,b.geometry, 0.005), 0.005, 'unit=sq_mile') /SDO_GEOM.SDO_AREA((a.geometry), 0.005, 'unit=sq_mile'))*100) Total_area
FROM table2 a, table1 b
Where store_number != r1.store_number
AND sdo_relate(a.geometry, b.geometry, 'mask=anyinteract') = 'TRUE');
For i in 1..c1_list.count loop
insert into temp_Prop_area
(STORE_NUMBER,TOTAL_AREA)
values (r1.store_number,Total_Area);
End Loop;
End Loop;
End;
这里我使用商店号码传递给游标。现在有一个商店号码,我检查想要获得每个商店的多边形与商店覆盖的表1中的小多边形之间的重叠区域。该区域称为Total_area。我试图将此商店编号和总面积传递到temp_Prop_area表。
但是我无法做到,因为在我的光标类型中我只有store_number。那么我可以做些什么来解决这个问题。
谢谢。
答案 0 :(得分:1)
我不确定我完全明白你在做什么,但问题似乎是你的c1_list
没有专栏来放置Total_Area
?如果是这样,您可以通过在光标中选择虚拟列来强制执行此操作:
Declare
Cursor c1 is
select store_number, 0 as total_area
from table1 where CLIENT_ID= 1 and ORG_ID = 1 ;
Type C1_TAB_TYPE is table of c1%ROWTYPE;
c1_list c1_TAB_TYPE;
然后你可以选择:
...
Loop
select store_number, total_area
BULK COLLECT INTO c1_list from
...
For i in 1..c1_list.count loop
insert into temp_Prop_area
(STORE_NUMBER,TOTAL_AREA)
values (c1_list(i).store_number,c1_list(i).Total_Area);
End Loop;
End Loop;
End;
但是你没有利用批量插入,这是一种耻辱,因为你已经在使用bulk collect
。如果您根据新表定义集合,则可以使用forall
。
Declare
Cursor c1 is
select store_number
from table1 where CLIENT_ID= 1 and ORG_ID = 1 ;
Type C1_TAB_TYPE is table of temp_prop_area%ROWTYPE;
c1_list c1_TAB_TYPE;
...
Loop
select store_number, total_area
BULK COLLECT INTO c1_list from
...
Forall i in 1..c1_list.count
insert into temp_Prop_area
values c_list(i);
End Loop;
End;
这假设您的temp_prop_area
按此顺序只有这两列;如果不是,您需要调整select
以为任何其他列提取虚拟值。
答案 1 :(得分:0)
根据您的建议,这里是以下块。 宣布 光标c1是 选择store_number,0作为total_area 来自TMCS.TMCS_All_Stores_TA,其中CLIENT_ID = 1且ORG_ID = 1;
Type C1_TAB_TYPE is table of c1%ROWTYPE;
c1_list c1_TAB_TYPE;
Begin
For r1 in c1
Loop
select store_number,total_area
BULK COLLECT INTO c1_list from
(
SELECT store_number,
( (SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(a.geometry,b.geometry, 0.005), 0.005, 'unit=sq_mile') /SDO_GEOM.SDO_AREA((a.geometry), 0.005, 'unit=sq_mile'))*100) Total_area
FROM TMCS.TMCS_BG_STI_DATA a, TMCS.TMCS_All_Stores_TA b
Where store_number != r1.store_number
AND sdo_relate(a.geometry, b.geometry, 'mask=anyinteract') = 'TRUE');
For i in 1..c1_list.count loop
insert into TMCS.temp_Prop_area
values c1_list(i);
End Loop;
End Loop;
End;
现在在最后一部分中,我实际上希望它们分成两个表。一个表将包含所有值为total_area为100的值,另一个表将包含其余不为100的值。所以它可能是或者可能它会更精细调整
if total_area=100
then
For i in 1..c1_list.count loop
insert into TMCS.temp_Prop_area_100
values c1_list(i);
End Loop;
else if
For i in 1..c1_list.count loop
insert into TMCS.temp_Prop_area_block
values c1_list(i);