oracle中建立一个表,主键是编号P+年四位月两位+_+流水号三位001。这个怎么建啊?

转载 2015年07月07日 14:29:17

oracle中建立一个表,主键是编号P+年四位月两位+_+流水号三位001。这个怎么建啊?

2013-02-03 12:23哈日珠拉美  分类:数据库DB | 浏览 582 次
可以用自增序列么?那日期怎么插入啊?
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)
提问者评价
谢谢你帮我大忙了

流水号的生成(日期+业务码+自增序列)

项目开发时,使用了两套数据库,开发环境和上线环境,数据库表中大多采用了自增主键, 比如:id int unsigned primary key auto_increment,但往往会碰到一些问题,比...

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

 create sequence TEST_IDminvalue 1maxvalue 9999999start with 1increment by 1nocache;    ORACLE的编号和SQ...

oracle创建固定长度的自增ID

ORACLE的编号和SQL SERVER的不同。SQL SERVER可以设置一个值为自增。  ORACLE需要先建立一个SEQUENCE,然后用NEXTVAL。 例如,若想生成这样的编码,0001...

关于oracle数据库中的建一个主键自增1的表

小知识点:dual是一个伪表,是一张只有一个字段,一行记录的表。 不需要从具体的表来取得表中数据,而是单纯地为了得到一些我们想得到的信息,并要通过select 完成时,就要借助一...

Oracle 生成流水号 存储过程 订单编号

用存储过程生成流水号是很常用的,这里以生成订单编号的流水号作为示例。(新的一天的流水号从1开始,如:今天的订单编号是CD2013010900014,下一个订单编号将是CD2013010900015;明...

获取主键自动增长ID(Oracle/MSSQL/mysql),取得刚插入的ID编号

获取主键自动增长ID(Oracle/MSSQL/mysql),取得刚插入的ID编号 本文和大家讲一下如何使用ibatis来获取刚刚插入数据的ID的方法,也是在网上找到的,挺实...

ibatis获取主键自动增长ID(Oracle/MSSQL/mysql),取得刚插入的ID编号

Oracle设置1    2    3         4         

ibatis获取主键自动增长ID(Oracle/MSSQL/mysql),取得刚插入的ID编号

在数据库插入操作的时候,对自动增长ID的获取方法:(本人只试过Oracle的) Oracle设置  1    INSERT INTO TF003 (PLAN_I...

Oracle中用一个序列给两个表创建主键自增功能的后果

前几天在创建数据表时,想偷个懒,使用一个序列给两个表创建主键自增功能,结果。。。。。。情景:为宠物中心创建一个简单的数据库,要求如下:...

触发器建立oracle主键

  • 2013年03月24日 19:06
  • 1KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:oracle中建立一个表,主键是编号P+年四位月两位+_+流水号三位001。这个怎么建啊?
举报原因:
原因补充:

(最多只允许输入30个字)