搜索
查看: 118|回复: 2

[经验] nc5,nc6数据库主键生成函数

[复制链接]
发表于 2019-7-9 13:58:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
使用方式 insert into XXX (id)values(generatePK('1001'))


nc5 nc6
  1. create or replace function generatePK(corp varchar) return varchar as
  2. /*
  3. * 生成方法参考自中间件内部算法
  4. *输入参数: corp 公司主键
  5. * 输出参数:new_pk 新生成的pk
  6. */
  7. new_oid varchar(14); --the oid string
  8. old_oid varchar(14); --the oid store in the pub_oid
  9. temp_oid varchar(14);
  10. MINI_CODE number(2);
  11. MAX_CODE number(2);
  12. CODE_LENGTH number(2);
  13. tempchar char(1);
  14. tempascii number(2);
  15. carryup boolean;
  16. global_count number(2);
  17. begin
  18. --初始化数据
  19. temp_oid :='';
  20. old_oid := '';
  21. new_oid := '10000000000000';
  22. CODE_LENGTH := 14;
  23. MINI_CODE := 48;
  24. MAX_CODE := 90;

  25. global_count := 14;
  26. --查询该公司下最大的pk
  27. select pub_oid.oid
  28. into old_oid
  29. from pub_oid
  30. where pub_oid.pk_corp = corp;
  31. -- dbms_output.put_line('old_oid=' || old_oid);
  32. --生成新的oid
  33. new_oid := '';
  34. FOR counter IN REVERSE 1..CODE_LENGTH LOOP
  35. carryup := false;
  36. global_count := counter;
  37. tempchar := substr(old_oid,counter,1);
  38. tempascii := ascii(tempchar)+1;

  39. if tempascii > MAX_CODE then
  40. tempascii := MINI_CODE;
  41. carryup := true;
  42. end if;

  43. if tempascii = 58 then
  44. tempascii := 65;
  45. end if;

  46. new_oid := new_oid||chr(tempascii);
  47. if carryup = false then
  48. -- 'ABCD' --> 'DCBA'
  49. for icounter in reverse 1..CODE_LENGTH-global_count+1 loop
  50. tempchar := substr(new_oid,icounter,1);
  51. temp_oid := temp_oid || tempchar;
  52. end loop;
  53. temp_oid := substr(old_oid,1,global_count-1)|| temp_oid;
  54. --变更临时oid为 new_oid
  55. new_oid := temp_oid;
  56. exit; -- 跳出循环
  57. end if;
  58. END LOOP;
  59. --DBMS_OUTPUT.PUT_LINE('老主键:'||corp || 'AA' || old_oid);
  60. --DBMS_OUTPUT.PUT_LINE('新主键:'||corp || 'AA' || new_oid);

  61. --update the new value 更新pk为新生成的pk
  62. update pub_oid set pub_oid.oid = new_oid where pub_oid.pk_corp = corp;
  63. return corp || 'AA' || new_oid;
  64. exception
  65. WHEN NO_DATA_FOUND THEN
  66. --INSERT THE NEW VALUE 插入新的pk
  67. insert into pub_oid
  68. (dr, oid, pk_corp)
  69. values
  70. (0, new_oid, corp);
  71. return corp || 'AA' || new_oid;

  72. WHEN OTHERS THEN
  73. rollback;
  74. DBMS_OUTPUT.PUT_LINE('公司' || corp || '生成主键发生错误');
  75. return corp || 'AA' || new_oid;

  76. end;
复制代码

  1. create or replace function generatePK(corp varchar) return varchar as
  2. /*
  3. * 生成方法参考自中间件内部算法
  4. *输入参数: corp 公司主键
  5. * 输出参数:new_pk 新生成的pk
  6. */
  7. new_oid varchar(14); --the oid string
  8. old_oid varchar(14); --the oid store in the pub_oid
  9. temp_oid varchar(14);
  10. MINI_CODE number(2);
  11. MAX_CODE number(2);
  12. CODE_LENGTH number(2);
  13. tempchar char(1);
  14. tempascii number(2);
  15. carryup boolean;
  16. global_count number(2);
  17. begin
  18. --初始化数据
  19. temp_oid :='';
  20. old_oid := '';
  21. new_oid := '10000000000000';
  22. CODE_LENGTH := 14;
  23. MINI_CODE := 48;
  24. MAX_CODE := 90;

  25. global_count := 14;
  26. --查询该公司下最大的pk
  27. select pub_oid.idnumber
  28. into old_oid
  29. from pub_oid
  30. where pub_oid.pk_corp = corp;
  31. -- dbms_output.put_line('old_oid=' || old_oid);
  32. --生成新的oid
  33. new_oid := '';
  34. FOR counter IN REVERSE 1..CODE_LENGTH LOOP
  35. carryup := false;
  36. global_count := counter;
  37. tempchar := substr(old_oid,counter,1);
  38. tempascii := ascii(tempchar)+1;

  39. if tempascii > MAX_CODE then
  40. tempascii := MINI_CODE;
  41. carryup := true;
  42. end if;

  43. if tempascii = 58 then
  44. tempascii := 65;
  45. end if;

  46. new_oid := new_oid||chr(tempascii);
  47. if carryup = false then
  48. -- 'ABCD' --> 'DCBA'
  49. for icounter in reverse 1..CODE_LENGTH-global_count+1 loop
  50. tempchar := substr(new_oid,icounter,1);
  51. temp_oid := temp_oid || tempchar;
  52. end loop;
  53. temp_oid := substr(old_oid,1,global_count-1)|| temp_oid;
  54. --变更临时oid为 new_oid
  55. new_oid := temp_oid;
  56. exit; -- 跳出循环
  57. end if;
  58. END LOOP;
  59. --DBMS_OUTPUT.PUT_LINE('老主键:'||corp || 'AA' || old_oid);
  60. --DBMS_OUTPUT.PUT_LINE('新主键:'||corp || 'AA' || new_oid);

  61. --update the new value 更新pk为新生成的pk
  62. update pub_oid set pub_oid.idnumber = new_oid where pub_oid.pk_corp = corp;
  63. return corp || 'AA' || new_oid;
  64. exception
  65. WHEN NO_DATA_FOUND THEN
  66. --INSERT THE NEW VALUE 插入新的pk
  67. insert into pub_oid
  68. (dr, idnumber, pk_corp)
  69. values
  70. (0, new_oid, corp);
  71. return corp || 'AA' || new_oid;

  72. WHEN OTHERS THEN
  73. rollback;
  74. DBMS_OUTPUT.PUT_LINE('公司' || corp || '生成主键发生错误');
  75. return corp || 'AA' || new_oid;
  76. end;
复制代码


评分

参与人数 1威望 +10 金币 +20 魅力 +10 收起 理由
stonys + 10 + 20 + 10 很给力!

查看全部评分

发表于 2019-7-9 15:46:52 | 显示全部楼层
厉害了....
回复 支持 反对

使用道具 举报

发表于 2019-7-9 15:47:11 | 显示全部楼层
厉害了....
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

Archiver|手机版|用友之家 ( 蜀ICP备07505338号 ) 川公网安备 51072502110008号

GMT+8, 2019-8-20 07:15 , Processed in 0.016275 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

© 2005-2017

快速回复 返回顶部 返回列表