Oracle PL/SQL BULK 从数组更新

Posted

技术标签:

【中文标题】Oracle PL/SQL BULK 从数组更新【英文标题】:Oracle PL/SQL BULK Update from an arrray 【发布时间】:2020-11-18 16:27:31 【问题描述】:

是否可以像这样在 Oracle 中执行批量更新:

TYPE type_A IS RECORD
(
    var    NUMBER(15,2)
);

TYPE t_type_A IS VARRAY (9) OF type_A; 
var_t_type_A  t_type_A;


SELECT
    A
BULK COLLECT INTO var_t_type_A
FROM
    B;
    
-- lopp over

FOR i IN var_t_type_A.FIRST .. var_t_type_A.LAST
LOOP
    var_t_type_A.var = 99;
END LOOP;
    

而且它们与插入类似

   FORALL var_i_idx IN 1..table_of_t_created_new_buchung.count SAVE EXCEPTIONS
       UPDATE TABLE B somehow

【问题讨论】:

【参考方案1】:

好吧,您的骨架代码相当稀疏,因此任何答案都必须如此。首先,是的,你所看到的都是可能的。其次,您的代码中有几个问题:

    没有理由为 a 创建包含单个 变量。 我假设一个 varray 可以与批量 collect/forall 一起使用。我有 只是从没用过一个,没看到重点。 您的 forall 语句包含“保存例外”子句,但是 没有例外部分,这是无用的。我已经包括 必要的定义。
    declare 
        bulk_errors  EXCEPTION;  
        PRAGMA EXCEPTION_INIT (bulk_errors , -24381);  
        
        type t_type_a is table of number(15,2);  
        var_t_type_a  t_type_a;
    
    begin
    
    
        select a
          bulk collect 
          into var_t_type_a
          from b;
        
        -- lopp over
    
        for i in var_t_type_a.first .. var_t_type_a.last
        loop
            var_t_type_a(i) = 99;
        end loop;
        
        ...
    
    
        forall var_i_idx in 1..var_t_type_a.count save exceptions
           update table b 
              set some_column = var_t_type_a(var_i_indx); 
              
    exception
        when bulk_errors then 
             <logic for bulk errors>;
    end ;

要获得更完整的答案,请发布更完整的问题描述。

【讨论】:

谢谢!我总是尝试放置一个简单的代码,以便具体并保持简单。不需要更完整的答案。如果可行,我会尝试 简单是好的,但简单不是。小心越界。无论如何,很高兴能帮上忙。【参考方案2】:

我不知道是否可以通过更新来完成,但是全局临时表而不是数组类型呢。

类似:

create global temporary table temp_table (xid rowid, value number(15, 2));

insert into temp_table select rowid, value from main_table;

update temp_table ....

update (select m.value v1, t.value v2
          from main_table m 
           join temp_table t on m.rowid = t.xid)
   set v1 = v2

【讨论】:

以上是关于Oracle PL/SQL BULK 从数组更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PL/SQL 中使用 BULK COLLECT 和 FORALL 替换 CURSOR FOR LOOP?

使用Bulk Binding批量绑定的模式高效处理ORACLE大量数据

使用 BULK 集合将 SQL 代码重写为 PL/SQL

PL/SQL批处理语句BULK COLLECT

oracle forms builder pl/sql - 访问从其他列派生的列

Oracle_PL/SQL 集合