SQL游标问题

时间:2014-01-10 21:37:41

标签: sql oracle oracle11g cursor

我正在尝试使用游标和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。那么我可以做些什么来解决这个问题。

谢谢。

2 个答案:

答案 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);