最近開發,遇到一個比較棘手的問題,就是使用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存當前編號。