【问题标题】:Converting Raw(16) to GUID将 Raw(16) 转换为 GUID
【发布时间】:2014-01-13 21:19:00
【问题描述】:

有没有办法创建一个SQL 脚本,将Oracle RAW(16) 列表转换为GUID

我需要找到一种简单快速的方法来转换大约 1400 万个项目。我已将列表导出到多个分隔文件中,并且可以将这些数据导入到架构中。

【问题讨论】:

    标签: sql oracle guid


    【解决方案1】:

    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
    

    【讨论】:

    • myGUIDColumn 是 Char(32) 数据类型吗?我也确实需要破折号格式的 GUID。
    • RAWTOHEX 示例显示了如何将 RAW(16) 更改为未格式化的 GUID,即 CHAR(32)REGEXP_REPLACE 示例显示如何将 RAW(16) 更改为破折号格式的 GUID,即 CHAR(36)。就个人而言,我会将其存储为RAW(16),这是Oracle SYS_GUID() 函数返回的内容,并根据需要对其进行格式化以供显示。但这只是我的偏好。正如我的回答中的第一个示例所示,您可以在 RAW(16) 列中查询 GUID 值,而无需使用任何特殊技巧。
    • 谢谢埃德。我有大约 1400 万个文件需要从 UNIX 中删除,目前唯一可以识别它们的方法是通过文件名。文件名如下所示。 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,那么我可以创建文件列表。
    • 知道了。我认为您需要将值从一个表移动到另一个表,因此 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...
    猜你喜欢
    • 2014-10-30
    • 2011-11-09
    • 2021-10-23
    • 2021-12-17
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多