重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
ORACLE的编号和SQL SERVER的不同。SQL SERVER可以设置一个值为自增。
10年积累的成都网站建设、成都做网站经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有平房免费网站建设让你可以放心的选择与我们合作。
ORACLE需要先建立一个SEQUENCE,然后用NEXTVAL。
一楼的回答可以满足从2009030001开始自增,但是无法实现每月更改。比如说数据量较小,很可能已经5月了,还在2009031999 什么的。
正确的做法是,建立一个1-9999的整数循环序列,然后加上日期值。
CREATE SEQUENCE DATE_SEQ
START WITH 1 --起始值(默认为1可省略)
INCREMENT BY 1 --可省略(默认为1可省略)
MAXVALUE 9999 --最大值
CYCLE --循环
NOCACHE --不缓存(可避免产生值不连续的情况)
ORDER --保证按次序产生值
有了1-9999的循环序列,我们就可以
TO_CHAR(DATE_SEQ.NEXTVAL)先将其转换为字符形式。
然后
LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0')对其进行4位加'0'补齐长度。例如2,补齐为0002。
然后加上插入的日期(只要年月)
TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0')
然后就可以进行INSERT或者是其他操作。这也是生产中用于生成带字符或日期ID流水号的标准方法。注意序列中的NOCACHE和ORDER是为了保证序列的连续和次序,如果这方面要求不严格,只是为了确保唯一性,可以用CACHE和NOORDER获得好一点的性能。一般来说ID只要求保证唯一就可以了。
从数学来说,有固定长度的数字编码都无法保证唯一性(数据量大了以后都会超越,比如说一共4位,数据量有10000,使用循环编码就肯定有重复)。对于ID来说有主键约束,对于非ID的其他编码,必须设置UNIQUE约束。
然后对于插入的单条数据:
INSERT INTO 表名(编号,字段1,字段2,字段3....)
VALUES(TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0'),字段1,字段2,字段3...)
对于对一个整表统一加编号:
CREATE TABLE 编号后的新表 AS
SELECT TO_CHAR(SYSDATE,'YYYYMM')||LPAD(TO_CHAR(DATE_SEQ.NEXTVAL),4,'0') AS 编号,A.* FROM 编号前的表 A;
创建一个最大值为99999的序列就是了:
create sequence SEQ_xxxxx
minvalue 1
maxvalue 99999
start with 1
increment by 1
select seq_xxxx.nextval from dual;
首先说,1楼的过程有点问题.可能 loveyurui大大写的有些急了.少了一个关键字.create or replace PROCEDURE inc_no(.....;
其次他的返回值,按照LZ的意思,应当还要+1.时间格式'yyyymmdd,还缺了一个引号.
p_num:=to_number(to_char(sysdate,'yyyymmdd')||'00000')+v_num+1;
还有一个,你要求"计算当天已经录入的个数"作为新编号的参考(loveyurui大大此处忽略了),建议在该表上能添加上插入数据的时间,这样方便提取记录条数.不然,需要切取编号的前8位与当前时间YYYYMMDD比较来提取,效率不高.
v_sql:='select count(*) from '||p_name
||' where substr(编号,0,8)=to_char(sysdate,''yyyymmdd'')';
这样修改以后应该就可以达到你的要求了.
如果这个编号就只用于这个表的对应的话,最好是用一个ORACLE的序列对象(Sequence,可以根据现在表中已经存在的编号来确定初始值),通过与时间字符串的组合来生成,这样比较好.就不用写存储过程了.
create sequence NUM_seq
minvalue 1
maxvalue 999999
start with 1 //此处可以参照你的实际情况进行修改
increment by 1
nocache cycle
往这个表(假设为table1)插入数据的时候,就采用
insert into table1(编号,....)
select to_char(sysdate,'yyyymmdd')||LPAD(NUM_seq.nextval,6,'0'),.....
只要所有插入该表的数据操作都采用这个接口语句,ORACLE就自动帮你维护起这个编号了.
没有实际调试,可能还有不足,希望能帮到你.
需要先创建序列,然后nextval添加数据使其自动生成序号。
1、创建表:
create table test
(id int,
name varchar2(20));
2、创建序列:
Create sequence seq_test_id
Increment by 1
Start with 1
Maxvalue 999999
Minvalue 1
Nocycle
nocache;
3、插入数据:
insert into test values (seq_test_id.nextval,'badkano');
4、再插入一条数据:
insert into test values (seq_test_id.nextval,'百度知道团长');
这样可见,序号是添加成功的。
oracle创建序列基本语法:
CREATE SEQUENCE sequence //创建序列名称
[INCREMENT BY n] //递增的序列值是n 如果n是正数就递增,如果是负数就递减 默认是1
[START WITH n] //开始的值,递增默认是minvalue 递减是maxvalue
[{MAXVALUE n | NOMAXVALUE}] //最大值
[{MINVALUE n | NOMINVALUE}] //最小值
[{CYCLE | NOCYCLE}] //循环/不循环
[{CACHE n | NOCACHE}];//分配并存入到内存中