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 IS hash_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博客