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存当前编号。

  

posted @ 2020-09-29 13:37  徐徐图之  阅读(940)  评论(0编辑  收藏  举报