-- Create table
create table T_EB_SYS_DN_SEQUENCE_CONFIG
(
sequence_id VARCHAR2(36) default sys_guid() not null,
sequence_name VARCHAR2(50) not null,
sequence_desc VARCHAR2(200),
sequence_len INTEGER default 4 not null,
reset_type INTEGER default 2 not null,
separator VARCHAR2(10) default '-',
prefix VARCHAR2(50),
date_format VARCHAR2(50) default 'YYYYMM',
current_value INTEGER default 0 not null,
initial_value INTEGER default 1 not null,
step INTEGER default 1 not null,
creator VARCHAR2(50) not null,
created_date TIMESTAMP(6) default systimestamp not null,
modifier VARCHAR2(50) not null,
last_updated_date TIMESTAMP(6) default systimestamp not null,
is_enable VARCHAR2(2) default '1' not null,
sdp_user_id VARCHAR2(36) default nvl(SYS_CONTEXT('SDP_CONTEXT','userid'),'88888') not null,
sdp_org_id VARCHAR2(36) default nvl(SYS_CONTEXT('SDP_CONTEXT','orgid'),'2') not null,
update_control_id VARCHAR2(36) default sys_guid() not null
)
tablespace EB_DATA_TBS
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64
next 1
minextents 1
maxextents unlimited
);
-- Add comments to the table
comment on table T_EB_SYS_DN_SEQUENCE_CONFIG
is 'T_SEQUENCE_CONFIG';
-- Add comments to the columns
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.sequence_id
is '流水号ID';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.sequence_name
is '流水号名称 流水号名称必须唯一';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.sequence_desc
is '流水号描述 对流水号的说明';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.sequence_len
is '流水号长度 如4表示0001这种,6表示000001这种';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.reset_type
is '重置类型 0不重置,1按年,2按月,3按日';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.separator
is '分隔符 分隔流水号各部分的连接符,如-,则生成的流水号为 前缀-日期-流水号形式,如果为空,则各部分没有连接符号';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.prefix
is '前缀';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.date_format
is '日期格式 日期格式格式可以是yyyy yy mm dd hh ii ss的组合,如yyyymm,yy-mm,yyyymmdd,yyyymmdd-hh等,如果按年重置,则日期格式中必须有年,如果按月重置,则日期格式中必须有月.如果不重置,则日期格式不限定,甚至可以为空';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.current_value
is '当前流水号 流水号当前值,如234表示当前的流水号生成到了234,下一个为234+STEP(步长)';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.initial_value
is '初始值 初始流水号是多少,默认是0';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.step
is '步长 每个流水号生成间隔是多少,如2,表示每个生成0001,0003这种流水号';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.creator
is '创建人';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.created_date
is '创建时间';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.modifier
is '最后更新人员';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.last_updated_date
is '最后更新时间';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.is_enable
is '是否可用';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.sdp_user_id
is 'SDP用户ID';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.sdp_org_id
is 'SDP组织ID';
comment on column T_EB_SYS_DN_SEQUENCE_CONFIG.update_control_id
is '并发控制字段';
-- Create/Recreate primary, unique and foreign key constraints
alter table T_EB_SYS_DN_SEQUENCE_CONFIG
add constraint PK_RDP_SYS_SEQUENCE_CONFIG primary key (SEQUENCE_ID)
using index
tablespace EB_IDX_TBS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Create/Recreate check constraints
alter table T_EB_SYS_DN_SEQUENCE_CONFIG
add constraint CK_SEQUENCE_DATE_FORMAT
check (RESET_TYPE=0
OR (RESET_TYPE=1 AND INSTR(UPPER(DATE_FORMAT),'Y',1,1)>0)
OR (RESET_TYPE=2 AND INSTR(UPPER(DATE_FORMAT),'Y',1,1)>0 AND INSTR(UPPER(DATE_FORMAT),'M',1,1)>0)
OR (RESET_TYPE=3 AND INSTR(UPPER(DATE_FORMAT),'Y',1,1)>0 AND INSTR(UPPER(DATE_FORMAT),'M',1,1)>0 AND INSTR(UPPER(DATE_FORMAT),'D',1,1)>0));
alter table T_EB_SYS_DN_SEQUENCE_CONFIG
add constraint CK_SEQUENCE_RESET_TYPE
check (RESET_TYPE IN (0,1,2,3));
-- Grant/Revoke object privileges
grant select, insert, update, delete on T_EB_SYS_DN_SEQUENCE_CONFIG to BOM;

调用存储过程:

