Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

क्या मैं सीएलओबी कॉलम में बाइनरी स्ट्रिंग स्टोर कर सकता हूं?

सामान्य तौर पर आप ऐसा नहीं कर सकते। विशेष रूप से यदि आपका डेटाबेस यूटीएफ -8 (आजकल डिफ़ॉल्ट) का उपयोग करता है तो आपके पास कई बिट मान हैं जो वैध वर्ण से मेल नहीं खाते हैं और उन्हें प्लेसहोल्डर से बदल दिया जाएगा (आमतौर पर ¿ ) डालने और चयन करते समय।

आप अपने बाइनरी डेटा को बेस 64 स्ट्रिंग के रूप में एन्कोड करने के लिए क्या कर सकते हैं। इंटरफेस पर बाइनरी डेटा ट्रांसफर करने का यह एक बहुत ही सामान्य तरीका है जो केवल टेक्स्ट (जैसे एक्सएमएल फाइल या एसएमटीपी मेल) का समर्थन करता है

अपने बाइनरी डेटा को टेक्स्ट के रूप में एन्कोड करने के लिए इस फ़ंक्शन का उपयोग करें:

FUNCTION EncodeBASE64(InBlob IN BLOB) RETURN CLOB IS

    BlobLen INTEGER := DBMS_LOB.GETLENGTH(InBlob);
    read_offset INTEGER := 1;
    warning INTEGER;

    amount INTEGER := 1440; -- must be a whole multiple of 3
    -- size of a whole multiple of 48 is beneficial to get NEW_LINE after each 64 characters 
    buffer RAW(1440);
    res CLOB := EMPTY_CLOB();

BEGIN

    IF InBlob IS NULL OR NVL(BlobLen, 0) = 0 THEN 
        RETURN NULL;
    ELSIF BlobLen <= 24000 THEN
        RETURN UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(InBlob));
    ELSE
        -- UTL_ENCODE.BASE64_ENCODE is limited to 32k, process in chunks if bigger
        LOOP
            EXIT WHEN read_offset >= BlobLen;
            DBMS_LOB.READ(InBlob, amount, read_offset, buffer);
            res := res || UTL_RAW.CAST_TO_VARCHAR2(UTL_ENCODE.BASE64_ENCODE(buffer));       
            read_offset := read_offset + amount;
        END LOOP;
    END IF;
    RETURN res;

END EncodeBASE64;

और यह फ़ंक्शन वापस BLOB में कनवर्ट करने के लिए

FUNCTION DecodeBASE64(InBase64Char IN CLOB) RETURN BLOB IS

    res BLOB;
    clob_trim CLOB;

    dest_offset INTEGER := 1;
    src_offset INTEGER := 1;
    read_offset INTEGER := 1;
    ClobLen INTEGER := DBMS_LOB.GETLENGTH(InBase64Char);

    amount INTEGER := 1440; -- must be a whole multiple of 4
    buffer RAW(1440);
    stringBuffer VARCHAR2(1440);
    -- BASE64 characters are always simple ASCII. Thus you get never any Mulit-Byte character and having the same size as 'amount' is sufficient

BEGIN

    IF InBase64Char IS NULL OR NVL(ClobLen, 0) = 0 THEN 
        RETURN NULL;
    ELSIF ClobLen <= 32000 THEN
        RETURN TO_BLOB(UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(InBase64Char)));
    ELSE
        -- Remove all NEW_LINE from base64 string
        DBMS_LOB.CREATETEMPORARY(clob_trim, TRUE);
        LOOP
            EXIT WHEN read_offset > ClobLen;
            stringBuffer := REPLACE(REPLACE(DBMS_LOB.SUBSTR(InBase64Char, amount, read_offset), CHR(13), NULL), CHR(10), NULL);
            DBMS_LOB.WRITEAPPEND(clob_trim, LENGTH(stringBuffer), stringBuffer);
            read_offset := read_offset + amount;
        END LOOP;

        read_offset := 1;
        ClobLen := DBMS_LOB.GETLENGTH(clob_trim);
        DBMS_LOB.CREATETEMPORARY(res, TRUE);
        LOOP
            EXIT WHEN read_offset > ClobLen;
            buffer := UTL_ENCODE.BASE64_DECODE(UTL_RAW.CAST_TO_RAW(DBMS_LOB.SUBSTR(clob_trim, amount, read_offset)));
            DBMS_LOB.WRITEAPPEND(res, DBMS_LOB.GETLENGTH(buffer), buffer);
            read_offset := read_offset + amount;
        END LOOP;
        DBMS_LOB.FREETEMPORARY(clob_trim);
    END IF;

    RETURN res;    

END DecodeBASE64;

आपको इंटरनेट पर कई ऑनलाइन बेस 64 डिकोडर/एनकोडर मिलते हैं जहां आप अपनी प्रक्रिया को सत्यापित कर सकते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQLRecoverableException:I/O अपवाद:कनेक्शन रीसेट

  2. Oracle में DATEADD () के लिए समतुल्य कार्य

  3. Oracle में तालिका परिभाषा कैसे प्राप्त करें?

  4. Oracle SID और सेवा का नाम; कनेक्शन समस्याएं

  5. Oracle स्ट्रीम द्वारा कैप्चर की जाने वाली असमर्थित तालिकाओं को छोड़कर