Oracle
 sql >> Base de données >  >> RDS >> Oracle

ORACLE RAW au format chaîne vers GUID standard

Un moyen simple consiste à convertir le GUID RAW en VARCHAR lorsque vous le sélectionnez. Ensuite, lisez-le à partir du jeu de résultats en tant que chaîne. Voici la formule :

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

Voici la référence où j'ai trouvé la requête (je dois l'ajuster car l'original contient des erreurs) :https://community.oracle.com/thread/1063096?tstart=0 .

Ou si vous voulez le faire avec Java, alors traduire la solution ci-dessus en Java est assez simple :

/**
 * 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");
}

Une manière plus standard utilisant la classe java.util.UUID n'est pas possible car l'implémentation Oracle de SYS_GUID() n'est pas conforme à la RFC 4122. Voir Est Conforme à la RFC 4122 de l'UUID SYS_GUID() d'Oracle ?