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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle中建立一个表,主键是编号P+年四位月两位+_+流水号三位001。这个怎么建啊?相关的知识,希望对你有一定的参考价值。

可以用自增序列么?那日期怎么插入啊?

流水号格式:

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)
参考技术A 如果日期可以从sysdate中to_char求出来,用||连接成一个字符串,否则只能用参数来做(存储过程)

如何给oracle建立索引?建立索引后查询表施应该怎样使用,请高手解答,谢谢(不要百度内容)

参考技术A 建索引的语法这个baidu一下就可以了,主键字段自动索引.

使用索引一般是在查询条件里加上 索引字段='某个值' 就可以使用索引了,不过直接看sql是看不出来的。你可以看sql的执行计划了解oracle是准备怎么执行该SQL的。
参考技术B 数据库表一般都在建立的时候主键是自动生成索引的,你也可以后来添加索引化视图 跟创建数据库表 一样后面 加一句 organization index追问

如何使用索引?

追答

你是说如何 查找索引吗

追问

嗯 对的,我现在又张表建立了索引,我不知道如何去使用。我不知道怎么用sql语句去查询。

追答

创建索引不是为了在语句中用的,而是可以大大提高系统的性能。

本回答被提问者采纳

以上是关于oracle中建立一个表,主键是编号P+年四位月两位+_+流水号三位001。这个怎么建啊?的主要内容,如果未能解决你的问题,请参考以下文章

做java项目时的主键和外键是啥啊?

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?

oracle中 主键和外键是啥意思?啥地方采用呢?

怎么在oracle数据库中查询一个表的主键是哪一列

多个用户同时向oracle中一个表插入数据,经常出现主键冲突,主键是通过sequence获得的