将Raw(16)转换为GUID

9
有没有一种方法可以创建一个 SQL 脚本,将Oracle RAW(16) 列表转换为 GUID
我需要找到一种简单快捷的方法来转换大约 1400 万个项目。我已经将列表导出到几个分隔文件中,并且能够将此数据导入模式中。
1个回答

9

RAW(16)基本上就是GUID:它是一个16字节的十六进制值。因此,一种选择是将其保持不变。Oracle会在字符和十六进制之间隐式转换,因此如果您正在寻找一个原始值为FE2BF132638011E3A647F0DEF1FEB9E8的行,则可以在查询中使用字符串:

SELECT *
FROM myTable
WHERE myRaw16Column = 'FE2BF132638011E3A647F0DEF1FEB9E8';

如果你想将转换中的RAW(16)更改为CHAR(32),可以像@tbone建议的那样使用RAWTOHEX
INSERT INTO NewTable (myGUIDColumn, ...)
  SELECT RAWTOHEX(myRawColumn), ...
  FROM OldTable

如果你想将它变成一个CHAR(36)的破折号格式的GUID,事情很快就会变得复杂:

INSERT INTO NewTable (myGUIDColumn, ...)
  SELECT REGEXP_REPLACE(myRaw16Column, '(.{8})(.{4})(.{4})(.{4})(.*)', '\1-\2-\3-\4-\5'), ...
  FROM OldTable

我的GUID列是Char(32)数据类型吗?我还需要它以破折号格式化的GUID。 - UNIBALL
RAWTOHEX示例展示了如何将RAW(16)转换为未格式化的GUID,即CHAR(32)REGEXP_REPLACE示例展示了如何将RAW(16)转换为带破折号格式的GUID,即CHAR(36)。个人而言,我会将其存储为RAW(16),这也是Oracle SYS_GUID()函数返回的类型,并根据需要进行格式化显示。但这只是我的个人偏好。正如我回答中的第一个示例所示,您可以查询RAW(16)列中的GUID值,而无需采用任何特殊技巧。 - Ed Gibbs
谢谢Ed。我需要从UNIX中删除大约1400万个文件,目前我唯一能识别它们的方法是通过文件名。文件名看起来像这样。FN {FFEF5B84-D2ED-45E3-9BD6-5C368357428A} {6A6CF41E-BE0F-4892-9808-34EDDD802300}-0.pdf第一个GUID是Object_ID,第二个GUID是对象存储标识符。 但是,数据库将其列在RAW(16)格式中。 我目前拥有需要删除的文件的完整列表,但Object_ID以RAW(16)格式呈现。 如果可以将Object_ID转换为GUID,则可以创建文件列表。 - UNIBALL
1
明白了。我以为你需要将一个表中的值移动到另一个表中,因此使用了 INSERT ... SELECT。抱歉造成困惑。你可以使用 REGEXP_REPLACE 函数获取文件名,例如:SELECT FN{' || REGEXP_REPLACE(Object_ID, '(.{8})(.{4})(.{4})(.{4})(.*)', '\1-\2-\3-\4-\5') || '}{' || REGEXP_REPLACE(Object_Storage_ID, '(.{8})(.{4})(.{4})(.{4})(.*)', '\1-\2-\3-\4-\5') || '}-0.pdf' FROM myTable... - Ed Gibbs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接