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