在 Oracle 中使用计数器更新字段

Posted

技术标签:

【中文标题】在 Oracle 中使用计数器更新字段【英文标题】:Update a field with a counter in Oracle 【发布时间】:2017-03-09 17:27:13 【问题描述】:

我在 Oracle 中有一张这样的表:

+---------------------------------------------------------------+
| KA_ACTEUR  | NIF         | NIF_EXT |  NAME     |    LASTNAME  |
+---------------------------------------------------------------+
| AAAAAAAA1  | 123456789X  | 1       |  JHON     |    DOE       |
| AAAAAAAA2  | 123456789X  | 2       |  JHON     |    DOE       |
| AAAAAAAA3  | 123456789X  | 3       |  JHON     |    DOE       |
| AAAAAAA34  | 123456789X  |         |  JHON     |    DOE       |
| AAAAA6AA5  | 123456789X  |         |  JHON     |    DOE       |
+---------------------------------------------------------------+
The field NIF is the Primary key

我想更新字段 EXT 为空的条目,继续序列 (max+1)。 我使用了以下代码,但是条目很多,并且需要很多时间。

DECLARE
   CURSOR clientCursor IS
      SELECT * from my_table
      where nif_ext is null;
BEGIN
   FOR client IN clientCursor LOOP
      UPDATE my_table
      SET    nif_ext = (select nvl(max(nif_ext)+1,1) from my_table where nif=client.nif)
      WHERE  ka_acteur=client.ka_acteur;
   END LOOP;
   COMMIT;
   EXCEPTION
      WHEN OTHERS THEN
         ROLLBACK;
END;

您知道解决此问题的另一种方法吗? 谢谢。

【问题讨论】:

NIF 是主键(唯一且不为空)还是您想要计算的感兴趣的字段? ka_acteur 是主键, 我的错@a_horse_with_no_name 【参考方案1】:

这可以使用merge 语句来实现:

merge into my_table
using 
(
  select ka_acteur, 
         (select max(nif_ext) from my_table) as max_nif,
         row_number() over (order by ka_acteur) as rn
  from my_table
  where nif_ext is null
) t on (t.ka_acteur = my_table.ka_acteur)
when matched then 
   set nif_ext = t.max_nif + t.rn;

【讨论】:

以上是关于在 Oracle 中使用计数器更新字段的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 尝试使用具有计数值的数据更新表

运行MongoDB查询以更新循环中的序列字段

如何使用另一个表的计数更新表的字段? SQLite,Java,安卓

Oracle:根据结果集计数更新行

访问:使用子查询中的计数更新查询 - 错误或所有结果

java中数值类型转换的问题,double类型显示科学计数法了。