代码之家  ›  专栏  ›  技术社区  ›  4est

一半记录的设置值(Oracle、PL/SQL)

  •  0
  • 4est  · 技术社区  · 6 年前

    declare
    
    Type T2 Is Table Of TableA%Rowtype Index By Binary_Integer;
    V2 T2;
    Type T3 Is Table Of TableA%Rowtype Index By Binary_Integer;
    V3 T3;
    
    Maxrow Number(10);
    mHalf  Number(10);
    begin
    
     Select round(Max(Rownum)/2) Into Maxrow From TableA;
    
     Select * Bulk Collect Into V2 From TableA Where Rownum < Mhalf;
     Select * Bulk Collect Into V3 From TableA Where Rownum >= Mhalf;
    
     For I In 1..2 Loop
       If I=1 Then          
          For Z In V2.First..V2.Last Loop
             update tableA set columnA = 1 where Rownum = V2(Z);
          End Loop;
       Elsif I=2 Then
          For ZZ In V3.First..V3.Last Loop
             update tableA set columnA = 2 where Rownum = V3(ZZ);
          End Loop;
       End if;       
    
     End Loop;    
    end;
    

    但有点不对劲。当我检查时:

    Select Count(*) From tableA Where Rownum > 300;
    

    这里我没有任何记录

    2 回复  |  直到 6 年前
        1
  •  2
  •   Ted at ORCL.Pro Marimuthu Palanisamy    6 年前
    declare 
      mHalf  Number; 
      l_rec TableA%rowtype; 
      cntr NUMBER := 1; 
      CURSOR cur IS Select * From TableA FOR UPDATE OF columnA; 
    begin 
    
     Select round(count(*)/2,0) Into mHalf From TableA; 
    
    OPEN cur; 
      LOOP 
        FETCH cur INTO l_rec; 
            EXIT WHEN cur%notfound; 
        UPDATE 
          tableA 
        SET 
          columnA=CASE WHEN cntr <= mhalf then 1 else 2 end 
        WHERE 
          CURRENT OF cur; 
        cntr := cntr +1;       
      END LOOP; 
    
      Commit; 
    
    end;
    
        2
  •  0
  •   q4za4    6 年前
    Select * Bulk Collect Into V2 From TableA Where Rownum < Mhalf;
     Select * Bulk Collect Into V3 From TableA Where Rownum >= Mhalf;
    

    改为:

    SELECT  * 
    BULK COLLECT INTO V2
    FROM    (
             SELECT a.*,
                    ROWNUM rn 
             FROM   (
                      SELECT  *
                      FROM    tablea
                    ) a
            )
    WHERE   rn < Mhalf;
    
    SELECT  * 
    BULK COLLECT INTO V#
    FROM    (
             SELECT a.*,
                    ROWNUM rn 
             FROM   (
                      SELECT  *
                      FROM    tablea
                    ) a
            )
    WHERE   rn >= Mhalf;