2009-08-01 13 views
0

Hier mein Tisch istWie Daten aus einer langen Spalte Halte XML-Strings extrahieren

MYTABLE(ID NUMBER(10), 
     DATATYPE VARCHAR2(2 BYTE), 
     XMLDATA LONG 
) 

Note1: ich diese Tabelle Note2 nicht ändern kann: Ich

Hier Oracle 10g bin mit ist eine Probe XMLDATA

ich versuchte xmltype(), aber es wird nicht mit einem LONG-Typ (ORA-00997 illegale Nutzung von LONG-Typ) zu arbeiten. Vielleicht sollte ich XMLDATA-Werte in eine neue Tabelle kopieren und in einen CLOB konvertieren, dann kann ich in xmlype konvertieren und EXTRACTVALUE() verwenden?

Was ist der beste Weg, um 'Wert zu erhalten' zu extrahieren?

+0

Lange ist veraltet, verwenden Sie clob oder die neuen XML-Typen. – tuinstoel

+2

@tuinstoel: Siehe Hinweis1 im Text. Tabelle kann nicht geändert werden. – DCookie

Antwort

3

Folgendes ist ein Code, der ein CLOB aus einem LANG beliebiger Länge ausgeben soll. Es entlädt den Körper von MY_TRIGGER zu dbms_output. Wenn es funktioniert, sollten Sie in der Lage sein, das nach Bedarf zu analysieren.

DECLARE 
    c_chunk_limit CONSTANT INTEGER := 100; 

    v_cur     INTEGER := DBMS_SQL.open_cursor; 
    v_offset     INTEGER; 
    v_chunk     VARCHAR2(32767); 
    v_chunk_size    INTEGER; 
BEGIN 
    DBMS_SQL.parse(
     v_cur, 
     'SELECT trigger_body FROM dba_triggers WHERE trigger_name = ''MY_TRIGGER''', 
     DBMS_SQL.native 
    ); 

    DBMS_SQL.define_column_long(v_cur, 1); -- 1 here represents the column position in the select list the long is column#1 

    IF DBMS_SQL.execute_and_fetch(v_cur) > 0 
    THEN 
     v_offset := 0; 

     LOOP 
      DBMS_SQL.column_value_long(
       v_cur, 
       1, -- 1 here represents the column position in the select list the long is column#1 
       c_chunk_limit, 
       v_offset, 
       v_chunk, 
       v_chunk_size 
      ); 

      EXIT WHEN v_chunk_size = 0; 

      v_offset := v_offset + v_chunk_size; 
      DBMS_OUTPUT.put_line(v_chunk); 
     END LOOP; 
    END IF; 

    DBMS_SQL.close_cursor(v_cur); 
END; 
/
+2

+1 für das Beispiel. Wer noch immer davon überzeugt werden muss, dass Oracle LONG böse ist, sollte dies tun :-) – DCookie

Verwandte Themen