分布式通过Oracle 获取表唯一ID(字符串)-函数(按日期)

-- Create table 
create table TB_DIC_SEQUENCE
(
  tc_seq_id          CHAR(24) not null,
  tc_seq_code        VARCHAR2(16) not null,
  tc_seq_name        NVARCHAR2(32),
  tc_seq_mnemonic    VARCHAR2(32),
  tc_seq_prefix      VARCHAR2(4),
  tc_seq_dtrule      VARCHAR2(20),
  tc_seq_suffix      VARCHAR2(4),
  tc_seq_cur         NUMBER(16),
  tc_seq_min         NUMBER(16),
  tc_seq_max         NUMBER(16),
  tc_seq_inc         NUMBER(2),
  tc_seq_loop_flg    CHAR(1),
  tc_seq_ord_no      INTEGER,
  tc_mod_by          CHAR(24),
  tc_mod_name        NVARCHAR2(48),
  tc_mod_dt          DATE,
  tc_seq_cycle_code  CHAR(1),
  tc_seq_cycle_upddt DATE
)
tablespace TS_HIS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Add comments to the table 
comment on table TB_DIC_SEQUENCE
  is '系统序号分配说明表';
-- Add comments to the columns 
comment on column TB_DIC_SEQUENCE.tc_seq_id
  is '系统序号ID';
comment on column TB_DIC_SEQUENCE.tc_seq_code
  is '系统序号编码';
comment on column TB_DIC_SEQUENCE.tc_seq_name
  is '系统序号名称';
comment on column TB_DIC_SEQUENCE.tc_seq_mnemonic
  is '助记码';
comment on column TB_DIC_SEQUENCE.tc_seq_prefix
  is '序号前缀';
comment on column TB_DIC_SEQUENCE.tc_seq_dtrule
  is '序号日期规则';
comment on column TB_DIC_SEQUENCE.tc_seq_suffix
  is '序号后缀';
comment on column TB_DIC_SEQUENCE.tc_seq_cur
  is '序号当前值';
comment on column TB_DIC_SEQUENCE.tc_seq_min
  is '序号最小值';
comment on column TB_DIC_SEQUENCE.tc_seq_max
  is '序号最大值';
comment on column TB_DIC_SEQUENCE.tc_seq_inc
  is '序号增量值';
comment on column TB_DIC_SEQUENCE.tc_seq_loop_flg
  is '是否循环标识';
comment on column TB_DIC_SEQUENCE.tc_seq_ord_no
  is '显示序号';
comment on column TB_DIC_SEQUENCE.tc_mod_by
  is '最后修改人';
comment on column TB_DIC_SEQUENCE.tc_mod_name
  is '修改人姓名';
comment on column TB_DIC_SEQUENCE.tc_mod_dt
  is '最后修改时间';
comment on column TB_DIC_SEQUENCE.tc_seq_cycle_code
  is '循环周期编码(N-无,Y-年,M-月,D-日,W-周)';
comment on column TB_DIC_SEQUENCE.tc_seq_cycle_upddt
  is '循环周期更新日期';
-- Create/Recreate primary, unique and foreign key constraints 
alter table TB_DIC_SEQUENCE
  add constraint PK_TB_DIC_SEQUENCE primary key (TC_SEQ_ID)
  using index 
  tablespace TS_HIS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
alter table TB_DIC_SEQUENCE
  add constraint AK_KEY_2_TB_DIC_S unique (TC_SEQ_CODE)
  using index 
  tablespace TS_HIS
  pctfree 10
  initrans 2
  maxtrans 255
  storage
  (
    initial 64K
    next 1M
    minextents 1
    maxextents unlimited
  );
-- Grant/Revoke object privileges 
grant select on TB_DIC_SEQUENCE to BIOLAP;
grant select on TB_DIC_SEQUENCE to BIQUERY;
grant select on TB_DIC_SEQUENCE to HISQRY;

