Bom dia, dei uma alterada no na função e funcionou perfeitamente como eu precisava. Obrigado por toda disponibilidade em ajudar.
Qualquer consideração fique a vontade.
create or replace function fn_get_codbarras_gtin(p_codbarras varchar(13))
returns varchar(14) as $$
declare
v_soma integer;
v_digitos smallint[13];
v_DV smallint;
v_dt integer;
begin
--Verifica a quantidade de dígitos informados no parâmetro da função
if length(p_codbarras) > 13 then
raise exception 'O valor informado no parâmetro possui mais do que 12 dígitos';
end if;
--Converte em um array
v_digitos := string_to_array(p_codbarras, null);
--É somado cada elemento do array, caso ele esteja num índice par o valor será
--multiplicado por 3 antes de ser somado.
v_dt := (Length("p_codbarras"));
for i in 1..v_dt loop
if mod(v_dt,2) = 0 then
if mod(i,2) = 0 then
v_soma := coalesce(v_soma, 0) + (v_digitos * 3);
else
v_soma := coalesce(v_soma, 0) + v_digitos;
end if;
else
if mod(i,2) = 0 then
v_soma := coalesce(v_soma, 0) + v_digitos;
else
v_soma := coalesce(v_soma, 0) + (v_digitos * 3);
end if;
end if;
end loop;
--O resultado da subtração de 10 pela sobra da divisão da soma dos dígitos
--por 10 é o dígito verificador
v_DV = 10 - mod(v_soma, 10);
if v_DV = 10 then
v_DV := 0;
end if;
--É retornado o código de barras concatenado ao dígito verificador
return array_to_string(v_digitos, '') || v_DV;
end
$$ language plpgsql volatile strict;
update public."GTIN13" set "STATUS" = 'INVALIDO' where "GTIN" != public.fn_get_codbarras_gtin(substring("GTIN" from 1 for (Length("GTIN")-1)));