ss
Ejemplo: Autoincremental Alfanumérico
-- tabla para el ejemplo
create table t2(id varchar, dato int);
--función que hace el autoincremento
create or replace function auto1() returns varchar
as $$
DECLARE
encabezado varchar;
parte_numero varchar;
ultimo_numero varchar;
numero_retorno varchar;
numero int;
begin
encabezado := 'ABC';
select max(id) into ultimo_numero from t2;
IF ultimo_numero IS NULL THEN
numero_retorno := encabezado || '000001';
ELSE
---ABC000001 000001
parte_numero = REPLACE(ultimo_numero, encabezado, '');
raise notice 'ultimo numero:%', parte_numero;
numero := parte_numero::int + 1;
RAISE NOTICE 'siguiente numero:%', numero;
parte_numero = '000000' || numero::varchar;
parte_numero = SUBSTR(parte_numero, length(parte_numero)-6+1, 6);
numero_retorno := encabezado || parte_numero;
END IF;
return numero_retorno;
END;
$$ language plpgsql;
-- Usando la funcioón
insert into t2(id, dato) values (auto1(),1);
select * from t2;
-- Uniendo la función con la tabla
alter table t2 alter column id set default auto1();
insert into t2(dato) values (10);
Ejemplo: Autoincremental Alfanumérico usando la misma función para dos tablas diferentes y la parte alfabética sea definida por el usuario
-- función que recibe como parametro la tabla a utilizar y la parte estática alfabética del autoincremental
create or replace function auto2(tabla varchar, encabezado varchar) returns varchar
as $$
DECLARE
parte_numero varchar;
ultimo_numero varchar;
numero_retorno varchar;
qry text;
numero int;
begin
qry:= 'select max(id) from ' || tabla;
execute qry into ultimo_numero ;
IF ultimo_numero IS NULL THEN
numero_retorno := encabezado || '000001';
ELSE
parte_numero = REPLACE(ultimo_numero, encabezado, '');
raise notice 'ultimo numero:%', parte_numero;
numero := parte_numero::int + 1;
RAISE NOTICE 'siguiente numero:%', numero;
parte_numero = '000000' || numero::varchar;
parte_numero = SUBSTR(parte_numero, length(parte_numero)-6+1, 6);
numero_retorno := encabezado || parte_numero;
END IF;
return numero_retorno;
END;
$$ language plpgsql;
-- tablas para probar la función
create table t3(id varchar default auto2('t3', 'DEF'), dato int);
create table t4(id varchar default auto2('t4', 'VWXYZ'), dato int);
Ejemplo: Autoincremental Alfabético
-- función que genera un autoincremental alfabético
create or replace function auto3() returns varchar
as $$
DECLARE
encabezado varchar default 'AAAAAA';
ultimo_numero varchar;
retorno varchar;
alfanum varchar;
i int;
caracter char;
new_caracter char;
suma_next_level int;
begin
select max(id) into ultimo_numero from t5;
IF ultimo_numero IS NULL THEN
alfanum := encabezado;
ELSE
alfanum := '';
suma_next_level := 1;
FOR i IN REVERSE 6..1 LOOP
caracter := SUBSTR(ultimo_numero,i,1);
--RAISE NOTICE 'pos:% caracter:%',i, caracter;
IF suma_next_level = 1 THEN
select * into new_caracter, suma_next_level from next_char(caracter);
RAISE NOTICE 'pos:% caracter:% new:% suma:%',i, caracter, new_caracter, suma_next_level;
alfanum := alfanum || new_caracter;
ELSE
alfanum := alfanum || caracter;
END IF;
END LOOP;
END IF;
retorno := '';
FOR i IN 1..6 LOOP
retorno := substr(alfanum,i ,1 ) || retorno;
END LOOP;
return retorno;
END;
$$ language plpgsql;
-- función que calcula cual es el "siguiente carácter"
create or replace function next_char( in caracter char, out retorno char, out suma_next_level int)
as $$
DECLARE
maximo int default 90;
--maximo int default 66;
BEGIN
IF ascii(caracter) + 1 > maximo THEN
suma_next_level = 1;
retorno := 'A';
ELSE
suma_next_level = 0;
retorno := chr(ascii(caracter) + 1);
END IF;
END;
$$ language plpgsql;
-- tabla para probar el ejemplo
create table t5 (id varchar default auto3(), dato int);
insert into t5 (dato) select generate_series(1,20);
Impactos: 78
Comments are closed