最近开发,遇到一个比较棘手的问题,就是使用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存当前编号。