如何条件序列
how to conditional sequences
我使用触发器在基于
的多列(条件)中自动递增
coalesce (max(id), 1) + 1
它在使用外部签名服务时停止工作,这需要几秒钟的时间,其并发性开始显示重复值。
我最初使用一些条件值的序列解决了这个问题,比如:
CREATE OR REPLACE FUNCTION get_webf_serial() RETURNS trigger AS
$BODY$
begin
if new.serie = 'A' then
new.folio: = nextval ('seq_A');
elseif new.serie = 'B' then
new.folio: = nextval ('seq_B');
else
new.folio: = nextval ('seq_any');
end if;
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
如您所见,我需要一种动态的方式来关联序列,在本例中为 new.serie; elseif 的使用受到限制。
是否有更好的方法来使用条件序列或通过代码模仿序列的行为?
提前致谢
您可以根据 new.serie
的名称创建序列的名称:
CREATE OR REPLACE FUNCTION get_webf_serial() RETURNS trigger AS
$BODY$
declare
seq_name TEXT := FORMAT('seq_%s', new.serie);
begin
PERFORM * FROM information_schema.sequences
WHERE sequence_schema = 'public' AND sequence_name = seq_name;
IF NOT FOUND THEN
seq_name := 'seq_any';
END IF;
new.folio: = nextval(seq_name);
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
我使用触发器在基于
的多列(条件)中自动递增coalesce (max(id), 1) + 1
它在使用外部签名服务时停止工作,这需要几秒钟的时间,其并发性开始显示重复值。
我最初使用一些条件值的序列解决了这个问题,比如:
CREATE OR REPLACE FUNCTION get_webf_serial() RETURNS trigger AS
$BODY$
begin
if new.serie = 'A' then
new.folio: = nextval ('seq_A');
elseif new.serie = 'B' then
new.folio: = nextval ('seq_B');
else
new.folio: = nextval ('seq_any');
end if;
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;
如您所见,我需要一种动态的方式来关联序列,在本例中为 new.serie; elseif 的使用受到限制。
是否有更好的方法来使用条件序列或通过代码模仿序列的行为?
提前致谢
您可以根据 new.serie
的名称创建序列的名称:
CREATE OR REPLACE FUNCTION get_webf_serial() RETURNS trigger AS
$BODY$
declare
seq_name TEXT := FORMAT('seq_%s', new.serie);
begin
PERFORM * FROM information_schema.sequences
WHERE sequence_schema = 'public' AND sequence_name = seq_name;
IF NOT FOUND THEN
seq_name := 'seq_any';
END IF;
new.folio: = nextval(seq_name);
return new;
end;
$BODY$
LANGUAGE plpgsql VOLATILE COST 100;