2013-05-15 39 views
6

Ho esperienza nell'utilizzo di MSSQL 2008 e di recente ho dovuto passare da MSSQL a Oracle 10g. Le persone che hanno progettato la tabella (Oracle), che ha una colonna di cui ho bisogno per estrarre i dati, hanno utilizzato una colonna di tipo BLOB per l'XML che devono memorizzare.convertire blob oracle in xml tipo

In MSSQL si sarebbe semplicemente memorizzata la stringa XML in un tipo XML o utilizzato un VARCHAR(MAX). Assumere un tavolo myTable con una colonna chiamata myColumn che è un VARCHAR(MAX) contenente <ROOT><a>111</a></ROOT> Se si voleva convertire il tipo VARCHAR(MAX) a un tipo XML si dovrebbe semplicemente scrivere qualcosa di simile:

SELECT CONVERT(XML, myColumn) FROM myTable 

se si voleva, si potrebbe quindi usare XQuery per ottenere i dati dalla colonna convertito, in questo modo:

SELECT CONVERT(XML, myColumn).query('/ROOT/a') 

Come vi ottenere la stessa cosa in Oracle 10g se MyColumn era un BLOB, senza dover scrivere una stored procedure, ma ancora m rendendolo riutilizzabile? Il testo nel BLOB è UFT-8.

Apprezzerei molto la vostra assistenza, in quanto ho bisogno di questo in fretta.

risposta

2

È possibile convertire da un BLOB a CLOB e quindi passare il CLOB al costruttore di XMLTYPE. Ecco una funzione ...

-- PL/SQL function to convert a BLOB to an XMLTYPE 
-- Usage: SELECT blob_to_xmltype(blob_column) FROM table_name; 

CREATE OR REPLACE FUNCTION blob_to_xmltype (blob_in IN BLOB) 
RETURN XMLTYPE 
AS 
    v_clob CLOB; 
    v_varchar VARCHAR2(32767); 
    v_start PLS_INTEGER := 1; 
    v_buffer PLS_INTEGER := 32767; 
BEGIN 
    DBMS_LOB.CREATETEMPORARY(v_clob, TRUE); 

    FOR i IN 1..CEIL(DBMS_LOB.GETLENGTH(blob_in)/v_buffer) 
    LOOP 
    v_varchar := UTL_RAW.CAST_TO_VARCHAR2(DBMS_LOB.SUBSTR(blob_in, v_buffer, v_start)); 
    DBMS_LOB.WRITEAPPEND(v_clob, LENGTH(v_varchar), v_varchar); 
    v_start := v_start + v_buffer; 
    END LOOP; 

    RETURN XMLTYPE(v_clob); 
END blob_to_xmltype; 
/

E per il vostro esempio specifico di cui sopra è possibile utilizzare la funzione di EXTRACT():

SELECT extract(blob_to_xmltype(myColumn), '/ROOT/a') FROM table_name; 

È possibile che questo tornerà un'altra XMLTYPE. Se si desidera ottenere il valore di testo del nodo, è possibile utilizzare invece la funzione EXTRACTVALUE().

+0

Hi Davmos la ringrazio molto per la risposta, sto provando che la soluzione che ti ha dato. Ti farò sapere come funziona. – user1279734

+0

Ciao Davmos, continuo a recuperare un clob invece di XMLTYPE, come ottengo un tipo xml? – user1279734

+0

Salve @ user1279734, la funzione sopra riportata può restituire solo 'XMLTYPE'. Come lo chiami? – davmos

Problemi correlati