2013-05-15 9 views
6

में कनवर्ट करें मुझे एमएसएसएलएल 2008 का उपयोग करने का अनुभव है और मुझे हाल ही में एमएसएसएलएल से ओरेकल 10 जी तक जाना पड़ा। जिन लोगों ने (ओरेकल) तालिका तैयार की है, जिनके पास कॉलम है, उन्हें डेटा निकालने की आवश्यकता है, उन्हें एक्सएमएल के लिए BLOB टाइप कॉलम का उपयोग करने की आवश्यकता है।ऑरैक ब्लॉब को एक्सएमएल प्रकार

एमएसएसक्यूएल में आप बस अपने XML स्ट्रिंग को XML प्रकार में संग्रहीत कर चुके थे या VARCHAR(MAX) का उपयोग किया था। एक कॉलम myColumn कहा जाता है जो एक VARCHAR(MAX)<ROOT><a>111</a></ROOT> युक्त आप एक XML प्रकार आप बस की तरह कुछ लिखते थे करने के लिए VARCHAR(MAX) प्रकार परिवर्तित करने के लिए चाहता है तो है के साथ एक मेज myTable मान लें:

SELECT CONVERT(XML, myColumn) FROM myTable 

यदि आप चाहते थे, तो आप XQuery इस्तेमाल कर सकते हैं परिवर्तित स्तंभ से डेटा प्राप्त करने, इसलिए जैसे:

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

आप Oracle 10g में एक ही बात कैसे पूरा करता है, तो MyColumn एक BLOB था होता है, एक संग्रहीत प्रक्रिया लिखने के लिए, लेकिन अभी भी हूँ बिना यह पुन: प्रयोज्य है? बीएलओबी में पाठ UFT-8 है।

मैं वास्तव में आपकी सहायता की सराहना करता हूं, क्योंकि मुझे जल्दबाजी में इसकी आवश्यकता है।

उत्तर

2

आप एक बीएलओबी से सीएलओबी में परिवर्तित कर सकते हैं और फिर सीएलओबी को XMLTYPE के निर्माता में पास कर सकते हैं। यहाँ एक समारोह है ...

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

और अपने विशिष्ट उदाहरण के लिए आप EXTRACT() समारोह का उपयोग कर सकते ऊपर:

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

ऊपर एक और XMLTYPE वापस आ जाएगी। यदि आप नोड के टेक्स्ट मान प्राप्त करना चाहते हैं, तो आप इसके बजाय EXTRACTVALUE() फ़ंक्शन का उपयोग कर सकते हैं।

+0

हाय Davmos आप अपनी प्रतिक्रिया के लिए बहुत बहुत धन्यवाद, मुझे लगता है कि समाधान है कि आप दे दी है बाहर कोशिश कर रहा हूँ। आपको बताएगा कि यह कैसे काम करता है। – user1279734

+0

हाय डेवमोस, मैं एक्सएमटीटीपीई के बजाए क्लॉब बैक ले रहा हूं, मुझे एक्सएमएल प्रकार कैसे मिलता है? – user1279734

+0

हाय @ user1279734, उपरोक्त फ़ंक्शन केवल 'XMLTYPE' लौटा सकता है। आप इसे कैसे बुला रहे हैं – davmos

संबंधित मुद्दे