Как кодировать атомарную транзакцию в PL / pgSQL - PullRequest
0 голосов
/ 07 января 2019

У меня есть несколько операторов select, insert и update для завершения транзакции, но я не могу гарантировать, что все операторы будут успешными, прежде чем вносить изменения в таблицу.

Транзакция не выглядит атомарной.

У меня есть begin и end в моей функции, но транзакция не выглядит атомарной.

CREATE FUNCTION public.testarray(salesid integer, items json) RETURNS         integer
LANGUAGE plpgsql
AS $$
declare
 resu text;
 resu2 text := 'TH';
 ssrow RECORD;
 oserlen int := 0;
 nserlen int := 0;
 counter int := 0;
begin

 select json_array_length(items::json->'oserial') into oserlen;
 while counter < nserlen loop
   select items::json#>>array['oserial',counter::text] into resu;
   select * into strict ssrow from salesserial where fk_salesid=salesid     and serialnum=resu::int;
   insert into stockloct(serialnum,fk_barcode,source,exflag)     values(ssrow.serialnum,ssrow.fk_barcode,ssrow.fk_salesid,true);
   counter := counter + 1;
 end loop; 

 counter := 0;
 select json_array_length(items::json->'nserial') into nserlen;
 while counter < nserlen loop
   select items::json#>>array['nserial',counter::text,'serial'] into resu2;
   select * into ssrow from stockloc where serialnum=resu2::int;
   insert into salesserial(fk_salesid,serialnum,fk_barcode)     values(salesid,ssrow.serialnum,ssrow.fk_barcode);
   counter := counter + 1;
 end loop;
 select items::json#>'{nserial,0,serial}' into resu2;
 return resu;
end;
$$;

Даже если первая вставка завершается неудачно, вторая вставка может быть успешной.

1 Ответ

0 голосов
/ 08 января 2019

Я вижу, что по & ldquo; fail & rdquo; Вы имеете в виду & ldquo; не вставляет никаких строк & rdquo;.

Это неудивительно, поскольку первый цикл никогда не выполняется: и counter, и nserlen всегда равны 0.

Возможно, вы имеете в виду первое WHILE условие, которое будет counter < oserlen?

Вы также, кажется, растерялись из-за BEGIN PL / pgSQL: хотя он выглядит как BEGIN, который запускает транзакцию, он совершенно другой. Это всего лишь & ldquo; открывающая скобка & rdquo; в блоке PL / pgSQL.

...