我正在尝试寻找一种解决方案,将String RAW GUID以String格式转换为标准GUID格式.我无法找到我的用例的解决方案.这是我正在寻找的一个例子:
ORACLE RAW (String): 9BB2A2B8DF8747B0982F2F1702E1D18B
这需要使用Java代码转换为标准或括号内的GUID
B8A2B29B-87DF-B047-982F-2F1702E1D18B or {B8A2B29B-87DF-B047-982F-2F1702E1D18B}
感谢您的帮助.
最佳答案 一种简单的方法是在选择时将RAW GUID转换为VARCHAR.然后从结果集中将其作为String读取.这是公式:
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");
}
不可能使用类java.util.UUID的更标准方法,因为SYS_GUID()的Oracle实现不符合RFC 4122.请参阅Is Oracle’s SYS_GUID() UUID RFC 4122 compliant?