CREATE OR REPLACE PROCEDURE P_EB_GET_SEQUENCE(PARA_SEQUENCE_NAME   VARCHAR2,
PARA_DYNAMIC_CONTENT VARCHAR2,
PARA_SEQUENCE OUT VARCHAR2) IS
V_SEQUENCE_LEN INTEGER;
V_RESET_TYPE INTEGER;
V_SEPARATOR VARCHAR2(10);
V_PREFIX VARCHAR2(50);
V_DATE_FORMAT VARCHAR2(50);
V_CURRENT_VALUE INTEGER;
V_INITIAL_VALUE INTEGER;
V_STEP INTEGER;
V_LAST_UPDATED_DATE TIMESTAMP;
V_YYYY VARCHAR2(4);
V_MM VARCHAR2(2);
V_DD VARCHAR2(2);
V_HH VARCHAR2(2);
V_II VARCHAR2(2);
V_SS VARCHAR2(2);
V_DATESTRFULL VARCHAR2(50);
V_DATESTR VARCHAR2(50); BEGIN
--设置事务隔离级别为序列化,防止并发产生相同的流水号
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; SELECT SEQUENCE_LEN,
RESET_TYPE,
SEPARATOR,
PREFIX,
UPPER(DATE_FORMAT),
CURRENT_VALUE,
INITIAL_VALUE,
STEP,
LAST_UPDATED_DATE
INTO V_SEQUENCE_LEN,
V_RESET_TYPE,
V_SEPARATOR,
V_PREFIX,
V_DATE_FORMAT,
V_CURRENT_VALUE,
V_INITIAL_VALUE,
V_STEP,
V_LAST_UPDATED_DATE
FROM T_EB_SYS_DN_SEQUENCE_CONFIG
WHERE SEQUENCE_NAME = PARA_SEQUENCE_NAME; --日期生成 日期全字符串 YYYY-MM-DD HH:MM:SS
V_DATESTRFULL := TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS');
V_YYYY := SUBSTR(V_DATESTRFULL, 1, 4);
V_MM := SUBSTR(V_DATESTRFULL, 6, 2);
V_DD := SUBSTR(V_DATESTRFULL, 9, 2);
V_HH := SUBSTR(V_DATESTRFULL, 12, 2);
V_II := SUBSTR(V_DATESTRFULL, 15, 2);
V_SS := SUBSTR(V_DATESTRFULL, 18, 2); IF V_DATE_FORMAT IS NOT NULL THEN
BEGIN
V_DATESTR := REPLACE(V_DATE_FORMAT, 'YYYY', V_YYYY);
V_DATESTR := REPLACE(V_DATESTR, 'YY', SUBSTR(V_YYYY, -2));
V_DATESTR := REPLACE(V_DATESTR, 'MM', V_MM);
V_DATESTR := REPLACE(V_DATESTR, 'M', SUBSTR(V_MM, -1));
V_DATESTR := REPLACE(V_DATESTR, 'DD', V_DD);
V_DATESTR := REPLACE(V_DATESTR, 'D', SUBSTR(V_DD, -1));
V_DATESTR := REPLACE(V_DATESTR, 'HH', V_HH);
V_DATESTR := REPLACE(V_DATESTR, 'H', SUBSTR(V_HH, -1));
V_DATESTR := REPLACE(V_DATESTR, 'II', V_II);
V_DATESTR := REPLACE(V_DATESTR, 'I', SUBSTR(V_II, -1));
V_DATESTR := REPLACE(V_DATESTR, 'SS', V_SS);
V_DATESTR := REPLACE(V_DATESTR, 'S', SUBSTR(V_SS, -1));
END;
END IF; IF V_RESET_TYPE <> 0 THEN
BEGIN IF (V_RESET_TYPE = 1 AND TO_CHAR(SYSDATE,'YYYY')>TO_CHAR(V_LAST_UPDATED_DATE,'YYYY'))
OR (V_RESET_TYPE = 2 AND TO_CHAR(SYSDATE,'YYYYMM')>TO_CHAR(V_LAST_UPDATED_DATE,'YYYYMM'))
OR (V_RESET_TYPE = 3 AND TO_CHAR(SYSDATE,'YYYYMMDD')>TO_CHAR(V_LAST_UPDATED_DATE,'YYYYMMDD')) THEN
V_CURRENT_VALUE := V_INITIAL_VALUE;
ELSE
V_CURRENT_VALUE := V_CURRENT_VALUE + V_STEP;
END IF;
END;
ELSE
BEGIN
V_CURRENT_VALUE := V_CURRENT_VALUE + V_STEP;
END;
END IF;
PARA_SEQUENCE := CASE WHEN V_PREFIX IS NOT NULL THEN V_PREFIX || V_SEPARATOR END
|| CASE WHEN PARA_DYNAMIC_CONTENT IS NOT NULL THEN PARA_DYNAMIC_CONTENT || V_SEPARATOR END
|| CASE WHEN V_DATESTR IS NOT NULL THEN V_DATESTR || V_SEPARATOR END
|| LPAD(TO_CHAR(V_CURRENT_VALUE), V_SEQUENCE_LEN, '0'); UPDATE T_EB_SYS_DN_SEQUENCE_CONFIG
SET CURRENT_VALUE = V_CURRENT_VALUE,LAST_UPDATED_DATE = SYSDATE
WHERE SEQUENCE_NAME = PARA_SEQUENCE_NAME; COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END;

