用于记录的一半设定值(甲骨文,PL / SQL)

问题描述 投票:0回答:2

我试图从循环TableA的和记录的一半建立了columnA = 1,对于记录columnA = 2下半场我的所有记录。

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;

在这里,我没有得到任何记录

sql oracle loops plsql oracle12c
2个回答
2
投票
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;

0
投票
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;
© www.soinside.com 2019 - 2024. All rights reserved.