oracle中有一亿多行数据的表,要全表更新某字段值,有啥号的方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中有一亿多行数据的表,要全表更新某字段值,有啥号的方法?相关的知识,希望对你有一定的参考价值。

你可以写一个存储过程来执行,由于数据量大,如果直接更新,数据库UNDO表空间肯定会满,会产生异常。
过程如下,给你参考下。
CREATE OR REPLACE PROCEDURE UPDATE_TABLES
AS
TYPE T_MW IS TABLE OF ROWID;
T_T_MW T_MW;
CURSOR V_CUR IS
SELECT ROWID FROM T ;
BEGIN
OPEN V_CUR;
LOOP
FETCH V_CUR BULK COLLECT
INTO T_T_MW LIMIT 80000;
FOR C1 IN 1 .. T_T_MW.COUNT LOOP
UPDATE T NOLOGGING
SET 要改的列
WHERE ROWID=T_T_MW(C1);
END LOOP;
COMMIT;
EXIT WHEN V_CUR%NOTFOUND;
END LOOP;
CLOSE V_CUR;
COMMIT;
END;
该过程可一次提交80000行。你也可以根据需求改。
参考技术A 正常更新大概也就2个小时吧,把update 操作改成insert 写入,去掉日志,会快点。1亿多也不是很多吧。 参考技术B 除了楼上分段更新的方法

还有一个换硬件的方法,使用exadata。10秒钟搞定O(∩_∩)O~

oracle 表单获取表和多行块中的数据

【中文标题】oracle 表单获取表和多行块中的数据【英文标题】:oracle forms get data that are both in table and multi row block 【发布时间】:2019-02-07 08:19:34 【问题描述】:

我有一张像这样的表

+-------+
|stud_id|
+-------+
|10     |
|13     |
|12     |
|11     |
|15     |
+-------+

还有这样的多行块

我想要的是,例如,在单击按钮后,我的多行块中有值 13、12、14,会出现一条消息,其中包含我的表和多行块块中的 stud_id,它们是数字只有 13 和 12 而不是 14,因为它不包含在我的表格中。

【问题讨论】:

【参考方案1】:

我想,表格形式(包含多行的表格)是基于某个表格的。我们称之为FORM_TBL。另外,假设包含您发布的数据的表名为STUD_TBL

一个简单的选项是发布输入到表单中的数据(这意味着它们最终会出现在表格中,但不会被提交,除了你会看到这些行之外没有人会看到)和然后 - 使用 INTERSECT 集合运算符 - 找到共同值。那将是WHEN-BUTTON-PRESSED 触发器:

declare
  retval varchar2(200);
begin
  post; 

  select listagg(stud_id, ',') within group (order by stud_id) 
  into retval
  from (select stud_id from stud_tbl
        intersect
        select s_id from form_tbl
      );

  message('Common values: ' || retval);
end;

如果您的表单版本不支持LISTAGG,您可以循环执行:

declare
  retval varchar2(200);
begin
  post; 

  for cur_r in (select stud_id from stud_tbl
                intersect
                select s_id from form_tbl
               )
  loop
    retval := retval ||', '|| cur_r.stud_id;
  end loop;
  message('Common values: ' || retval);
end;

否则,如果POST 不能满足您的需求,您将不得不遍历表单中的所有行并检查它们是否存在于STUD_TBL 中。

【讨论】:

先生,我认为 POST 不能满足我的需求,因为我在表的其他一些列中使用了一些自动生成的值。我想我需要在所有行中使用该循环然后进行比较。请帮帮我:( 我建议你不要思考,而是尝试。这是做到这一点的方法。

以上是关于oracle中有一亿多行数据的表,要全表更新某字段值,有啥号的方法?的主要内容,如果未能解决你的问题,请参考以下文章

oracle update如何更新多行数据

oracle 表单获取表和多行块中的数据

oracle某表的一个字段有多值,怎么把这值变成多行,其它数据为一样

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

怎么从数据库中的一亿条数据中读取我想要的十条数据?

oracle的表更新问题