有没有一种方法可以创建一个
我需要找到一种简单快捷的方法来转换大约 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)
,这也是OracleSYS_GUID()
函数返回的类型,并根据需要进行格式化显示。但这只是我的个人偏好。正如我回答中的第一个示例所示,您可以查询RAW(16)
列中的GUID值,而无需采用任何特殊技巧。 - Ed GibbsINSERT ... 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