2013-02-03 15:24
提问者采纳
热心网友
流水号格式: P + 年四位月两位流水号三位 例如: P20130203001 P20130203999 CREATE TABLE TEST_SEQNO ( SEQNO VARCHAR(10) PRIMARY KEY, VALVARCHAR(20) ); 方案一:使用 序列号 + 触发器 + 存储过程 + 数据库作业 -- 序列号 CREATE SEQUENCE seq_testno increment by 1 -- 每次递增1 start with 1 -- 从1开始 nomaxvalue -- 没有最大值 minvalue 1 -- 最小值=1 NOCYCLE; -- 触发器. CREATE OR REPLACE TRIGGER tr_test_seqno BEFORE INSERT ON TEST_SEQNO FOR EACH ROW BEGIN SELECT 'P' || TO_CHAR(sysdate, 'YYYYMM') || TRIM(TO_CHAR(seq_testno.nextval, '000')) INTO :new.SEQNO FROM dual; END; / -- 测试 SQL> INSERT INTO TEST_SEQNO(VAL) VALUES('T1.1'); 已创建 1 行。 SQL> SELECT * FROM TEST_SEQNO; SEQNO VAL -------------------- ---------------------------------------- P201302001 T1.1 -- 用于 重置序列号的 存储过程. CREATE OR REPLACE PROCEDURE ResetSeqTestno -- 注:由于动态SQL 里面,创建序列号, -- 如果不加下面这行,执行将报错 “ORA-01031: 权限不足” AUTHID CURRENT_USER AS BEGIN -- 由于每月1日早上 0点, 需要把序列号的当前数值, 重置为 1. -- 但是由于不能通过 ALTER SEQUENCE 语句来修改序列号的当前值 -- 因此只能每月1日 删除-重建 序列号. -- 首先是删除. EXECUTE IMMEDIATE('DROP SEQUENCE seq_testno '); -- 然后是重建. EXECUTE IMMEDIATE('CREATE SEQUENCE seq_testno increment by 1 start with 1'); END; / -- 将存储过程, 加入 Oracle 作业. 每月1日 00:00 执行. variable jobno number; begin dbms_job.submit(:jobno, 'ResetSeqTestno;', ADD_MONTHS(trunc(sysdate, 'MM'), 1), 'ADD_MONTHS(trunc(SYSDATE, ''MM''),1)'); commit; end; / ALTER session SET nls_date_format='yyyy-mm-dd hh24:mi:ss'; -- 查询作业. SELECT job, what, next_date, interval FROM user_jobs; JOB ---------- WHAT -------------------------------------------------------------------------------- NEXT_DATE ------------------- INTERVAL -------------------------------------------------------------------------------- 62 ResetSeqTestno; 2013-03-01 00:00:00 ADD_MONTHS(trunc(SYSDATE, 'MM'),1)
-
提问者评价
-
谢谢你帮我大忙了