【问题标题】:SQL cursor issueSQL游标问题
【发布时间】:2014-01-10 21:37:40
【问题描述】:

我正在尝试使用游标和选择语句创建一个新表。

 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 。那么我可以做些什么来解决这个问题。

谢谢。

【问题讨论】:

    标签: sql oracle oracle11g cursor


    【解决方案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 以提取任何其他列的虚拟值。

    【讨论】:

      【解决方案2】:

      根据您的建议,这里是以下块。 宣布 光标 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多