首页 新闻 会员 周边

一个Oracle的存储过程生成人员编码,形如200600001;年份+5位递增整数,每新的一年编号重新归0

0
悬赏园豆:80 [已关闭问题] 关闭于 2017-01-18 13:15

一个Oracle的存储过程生成人员编码,形如200600001;年份+5位递增整数,每新的一年编号重新归0

这个第一次做,不会,能写详细一点吗?

君九彧的主页 君九彧 | 初学一级 | 园豆:29
提问于:2017-01-17 10:12
< >
分享
所有回答(1)
0

DECLARE
  N_SEQ NUMBER := 1;
  V_SEQ VARCHAR2(5);
  D_START_DATE DATE := DATE'2016-12-25';
  D_END_DATE DATE := DATE'2017-01-17';
  D_TMP_DATE DATE := D_START_DATE;
BEGIN
  WHILE D_TMP_DATE <= D_END_DATE LOOP
    V_SEQ := LPAD(N_SEQ, 5, '0');
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_TMP_DATE, 'YYYY') || V_SEQ);
   
    IF TO_CHAR(D_TMP_DATE, 'YYYY') <> TO_CHAR(D_TMP_DATE + 1, 'YYYY') THEN
      N_SEQ := 1;
    ELSE
      N_SEQ := N_SEQ + 1;
    END IF;
   
      
    D_TMP_DATE := D_TMP_DATE + 1;
  END LOOP;
END;

Antoni | 园豆:207 (菜鸟二级) | 2017-01-17 11:00

弄了个例子给你

支持(0) 反对(0) Antoni | 园豆:207 (菜鸟二级) | 2017-01-17 11:02

我要显示在表xyjbxx,写在哪里呢

 

支持(0) 反对(0) 君九彧 | 园豆:29 (初学一级) | 2017-01-17 11:02

@君九彧: 我这个例子不是生成了员工编号嘛,DBMS_OUTPUT.PUT_LINE(TO_CHAR(D_TMP_DATE, 'YYYY') || V_SEQ);这段代码就是最终的生成结果,你先用代码看看效果,然后再改造为你需要的功能

支持(0) 反对(0) Antoni | 园豆:207 (菜鸟二级) | 2017-01-17 11:12

@Antoni: 就是这个效果,1.但是我需要的是2017年以前的,2.我怎么把它关联到我的表上呢?

谢谢

支持(0) 反对(0) 君九彧 | 园豆:29 (初学一级) | 2017-01-17 11:17

@Antoni: 我这个时间是人员自带的时间,字段名是tbsj,这里要怎么改呢

支持(0) 反对(0) 君九彧 | 园豆:29 (初学一级) | 2017-01-17 11:18

@君九彧: 1、第一个问题,看来你是要修复历史数据

              2、你的业务表可以根据TBSJ,先进行排序,TBSJ最早的优先处理(用游标),把我的代码移植过去

支持(0) 反对(0) Antoni | 园豆:207 (菜鸟二级) | 2017-01-17 13:50

@Antoni: 

CREATE OR REPLACE PROCEDURE LOG_SUCCESS (module in varchar2, dscr in varchar2)

IS
PRAGMA AUTONOMOUS_TRANSACTION;
begin
insert into fs_log_syslog(opid,operatetime,result,month,memo,operatetype,moduleid)
values(seq_fs_log.nextval,sysdate,'1',to_char(sysdate,'MM'),dscr,'',module);
commit;
exception when others then
rollback;
end LOG_SUCCESS;

 

我的格式类似这样的,你这个我怎么复制?

支持(0) 反对(0) 君九彧 | 园豆:29 (初学一级) | 2017-01-17 13:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册