सामान्य तौर पर आप ऐसा नहीं कर सकते। विशेष रूप से यदि आपका डेटाबेस यूटीएफ -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 डिकोडर/एनकोडर मिलते हैं जहां आप अपनी प्रक्रिया को सत्यापित कर सकते हैं।