本文介紹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$;