Startseite Profil ORACLE PHP VB EXCEL Links Kontakt

Top

Base64

Operator

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;
Version 1.0
04.09.2012