字符串格式的ORACLE RAW转换为标准GUID

pkwftd7m  于 2022-11-28  发布在  Oracle
关注(0)|答案(3)|浏览(444)

我正在寻找一个解决方案,将StringOracle RAW GUID转换为标准的GUID。我找不到适合我的用例的解决方案。下面是我要寻找的示例:

ORACLE RAW (String): 9BB2A2B8DF8747B0982F2F1702E1D18B

需要使用Java代码将其转换为标准或带括号的GUID,

B8A2B29B-87DF-B047-982F-2F1702E1D18B or {B8A2B29B-87DF-B047-982F-2F1702E1D18B}

提前感谢你的帮助。

xggvc2p6

xggvc2p61#

一个简单的方法是在选择RAW GUID时将其转换为VARCHAR。然后将其作为字符串从结果集中读取。公式如下:

select 
 upper(
    regexp_replace(
        regexp_replace(
            hextoraw('9BB2A2B8DF8747B0982F2F1702E1D18B'),
            '(.{8})(.{4})(.{4})(.{4})(.{12})',
            '\1-\2-\3-\4-\5'
        ),
        '(.{2})(.{2})(.{2})(.{2}).(.{2})(.{2}).(.{2})(.{2})(.{18})',
        '\4\3\2\1-\6\5-\8\7\9'
    )
 ) from dual

这是我找到查询的引用(我必须调整它,因为原始查询有一些错误):https://community.oracle.com/thread/1063096?tstart=0
或者,如果您想使用Java来执行此操作,则将上述解决方案翻译为Java非常简单:

/**
 * input: "9BB2A2B8DF8747B0982F2F1702E1D18B"
 * output: "B8A2B29B-87DF-B047-982F-2F1702E1D18B";
 */
public String hexToStr(String guid) {       
    return guid.replaceAll("(.{8})(.{4})(.{4})(.{4})(.{12})", "$1-$2-$3-$4-$5").replaceAll("(.{2})(.{2})(.{2})(.{2}).(.{2})(.{2}).(.{2})(.{2})(.{18})", "$4$3$2$1-$6$5-$8$7$9");
}

由于SYS_GUID()的Oracle实现与RFC 4122不兼容,因此不可能以更标准的方式使用java.util.UUID类。请参见Is Oracle's SYS_GUID() UUID RFC 4122 compliant?

fjaof16o

fjaof16o2#

我写了一个控制台应用程序来做这个转换。它很有用,因为我每天需要做很多次。
有必要编译并定义path上的输出目录。
https://github.com/lucassc/oracleuuid

xzlaal3s

xzlaal3s3#

SQL版本
1. OracleRaw的GUID
--输入GUID:B 047 - 982 F-2F 1702 E1 D18 B型电动汽车
--输出OracleRaw:9 BB 2A 2B 8DF 8747 B 0982 F2 F1702 E1 D18 B型柴油机

SELECT hextoraw(substr(guid, 7, 2) || substr(guid, 5, 2) ||
            substr(guid, 3, 2) || substr(guid, 1, 2) ||
            substr(guid, 12, 2) || substr(guid, 10, 2) ||
            substr(guid, 17, 2) || substr(guid, 15, 2) ||
            substr(guid, 20, 4) || substr(guid, 25, 12))
FROM (SELECT 'B8A2B29B-87DF-B047-982F-2F1702E1D18B' guid FROM dual);

2. OracleRaw到GUID

--输入Oracle原始数据:9 BB 2A 2B 8DF 8747 B 0982 F2 F1702 E1 D18 B型柴油机
--输出GUID:B 047 - 982 F-2F 1702 E1 D18 B型电动汽车

SELECT UPPER(substr(hextoraw(oracleRaw), 7, 2) || substr(hextoraw(oracleRaw), 5, 2) || 
         substr(hextoraw(oracleRaw), 3, 2) || substr(hextoraw(oracleRaw), 1, 2) || '-' || 
         substr(hextoraw(oracleRaw), 11, 2)|| substr(hextoraw(oracleRaw), 9, 2) || '-' || 
         substr(hextoraw(oracleRaw), 15, 2)|| substr(hextoraw(oracleRaw), 13, 2)|| '-' || 
         substr(hextoraw(oracleRaw), 17, 4)|| '-'|| substr(hextoraw(oracleRaw), 21, 12))
FROM  (SELECT '9BB2A2B8DF8747B0982F2F1702E1D18B' oracleRaw FROM dual);

相关问题