sql >> Database >  >> RDS >> Oracle

ORACLE RAW in string-indeling naar Standard GUID

Een eenvoudige manier is om de RAW GUID naar VARCHAR te converteren wanneer u deze selecteert. Lees het vervolgens uit de resultaatset als een tekenreeks. Dit is de 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

Dit is de referentie waar ik de query heb gevonden (ik moet deze aanpassen omdat het origineel enkele fouten bevat):https://community.oracle.com/thread/1063096?tstart=0 .

Of als u het met Java wilt doen, is het vrij eenvoudig om de bovenstaande oplossing in Java te vertalen:

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

Een meer standaard manier met de klasse java.util.UUID in niet mogelijk omdat Oracle-implementatie van SYS_GUID() is niet compatibel met RFC 4122. Zie Is Oracle's SYS_GUID() UUID RFC 4122-compatibel?



  1. Inleiding tot PL/SQL-pakketten in Oracle Database

  2. VB6 ADODB.Recordset RecordCount-eigenschap retourneert altijd -1

  3. SQL:Selecteer het laatste record voor elke dag gegeven datetime

  4. Hoe een automatisch ophogingsveld te genereren in de selectiequery