我有一个表,当iwnna插入新记录时,它默认生成新的#increal 1,我该怎么办呢 数字以年份开头,序列号为ex; 20130001,20130002,20130003等,当年底结束则将开始20140001,20140002,20140003
答案 0 :(得分:0)
暂时不考虑为什么这个问题。
最直接的方法是创建一个Oracle SEQUENCE对象,从你想要开始的值开始,增量为1.例如:
CREATE SEQUENCE myseq START WITH 20130001 INCREMENT BY 1 NOCACHE ;
要使用序列对象为INSERT上的表提供值,请创建BEFORE INSERT触发器
CREATE TRIGGER mytable_trg_bi
BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
IF NEW.mycol IS NULL THEN
SELECT myseq.NEXTVAL FROM DUAL INTO NEW.mycol;
END IF;
END;
/
(自从我使用Oracle语法以来已经有一段时间了;有些关键字的顺序可能不正确。但这是将唯一的,系统生成的值分配给INSERT上的列的正常模式。
这部分很容易。
更棘手的部分是让序列“跳转”到特定值。
有两种方法可以做到这一点。一个是删除序列对象并使用相同的名称重新创建一个具有新起始值的新对象。但那不是很优雅,而且相当具有破坏性。
另一种方法是修改增量值,选择nextval使其跳转,然后将增量设置回1.
粗略概述可能的样子:
DECLARE
ln_val NUMBER;
BEGIN
-- retrieve next value from sequence
SELECT myseq.NEXTVAL FROM DUAL INTO ln_val;
-- set increment so next call to nextval will "jump"
EXECUTE IMMEDIATE
'ALTER SEQUENCE myseq INCREMENT BY '|| 20140001 - 2 - ln_val ||' NOCACHE';
-- this should return us 20140000
SELECT myseq.NEXTVAL FROM DUAL INTO ln_val;
-- reset increment back to 1
EXECUTE IMMEDIATE
'ALTER SEQUENCE myseq INCREMENT BY 1';
END;
/
请注意,如果另一个会话同时从SEQUENCE中提取值,则这种设置/重置序列的当前值的方法会受到竞争条件的影响。