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