需求:产品编码自增,要求编码长度为10位,默认数据自动增1.
思路:1、首先产品编码是字符串类型,且首字符为'0'。转换成数值,只能舍弃第一位,然后再拼装。
2、但是当第二位为9时,则需要进位,且下次转换不要舍弃第一位。
3、LENGTH(to_number(productid)) = 9 productid+1 , '0'||(productid+1)
4、decode(LENGTH(MAX(productid)+1),9,max(productid)+1,'0'||(max(productid)+1))
SELECT decode(LENGTH(MAX(productid)+1),10,to_char(max(productid)+1),'0'||(max(productid)+1) ) FROM productinfo ;
SELECT LPAD(MAX(PRODUCTID),10,0) FROM productinfo
注意:
decode选择项必须数据类型一致。
当多事务并发时,会出现各事务取出的最大值相同,导致主键冲突,可以使用序列sequence和trigger实现。
--------squence似乎对于不同的事务具有独立的缓存机制,即多事务时,不同事务有自己独立记录的序号,以后考证。
CREATE SEQUENCE s_pdt_pk
START WITH 240050004
--MINVALUE 0240050004
MAXVALUE 9999999999
INCREMENT BY 1;
CREATE OR REPLACE TRIGGER t_pdtinfo_pk_squ
BEFORE INSERT ON productinfo
FOR EACH ROW
BEGIN
IF inserting THEN
--UPDATE productinfo SET :new.productid = decode(LENGTH(s_pdt_pk.nextval),10,to_char(s_pdt_pk.nextval),'0'||s_pdt_pk.nextval ) ;
:new.productid := CASE LENGTH(s_pdt_pk.nextval) WHEN 10 THEN to_char(s_pdt_pk.nextval) ELSE '0'||s_pdt_pk.nextval END ;
END IF;
END;