SQL游标问题

SQL游标问题,sql,oracle,oracle11g,cursor,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

我正在尝试使用游标和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中商店覆盖的小多边形之间的重叠区域。该区域称为总面积。我正在尝试将此门店编号和总面积传递到临时道具面积表中

但我不能这样做,因为在我的光标类型中,我只有store_编号。那么我该怎么做才能解决这个问题呢


谢谢。

我不太清楚您在做什么,但问题似乎是您的
c1\u列表
没有列来放置
总面积
?如果是这样,您可以通过在光标中选择虚拟列来强制:

 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;
但是您没有利用批量插入,这是一个遗憾,因为您已经在使用
批量收集
。如果根据新表定义集合,则可以使用
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\u prop\u区域
只有这两列,按顺序排列;如果没有,则需要调整
选择
以提取任何其他列的虚拟值。

根据您的建议,下面是一个块。 声明 光标c1为 选择门店号,0作为总门店面积 从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;
在最后一部分中,我想把它们分成两个表,一个表中的所有值的总面积为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);