oracle 创建固定长度的自增ID 和 当前时间

 

 

 

 

ORACLE的编号和SQL SERVER的不同。SQL SERVER可以设置一个值为自增。
ORACLE需要先建立一个SEQUENCE,然后用NEXTVAL。

例如,若想生成这样的编码,0001,0002,0003.。。。。。


首先建立一个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没有date()函数,sysdate函数的值是包括时分秒的,要实现插入当前时间默认值还真麻烦.

只好自己写储存过程,而字段默认值里面又不能调用储存过程,还得写个触发器!而储存过程里面取出来的sysdate前几位的只却变成17-11月 -07的格式了,不是自己想要的,2007-11-17的格式,又得单独取年月日再组合起来,这样一来返回值就不能是日期类型而要字符类型了.

一个字,烦!不过还是把他实现了.下面把代码给大家分享一下,如果有更好的方法麻烦告知.

1.储存过程

CREATE OR REPLACE FUNCTION "GET_DATE" RETURN VARCHAR2
IS
   yyyy     varchar2(36);
   mm     varchar2(36);
   dd     varchar2(36);
   tempdate   varchar2(36);
BEGIN
tempdate := '';
select to_char(to_date(sysdate),'YYYY') into yyyy from dual;
select to_char(to_date(sysdate),'MM') into mm from dual;
select to_char(to_date(sysdate),'DD') into dd from dual;
tempdate := substr(yyyy,1,4)|| '-'||
substr(mm,1,2)|| '-'||
substr(dd,1,2)
;
return tempdate;
END;

2.触发器

CREATE OR REPLACE TRIGGER STATWEEK_tg
--STATWEEK fdate 的触发器
BEFORE INSERT ON STATWEEK FOR EACH ROW
BEGIN
       SELECT get_date INTO :NEW.fdate FROM DUAL;
END;

注:这里的STATWEEK为对应的数据表 fdate为自动增长的字段,get_date为对应的储存过程名.

3.数据表

-- Create table
create table STATWEEK
(
星期一   VARCHAR2(20) default 0,
星期二   VARCHAR2(20) default 0,
星期三   VARCHAR2(20) default 0,
星期四   VARCHAR2(20) default 0,
星期五   VARCHAR2(20) default 0,
星期六   VARCHAR2(20) default 0,
星期日   VARCHAR2(20) default 0,
TWEEK VARCHAR2(10),
ADMIN VARCHAR2(50),
FDATE VARCHAR2(20)
)


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Ghost_T/archive/2010/09/19/5895162.aspx

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值