postgre 数据库生成有序编号
最近开发,遇到一个比较棘手的问题,就是使用postgre数据库生成一个以天为单位的有序的编号,最开始看到的时候,上网百度了一堆,但是没有找到合适的,没办法,只能自己动手写了。
函数如下:
CREATE OR REPLACE FUNCTION "public"."generate_code"("num" varchar)
RETURNS "pg_catalog"."varchar" AS $BODY$
DECLARE --声明变量
curr_max_code VARCHAR;
new_no VARCHAR;
vmodule varchar;
new_date VARCHAR;
new_code VARCHAR;
curr_max_code_no VARCHAR;
begin
new_date := to_char(CURRENT_DATE,'yyyyMMdd'); --格式化当前日期为:yyyyMMdd
vmodule := substr(num,0,3); --根据传入的参数,进行截取
EXECUTE 'select max(code) from sys_code where module = ''' || num || ''' ' INTO curr_max_code; --执行
curr_max_code_no := substr(curr_max_code,11,5); --截取生成的编号
IF curr_max_code is NULL THEN
new_no := '10001';
else
new_no := LPAD(cast(cast(curr_max_code_no as bigint)+1 as varchar),5,'0');
END IF;
new_code := vmodule || new_date || new_no;
EXECUTE 'insert into public.sys_code (code,module) values (''' || new_code || ''',''' || num || ''')';
return new_code;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
上述函数中看到的“sys_code”是创建存储编号的表
表结构如下
DROP TABLE IF EXISTS "public"."sys_code"; CREATE TABLE "public"."sys_code" ( "code" varchar(100) COLLATE "pg_catalog"."default" NOT NULL, "module" varchar(100) COLLATE "pg_catalog"."default" );
module存编号前缀,code存当前编号。

浙公网安备 33010602011771号