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.