Oracle主键自动生成_表and存储过程的更多相关文章

  1. SQL Server主键自动生成_表and存储过程

    主键表: CREATE TABLE [dbo].[KEYCODE]( [KeyName] [varchar](12) NOT NULL, [KeyTableName] [varchar](40) NU ...

  2. MySql主键自动生成,表、实体、C#调用方法

    1.表:mysql建表语句 DROP TABLE IF EXISTS `keycode`; CREATE TABLE `keycode` ( `Id` ) NOT NULL AUTO_INCREMEN ...

  3. oracle 主键自动增长

    oracle 主键自动增长 2009-12-11 16:07:00|  分类: 数据库资料|字号 订阅     这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create tabl ...

  4. hibernate主键自动生成

    Entity类中,主键尽量使用可以为null值的类型,比如Integer,Long,String等,不要用int,long等.因为如果主键为null,则表示该实体类还没有保存到数据库,是一个临时状态( ...

  5. Mybatis「MySQL-Oracle」 中主键自动生成 <selectKey> 序列化

    有时候我们不仅仅是通过返回 int 影响行数来确定数据是否插入成功就行了,因为我们总是会用到这个刚刚插入的自增主键,比如主子表入库,子表需要主表的 id,那这个时候我们再去数据库查就显得有点 low ...

  6. Mysql,SqlServer,Oracle主键自动增长的设置

    1.把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: )); insert into customers ...

  7. Mysql,SqlServer,Oracle主键自动增长的设置

    在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值.例如: CREATE TABLE google(id INT AUTO_INCREMENT PRIMARY ...

  8. Entity Framework Code First 遭遇主键自动生成问题

    4.0后就没有去跟踪后面的版本了.现在直接开始用5.0没想到在做User的GURD时就遭遇insert不进数据问题. ISet<User>.Add(user);_context.SaveC ...

  9. oracle 主键应用序列和触发器实现自动增长

    oracle 主键自动增长 这几天搞Oracle,想让表的主键实现自动增长,查网络实现如下: create table simon_example ( id number(4) not null pr ...

随机推荐

  1. 设计模式之(三)Proxy模式

    今天学习Proxy模式.代理模式是在对已有对象操作困难或者不太方便时,选择用代理的方式对对象进行访问.Proxy实现的方法必须和被代理对象一致. 举一个简单的例子, 有一个Math类实现了IMath接 ...

  2. Android开发详解之onTouch和onClick详解

    android组件中的onTouch,onClick,onLongClick事件发生先后顺序和关联: 一,onTouch返回false 首先是onTouch事件的down事件发生,此时,如果长按,触发 ...

  3. 【HDOJ】2830 Matrix Swapping II

    简单DP. /* 2830 */ #include <iostream> #include <string> #include <map> #include < ...

  4. 从 mian 函数开始一步一步分析 nginx 执行流程(一)

    如不做特殊说明,本博客所使用的 nginx 源码版本是 1.0.14,[] 中是代码所在的文件! 我们先贴出 main 函数的部分代码: [core/nginx.c] int ngx_cdecl ma ...

  5. 如何查看jar包的版本号?

    jar包根目录里的META-INF目录下的MANIFEST.MF文件里一般有会记录版本信息,可以到这个文件里查看   打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录,这个 ...

  6. MapReduce扩展:应用程序如何运行于Hadoop Yarn之上

    1. 背景   “应用程序运行于Hadoop Yarn之上”的需求来源于微博运维数据平台中的调度系统,即调度系统中的任务需要运行于Hadoop Yarn之上.这里的应用程序可以简单理解为一个普通的进程 ...

  7. [SSD大法好]神舟K480-I5-D3鸟枪换炮M6S

    Hello,SSD 期盼已久,终于入手了M6S的256G固态硬盘,白天就不安生一直百度.谷歌.必应,势必要把所有相关消息查个清楚这神舟K480I5D3怎生拆呢. 最后心里隐约有了安装的法门. 但到得开 ...

  8. Python中AND-OR的用法

    学习Python中的lambda函数的时候,才发现原来Python中的AND和OR还可以有一些别的用法.Python中的布尔逻辑计算的结果并非返回布尔值,而是返回它们相互之间的某一个.文章的部分例子来 ...

  9. [git] git 分支管理和工作流程

    分支管理 列举本地分支.下面的 * 是 HEAD 所指向的分支,标识当前工作目录所用的分支.其他分支隐藏在 git 仓库中,通过 git checkout 命令才能访问和修改. $ git branc ...

  10. kafka consumer频繁reblance

    转载请注明地址http://www.cnblogs.com/dongxiao-yang/p/5417956.html 结论与下文相同,kafka不同topic的consumer如果用的groupid名 ...