189 8069 5689

oracle如何自动编号 oracle自动生成编号

oracle 自动编号问题,高手进

ORACLE的编号和SQL SERVER的不同。SQL SERVER可以设置一个值为自增。

创新互联专注于尉氏网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供尉氏营销型网站建设,尉氏网站制作、尉氏网页设计、尉氏网站官网定制、微信小程序开发服务,打造尉氏网络公司原创品牌,更为您提供尉氏网站排名全网营销落地服务。

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;

oracle 怎么生成自动编号的存储过程

首先说,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就自动帮你维护起这个编号了.

没有实际调试,可能还有不足,希望能帮到你.

oracle 数据库 数据表自动生成序号 怎么添加??

需要先创建序列,然后nextval添加数据使其自动生成序号。 1、创建表: create table test(id int,name varchar2(20));2、创建序列: Create sequence seq_test_idIncrement by 1Start with 1Maxvalue 999999Minvalue 1Nocyclenocache;3、插入数oracle 数据库 数据表自动生成序号 怎么添加??

ORACLE 中如何判断自动产生了编号

判断:查找表触发器,sequence是否有效。

原理:ORACLE通过使用触发器完成自动生成序列号的工作,这一点相较ACCESS类数据库不同。程序员通常先建立序列sequence,然后创建基于表的触发器以自动产生编号。

以创建sequence tb1_seq为例:

create sequence tb1_seq

minvalue 1

maxvalue 999999999999999999999999999

start with 1 --从1开始

increment by 1 --自增1

nocache; --不循环

创建一个行级触发器,当插入表tb1时,触发自动编号

create or replace trigger tb1_trigger

before insert on tb1 --插入前取当前序列值的下一个

for each row

begin

select tb1_seq.nextval into :new.Id from dual;

end ;

PS:tb1_seq.nextval可直接在存储过程中使用

oracel中怎样使查询结果自动生成序号,应该在我的select语句哪里加相应的语句?

使用Oracle自带的row_number()函数能够实现自动增加序号列的要求,但是同时引发一个问题,如果我们查询出来的数据需要使用Order By排序的话,那么我们会发现新增加的序号列是乱序的,它会根据我们Order By后面的字段重新排序,那么怎么解决这一问题呢。

很简单,我们再加上根据Order By排序就可以了。

select row_number() over(ORDER BY t.field0),

t.field2,

t.field3

from table t

ORDER BY t.field1;

oracle保存时自动产生编号

Oracle保存时可以使用序列和触发器完成自动产生编号。

1:创建序列

create sequence orderSeq;

2:创建触发器

CREATEORREPLACETRIGGER order_TRG

BEFOREINSERTORUPDATEOF PD_ID

ON Order

FOREACHROW

BEGIN

IF INSERTING THEN

if :NEW.TypeID then

//计算编号 使用 oderSeq.NEXTVAL

else

//计算编号 使用 oderSeq.NEXTVAL

endif;

SELECT 计算编号 INTO :NEW.orderID FROM DUAL;

ELSE

RAISE_APPLICATION_ERROR(-20020, '不允许更新orderID值!');

ENDIF;


本文标题:oracle如何自动编号 oracle自动生成编号
路径分享:http://jkwzsj.com/article/hjjgci.html

其他资讯