繁体   English   中英

foreach表中的每一行并更新我的ROW_NUMBER列

[英]foreach rows of my table and update my ROW_NUMBER column

我想创建一个脚本pl / sql,可以在其中修改列ROW_NUMBER的值(第一次ROW_NUMBER的值等于NULL)。

这是我的表“ A”的结构:

CREATE TABLE A
   (
    "NAME" VARCHAR2(25 BYTE), 
    "NUM" NUMBER(10,0)
   )

我想遍历表A的所有行,如果列“ NAME”等于“ DEB”,则将列“ NUM”增加1。

我想得到这样的结果:

在此处输入图片说明

我创建了一个pl / sql脚本:

DECLARE
 INcrmt NUMBER(4):=1;
 line WORK_ODI.TEST_SEQ%ROWTYPE;--before fetch it returns 0
 CURSOR c_select IS
 SELECT ROW_NUMBER,VALUE FROM WORK_ODI.TEST_SEQ;
BEGIN
 OPEN c_select;
  LOOP
   FETCH c_select INTO line;
   DBMS_OUTPUT.PUT_LINE(line.VALUE);
   if line.VALUE like '%DEB%'
   then
    UPDATE WORK_ODI.TEST_SEQ SET ROW_NUMBER = INcrmt WHERE VALUE=line.VALUE;
    INcrmt := INcrmt + 1;
   end if;
   if line.VALUE not like '%DEB%'
    then
    UPDATE WORK_ODI.TEST_SEQ SET ROW_NUMBER = INcrmt WHERE VALUE=line.VALUE;
   end if;
   EXIT WHEN c_select%NOTFOUND;
  END LOOP;
 CLOSE c_select;
 COMMIT;
END;

DECLARE
 INcrmt NUMBER(4):=1;
 line WORK_ODI.TEST_SEQ%ROWTYPE;--before fetch it returns 0
 CURSOR c_select IS
 SELECT ROW_NUMBER,VALUE FROM WORK_ODI.TEST_SEQ;
BEGIN
 OPEN c_select;
  LOOP
   FETCH c_select INTO line;
   DBMS_OUTPUT.PUT_LINE(line.VALUE);
   if line.VALUE like '%DEB%'
   then
    UPDATE WORK_ODI.TEST_SEQ SET ROW_NUMBER = INcrmt WHERE VALUE=line.VALUE;
    INcrmt := INcrmt + 1;
   end if;
   if line.VALUE not like '%DEB%'
    then
    UPDATE WORK_ODI.TEST_SEQ SET ROW_NUMBER = INcrmt WHERE VALUE=line.VALUE;
   end if;
   EXIT WHEN c_select%NOTFOUND;
  END LOOP;
 CLOSE c_select;
 COMMIT;
END;

但这不能很好地工作,请看一下它给我的结果:

在此处输入图片说明

请任何人可以帮助我

首先,您应该具有某种“ Aid列。 在Oracle 12+中,您可以使用身份。 在早期版本中,可以使用序列。 这将根据插入顺序为表中的行提供排序。

其次,您可以在输出上执行所需的操作:

select a.*,
       sum(case when a.name like 'DEB%' then 1 else 0 end) over (order by aid) as row_number
from a;

如果您确实需要将值保留在表中,则可以使用merge语句将值分配给现有行(此aid列非常方便)。 之后,您将需要一个触发器来维护它。

我的建议是对数据进行计算,而不是将值存储在数据中。 update s和delete维护值似乎很痛苦。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM