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

一半记录的设置值(Oracle、PL/SQL),sql,oracle,loops,plsql,oracle12c,Sql,Oracle,Loops,Plsql,Oracle12c,我正在尝试循环表A中的所有记录,为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

我正在尝试循环表A中的所有记录,为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;
这里我没有任何记录

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;
改为:

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;
改为:

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;


对于V2,您可以按rownum desc订购;从表格A L中选择Rownum,L.*,其中Rownum<300按Rownum desc排序--不工作HMMM,我正在准备一个带有游标的解决方案,或者某些内容错误:PLS-00394:FETCH语句的INTO列表中的值数目错误。对于V2,我有,您可以按rownum desc订购;从表格A L中选择Rownum,L.*,其中Rownum<300按Rownum desc排序--不工作HMMM,我正在准备一个带有光标的解决方案,或者有什么错误:PLS-00394:FETCH语句的INTO列表中的值数目错误我尝试过但不工作…..从SELECT a中选择**,从tableA中选择ROWNUM rn,其中rn<2;FINEAnswer是否已更新,请立即尝试。很抱歉,它不起作用,anway thx寻求帮助,已@Ted在ORCL。Pro正在工作。greatI已尝试,但不工作…..从选择a中选择*。*从表a中选择ROWNUM rn,其中rn<2;FINEAnswer已更新,请立即尝试。很抱歉,它不起作用,anway thx寻求帮助,已经@Ted在ORCL。Pro在Rownum>300的情况下工作得很好;将永远不会返回任何行:测试大于正整数的ROWNUM值的条件总是错误的是,来自@Ted at ORCL.Pro的代码是精细的,但是PL/SQL在这里完全是一种过火的行为。这只需一个简单的更新语句即可完成。请演示如何执行更新,谢谢!更新表a集合列a=modrownum,2+1,其中Rownum>300;将永远不会返回任何行:测试大于正整数的ROWNUM值的条件总是错误的是,来自@Ted at ORCL.Pro的代码是精细的,但是PL/SQL在这里完全是一种过火的行为。这只需一个简单的更新语句即可完成。请演示如何执行更新,谢谢!更新表a集合列a=modrownum,2+1
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;