2013-05-15 16 views
6

Mam doświadczenie w korzystaniu z MSSQL 2008, a ostatnio musiałem przejść z MSSQL na Oracle 10g. Osoby, które zaprojektowały tabelę (Oracle), która ma kolumnę, z której muszę wyodrębnić dane, użyły kolumny typu BLOB dla kodu XML, który należy zapisać.Konwersja kropli oracle do typu xml

W MSSQL po prostu przechowywałbyś swój ciąg XML w typie XML lub używałbyś VARCHAR(MAX). Zakładamy tabelę myTable z kolumną o nazwie myColumn który jest VARCHAR(MAX) zawierający <ROOT><a>111</a></ROOT> Jeśli chcesz przekonwertować typ VARCHAR(MAX) do typu XML byłoby po prostu napisać coś takiego:

SELECT CONVERT(XML, myColumn) FROM myTable 

jeśli chciałeś, można następnie użyć XQuery aby uzyskać dane z kolumny przebudowanej, tak:

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

Jak można osiągnąć to samo w Oracle 10g jeśli myColumn był BLOB, bez konieczności pisania procedury przechowywanej, ale nadal jestem czy można go użyć do ponownego użycia? Tekst w BLOB to UFT-8.

Byłbym wdzięczny za pomoc, ponieważ potrzebuję tego w pośpiechu.

Odpowiedz

2

Można przekonwertować obiekt z obiektu BLOB na obiekt CLOB, a następnie przekazać obiekt CLOB do konstruktora obiektu XMLTYPE. Oto funkcja ...

-- 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; 
/

A dla konkretnego przykładu powyżej można użyć EXTRACT() funkcję:

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

Powyższy powróci kolejny XMLType. Jeśli chcesz uzyskać wartość tekstową węzła, możesz użyć funkcji EXTRACTVALUE().

+0

Hi Davmos bardzo dziękuję za odpowiedź, staram się to rozwiązanie, które dał. Dowiesz Ci, jak to działa. – user1279734

+0

Witaj Davmos, ciągle otrzymuję clob zamiast i XMLTYPE, jak mogę uzyskać typ xml? – user1279734

+0

Hi @ user1279734, powyższa funkcja może tylko zwrócić 'XMLTYPE'. Jak się nazywasz? – davmos