2013-05-15 49 views
6

Tôi có kinh nghiệm sử dụng MSSQL 2008 và gần đây tôi đã chuyển từ MSSQL sang Oracle 10g. Những người thiết kế bảng (Oracle), có một cột tôi cần trích xuất dữ liệu từ, sử dụng cột loại BLOB cho XML mà họ cần lưu trữ.convert oracle blob thành xml type

Trong MSSQL bạn đã lưu trữ chuỗi XML của mình một cách đơn giản theo loại XML hoặc sử dụng VARCHAR(MAX). Giả sử một bảng myTable với một cột gọi là myColumn mà là một VARCHAR(MAX) chứa <ROOT><a>111</a></ROOT> Nếu bạn muốn chuyển đổi loại VARCHAR(MAX) đến một loại XML bạn chỉ cần viết một cái gì đó như:

SELECT CONVERT(XML, myColumn) FROM myTable 

nếu bạn muốn, sau đó bạn có thể sử dụng XQuery để lấy dữ liệu từ cột được chuyển đổi, như vậy:

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

Làm thế nào bạn sẽ thực hiện được điều tương tự trong Oracle 10g nếu myColumn là một BLOB, mà không cần phải viết một thủ tục lưu trữ nhưng vẫn m aking nó tái sử dụng? Văn bản trong BLOB là UFT-8.

Tôi thực sự đánh giá cao sự trợ giúp của bạn, vì tôi cần điều này một cách nhanh chóng.

Trả lời

2

Bạn có thể chuyển đổi từ BLOB thành CLOB và sau đó chuyển CLOB vào hàm tạo của XMLTYPE. Dưới đây là một chức năng ...

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

Và ví dụ cụ thể của bạn ở trên, bạn có thể sử dụng chức năng EXTRACT():

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

trên sẽ trở XMLTYPE khác. Nếu bạn muốn nhận được giá trị văn bản của nút, bạn có thể sử dụng hàm EXTRACTVALUE() để thay thế.

+0

Xin chào Davmos cảm ơn bạn rất nhiều vì phản hồi của bạn, tôi đang thử giải pháp mà bạn đưa ra. Sẽ cho bạn biết cách hoạt động của nó. – user1279734

+0

Hi Davmos, tôi tiếp tục nhận được một clob trở lại thay vì và XMLTYPE, làm cách nào để có được một loại xml? – user1279734

+0

Hi @ user1279734, hàm ở trên chỉ có thể trả về 'XMLTYPE'. Bạn gọi nó như thế nào? – davmos