【发布时间】:2014-01-13 21:19:00
【问题描述】:
有没有办法创建一个SQL 脚本,将Oracle RAW(16) 列表转换为GUID?
我需要找到一种简单快速的方法来转换大约 1400 万个项目。我已将列表导出到多个分隔文件中,并且可以将这些数据导入到架构中。
【问题讨论】:
有没有办法创建一个SQL 脚本,将Oracle RAW(16) 列表转换为GUID?
我需要找到一种简单快速的方法来转换大约 1400 万个项目。我已将列表导出到多个分隔文件中,并且可以将这些数据导入到架构中。
【问题讨论】:
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
【讨论】:
RAWTOHEX 示例显示了如何将 RAW(16) 更改为未格式化的 GUID,即 CHAR(32)。 REGEXP_REPLACE 示例显示如何将 RAW(16) 更改为破折号格式的 GUID,即 CHAR(36)。就个人而言,我会将其存储为RAW(16),这是Oracle SYS_GUID() 函数返回的内容,并根据需要对其进行格式化以供显示。但这只是我的偏好。正如我的回答中的第一个示例所示,您可以在 RAW(16) 列中查询 GUID 值,而无需使用任何特殊技巧。
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...