本文介绍FORALL语句的使用场景和方法。

背景说明

PolarDB O引擎不支持除"FORALL index IN lower_bound .. upper_bound"类型以外FORALL语句。

原理

在Oracle PL/SQL过程语言handler和SQL之间需要切换,如果是一个较大的LOOP,切换一多,性能就会下降严重。

因此对于在PL/SQL需要多次调用SQL的处理场景,Oracle想到了bulk collect的处理方法。比如用户提交一个数组,要求PL/SQL将这个数组的元素一条条插入到表里面,或者拿来更新表里面的值,又或是删除表里的值。

解决方案

类似Oracle FORALL的批量插入用法,用一个数组表示条件,另一个数组表示VALUE如果有多个条件或者value时,可以用record数组或者hstore(Key-Value类型)数组来表示。
CREATE OR REPLACE FUNCTION public.f_bulk_insert1(i_k integer[], i_v text[])
 RETURNS void
 LANGUAGE plpgsql
 STRICT
AS $function$
declare 
  i_length int := array_length(i_k,1);
  s timestamp;
  e timestamp;
begin 
  s := clock_timestamp(); 
  raise notice 'start: %', s;
  insert into test select i_k[i], i_v[i] from generate_series(1, i_length) t(i); 
  e := clock_timestamp(); 
  raise notice 'end: %, %', e, e-s; 
end;
$function$;