create or replace function FN_GETBATSEQNOFIXLEN(v_SEQCODE in varchar2,v_SEQNUM IN number) return varchar2 is
  FunctionResult VARCHAR2(4000);
  v_SEQ_PREFIX VARCHAR2(4);
  v_SEQ_DTRULE VARCHAR2(20);
  v_SEQ_SUFFIX VARCHAR2(4);
  v_SEQ_MIN NUMBER(16);
  v_SEQ_MAX NUMBER(16);
  v_SEQ_CUR NUMBER(16);
  v_SEQ_INC NUMBER(2);
  v_SEQ_LOOP_FLG CHAR(1);
  v_SEQ_CYCLE_CODE CHAR(1);
  v_SEQ_CYCLE_UPDDT DATE;
  v_SEQ_CYCLE_UPDDTNEW DATE;
  v_i NUMBER(3);
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  Begin
    FunctionResult:='';
    IF v_SEQNUM>160 THEN
      return(FunctionResult);
    END IF;

    select TC_SEQ_PREFIX,TC_SEQ_SUFFIX,TC_SEQ_MIN,TC_SEQ_MAX,TC_SEQ_CUR,TC_SEQ_INC,TC_SEQ_LOOP_FLG,TC_SEQ_DTRULE,TC_SEQ_CYCLE_CODE,TC_SEQ_CYCLE_UPDDT
      into v_SEQ_PREFIX,v_SEQ_SUFFIX,v_SEQ_MIN,v_SEQ_MAX,v_SEQ_CUR,v_SEQ_INC,v_SEQ_LOOP_FLG,v_SEQ_DTRULE,v_SEQ_CYCLE_CODE,v_SEQ_CYCLE_UPDDT
        from TB_DIC_SEQUENCE where TC_SEQ_CODE=v_SEQCODE;
    SELECT decode(v_SEQ_CYCLE_CODE,'Y',decode(trunc(v_SEQ_CYCLE_UPDDT,'YYYY'),trunc(SYSDATE,'YYYY'),v_SEQ_CUR,v_SEQ_MIN)
      ,'M',decode(trunc(v_SEQ_CYCLE_UPDDT,'MM'),trunc(SYSDATE,'MM'),v_SEQ_CUR,v_SEQ_MIN)
      ,'D',decode(trunc(v_SEQ_CYCLE_UPDDT),trunc(SYSDATE),v_SEQ_CUR,v_SEQ_MIN)
      ,'W',decode(to_char(v_SEQ_CYCLE_UPDDT,'YYWW'),to_char(SYSDATE,'YYWW'),v_SEQ_CUR,v_SEQ_MIN),v_SEQ_CUR) INTO v_SEQ_CUR FROM dual;
    IF v_SEQ_CUR=v_SEQ_MIN THEN
      v_SEQ_CYCLE_UPDDTNEW:=SYSDATE;
   ELSE
      v_SEQ_CYCLE_UPDDTNEW:=v_SEQ_CYCLE_UPDDT;
    END IF;

    IF instr(v_SEQ_DTRULE,'yyyy')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'yyyy',to_char(SYSDATE,'YYYY'));
    END IF;
    IF instr(v_SEQ_DTRULE,'YYYY')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'YYYY',to_char(SYSDATE,'YYYY'));
    END IF;
    IF instr(v_SEQ_DTRULE,'yy')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'yy',to_char(SYSDATE,'YY'));
    END IF;
    IF instr(v_SEQ_DTRULE,'YY')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'YY',to_char(SYSDATE,'YY'));
    END IF;
    IF instr(v_SEQ_DTRULE,'mm')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'mm',to_char(SYSDATE,'MM'));
    END IF;
    IF instr(v_SEQ_DTRULE,'MM')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'MM',to_char(SYSDATE,'MM'));
    END IF;
    IF instr(v_SEQ_DTRULE,'dd')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'dd',to_char(SYSDATE,'DD'));
    END IF;
    IF instr(v_SEQ_DTRULE,'DD')>0 THEN
      v_SEQ_DTRULE:=REPLACE(v_SEQ_DTRULE,'DD',to_char(SYSDATE,'DD'));
    END IF;
    for v_i in 0..v_SEQNUM-1 LOOP
            IF v_i<>0 THEN
        v_SEQ_CUR:=v_SEQ_CUR+v_SEQ_INC;
          END IF;
      IF v_SEQ_CUR>v_SEQ_MAX THEN
        IF v_SEQ_LOOP_FLG='Y' OR v_SEQ_LOOP_FLG='y' OR v_SEQ_LOOP_FLG='1' THEN
          v_SEQ_CUR:=v_SEQ_MIN;
        ELSE
          v_SEQ_CUR:=NULL;
        END IF;
      END IF;
      IF v_SEQ_CUR IS NOT NULL THEN
        FunctionResult:=FunctionResult||v_SEQ_PREFIX||v_SEQ_DTRULE||LPAD(to_char(v_SEQ_CUR),length(to_char(v_SEQ_MAX)),'0')||v_SEQ_SUFFIX;
      ELSE
        FunctionResult := FunctionResult||'ERR_'||to_char(current_timestamp,'yyyymmddhh24missff6');
      END IF;
      IF v_i<v_SEQNUM-1 THEN
        FunctionResult := FunctionResult||',';
      END IF;
    END LOOP;
    IF v_SEQ_CYCLE_UPDDT IS NULL OR v_SEQ_CYCLE_UPDDTNEW<>v_SEQ_CYCLE_UPDDT THEN
      UPDATE TB_DIC_SEQUENCE SET TC_SEQ_CUR=v_SEQ_CUR+v_SEQ_INC,TC_SEQ_CYCLE_UPDDT=v_SEQ_CYCLE_UPDDTNEW WHERE TC_SEQ_CODE=v_SEQCODE;
    ELSE
      UPDATE TB_DIC_SEQUENCE SET TC_SEQ_CUR=v_SEQ_CUR+v_SEQ_INC WHERE TC_SEQ_CODE=v_SEQCODE;
    END IF;
    COMMIT;
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      FunctionResult:='PFM_'||to_char(current_timestamp,'yyyymmddhh24missff6');
    WHEN OTHERS THEN
      FunctionResult := 'OTH_'||to_char(current_timestamp,'yyyymmddhh24missff6');
      ROLLBACK;
  END;
  return(FunctionResult);
end FN_GETBATSEQNOFIXLEN;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值