Konvertiere LONG RAW nach CLOB mit Zeichsatzkonvertierung

In Ergänzung zum Beitrag Konvertiere LONG nach CLOB möchte ich heute ein Beispiel vorstellen, wie man eine LONG RAW Spalte nach CLB konvertieren kann, und dabei auch noch auf den Inhalt einen Zeichensatzkonvertierung durchführen kann.

Ausgehend von z.B. folgender Tabelle:

1
2
3
4
CREATE TABLE kunden(
     ID         NUMBER NOT NULL
   , DOKUMENT   LONG RAW NOT NULL
);

kann man die Daten in folgende temporäre Tabelle erzeugen, um das LONG RAW in ein BLOB zu wandeln:

1
2
3
4
5
6
CREATE TABLE kunden_temp
AS
SELECT ID
       , CAST(to_lob(DOKUMENT)  AS  BLOB)   AS DOKUMENT
FROM kunden
;

Die folgende Anweisung liefert dann das CLOB zurück:

1
2
3
4
SELECT ID
       , clobfromblob(DOKUMENT)  AS DOK_CLOB
FROM kunden_temp
;

unter der Voraussetzung, dass die Funktion CLOBFROMBLOB wie folgt definiert ist:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE OR REPLACE FUNCTION clobfromblob(p_blob    IN BLOB) 
        RETURN CLOB
  IS
    v_dest_offsset             INTEGER   := 1;
    v_src_offsset              INTEGER   := 1;
    v_warning                  INTEGER;
    c_lang_context             INTEGER   := dbms_lob.default_lang_ctx;
    v_clob                     CLOB;
    c_charset_id      CONSTANT INTEGER   := NLS_CHARSET_ID('WE8ISO8859P15');
  BEGIN
    DBMS_LOB.CREATETEMPORARY(lob_loc    => v_clob
                           , cache      => TRUE);
 
    IF p_blob IS NULL THEN
      RETURN empty_clob();
    END IF;
 
    dbms_lob.converttoclob(dest_lob        => v_clob
                         , src_blob        => p_blob
                         , amount          => dbms_lob.lobmaxsize
                         , dest_offset     => v_dest_offsset
                         , src_offset      => v_src_offsset
                         , blob_csid       => c_charset_id
                         , lang_context    => c_lang_context
                         , warning         => v_warning);
 
    RETURN v_clob;
  exception
    WHEN others THEN
      RETURN empty_clob();
  END clobfromblob;

Durch das Setzen der Konstanten c_charset_id wird nach der Konvertierung
eine Zeichensatzkonvertierung von ‚WE8ISO8859P15‘ in den aktuellen Zeichensatz der DB vorgenommen.
Damit ist die etwas langsamere Form der Umwandlung eines CLOB ein VARCHAR2 und dann mit Aufruf von utl_raw.convert()
nicht mehr notwendig, hier eingesetzt zu werden.

Viele Spaß und Erfolg.

Kommentar verfassen