欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 【Oracle专栏】2个入参,生成唯一码处理

【Oracle专栏】2个入参,生成唯一码处理

2025/2/5 20:04:06 来源:https://blog.csdn.net/weixin_42081167/article/details/145066620  浏览:    关键词:【Oracle专栏】2个入参,生成唯一码处理

 Oracle相关文档,希望互相学习,共同进步

风123456789~-CSDN博客


1.背景

        业务需要:2个参数,如 aid+bankid ,两个值是联合主键,需要生成一个固定唯一码,长度有限制32位,为了数据区分判断。

         注意:aid 的长度固定32位,但bankid的长度不固定,最长18位。

2. 分析

        要生成唯一固定码,有的小伙伴可能说 两个值按各自的最长长度拼起来就可以了,不够长度的补齐,如果这样会出现 32+18=50位,但是业务要求只能是32位。

       有的小伙伴说,那用sys_guid()生成一个码可以吗?也不行,因为它通过UUID(Universally Unique Identifier)函数来生成唯一的NewID。虽然UUID函数可以生成一个全局唯一的标识符,但和业务需要中的 aid 和bankid 没有关系,无法完成业务数据区分。

        查阅资料,可以使用 aid 和bankid 这两个参数的组合,并使用Oracle内置的HASH函数,如DBMS_CRYPTO.HASH 或 ORA_HASH实现。

  思路:1)通过 DBMS_CRYPTO.HASH 函数,将两个值的组合,转换为唯一哈希值 RAW

                      ( RAW类型在Oracle中用于存储二进制数据 )

                     DBMS_CRYPTO.HASH (aid || bankid, DBMS_CRYPTO.HASH_SH1)

                  2)将生成的 hash 值,转换为16进制字符串

                  3)  将16进制字符串 位数不够的 转为32位字符串

3. 解决

3.1 创建函数   generate_unique_code

---函数CREATE OR REPLACE FUNCTION generate_unique_code(param1 IN VARCHAR2,param2 IN VARCHAR2
) RETURN VARCHAR2 IShash_raw RAW(55);hex_value VARCHAR2(3000);/*--2024.6.27 FENLGY 数仓唯一键生成 */
BEGIN-- 将两个输入参数连接起来,并使用DBMS_CRYPTO.HASH生成哈希值hash_raw := DBMS_CRYPTO.HASH(SYS.UTL_I18N.STRING_TO_RAW(param1 || param2, 'AL32UTF8'),DBMS_CRYPTO.HASH_SH1);-- 将RAW类型的哈希值转换为十六进制字符串hex_value := RAWTOHEX(hash_raw);-- 由于HASH可能返回少于32字符的十六进制值,因此需要用0在前面填充RETURN LPAD(hex_value, 32, '0');
END;

        发现函数执行时需要权限,执行这个命令需要具有DBA权限的用户授予。

generate_unique_code:
SYS@orcl> grant execute on sys.dbms_crypto to nh_dw_gjpt;Grant succeeded.

3.2 测试

 ok

select generate_unique_code(aid,bankid) ids ,aid,bankid from a ;

项目管理--相关知识   

项目管理-项目绩效域1/2-CSDN博客

项目管理-项目绩效域1/2_八大绩效域和十大管理有什么联系-CSDN博客

项目管理-项目绩效域2/2_绩效域 团不策划-CSDN博客

高项-案例分析万能答案(作业分享)-CSDN博客

项目管理-计算题公式【复习】_项目管理进度计算题公式:乐观-CSDN博客

项目管理-配置管理与变更-CSDN博客

项目管理-项目管理科学基础-CSDN博客

项目管理-高级项目管理-CSDN博客

项目管理-相关知识(组织通用治理、组织通用管理、法律法规与标准规范)-CSDN博客


Oracle其他文档,希望互相学习,共同进步

Oracle-找回误删的表数据(LogMiner 挖掘日志)_oracle日志挖掘恢复数据-CSDN博客

oracle 跟踪文件--审计日志_oracle审计日志-CSDN博客

ORA-12899报错,遇到数据表某字段长度奇怪现象:“Oracle字符型,长度50”但length查却没有50_varchar(50) oracle 超出截断-CSDN博客

EXP-00091: Exporting questionable statistics.解决方案-CSDN博客

Oracle 更换监听端口-CSDN博客

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com