|
Werden über Webservices Binärdaten geliefert,
müssen diese Daten in druckbare Zeichen umgewandelt werden.
Damit hinterher die Datei von Zielapplikation gelesen werden kann, muss
der Inhalt dekodiert werden.
Üblich ist die Base64-Kodierung.
Auf Datenbankseite wird also eine Decodierungsfunktion
benötigt. Hier ist sie:
FUNCTION
decode_base64(p_blob_in IN BLOB) RETURN BLOB IS
l_blob
BLOB;
l_result
BLOB;
l_offset
BINARY_INTEGER;
l_buffer_size BINARY_INTEGER;
l_buffer_raw RAW(32767);
BEGIN
IF p_blob_in IS NOT NULL THEN
-- New line every x chars. Decoding must include the line breaks
(unix:10 / win:13+10)!
l_buffer_size := dbms_lob.instr(p_blob_in, utl_raw.cast_to_raw
(chr(10)));
IF l_buffer_size = 0 THEN
-- No new line character found
l_buffer_size := 32767;
END IF;
dbms_lob.createtemporary(l_blob, TRUE);
l_offset := 1;
-- Process chunks in size of l_buffer_size
FOR i IN 1 .. CEIL(dbms_lob.getlength(p_blob_in) / l_buffer_size) LOOP
-- Read a chunk of data
dbms_lob.read(p_blob_in, l_buffer_size, l_offset, l_buffer_raw);
-- Decode data from Base64 to binary
l_buffer_raw := utl_encode.base64_decode(l_buffer_raw);
-- Append decoded characters to variable l_blob
dbms_lob.writeappend(l_blob, utl_raw.length(l_buffer_raw),
l_buffer_raw);
l_offset := l_offset + l_buffer_size;
END LOOP;
l_result := l_blob;
dbms_lob.freetemporary(l_blob);
END IF;
RETURN (l_result);
END
decode_base64; |