2013-05-15 4 views
6

MSSQL 2008を使用した経験があり、最近MSSQLからOracle 10gに移行する必要がありました。 データを抽出する必要がある列を持つ(Oracle)表を設計したユーザーは、格納する必要があるXMLにBLOB型の列を使用しました。oracle blobをxml型に変換する

MSSQLでは、単にXML文字列をXMLタイプに格納したか、またはVARCHAR(MAX)を使用しました。あなたは、単にような何かを書くとXML型にVARCHAR(MAX)タイプを変換したい場合は<ROOT><a>111</a></ROOT>を含むVARCHAR(MAX)あるmyColumnと呼ばれる列を持つテーブルmyTableを想定:

あなたが望んだ場合
SELECT CONVERT(XML, myColumn) FROM myTable 

、あなたはその後、XQueryを使用することができます

MYCOLUMNは、ストアドプロシージャが、それでもメートルを記述することなく、 BLOBだった場合は、Oracle 10gで同じことを達成する方法を
SELECT CONVERT(XML, myColumn).query('/ROOT/a') 

:そうのように、変換された列からデータを取得しますそれは再利用可能ですか? BLOB内のテキストはUFT-8です。

私は急いでこれを必要とするので、本当に助けていただきありがとうございます。

答えて

2

BLOBからCLOBに変換し、次にCLOBをコンストラクタXMLTYPEに渡すことができます。別のXMLTYPEを返します上記

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

:ここでは機能...

-- 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()機能を使用することができる上に、あなたの具体的な例です。ノードのテキスト値を取得する場合は、代わりにEXTRACTVALUE()関数を使用できます。複数の文字セットの場合

+0

こんにちはDavmos私はあなたが与えたソリューションをしようとしています、ご回答いただき、誠にありがとうございます。どのように動作するかをお知らせします。 – user1279734

+0

こんにちはダヴモス、私はXMLTYPEの代わりに戻ってclobを取得し続けます、どのようにXML型を取得できますか? – user1279734

+0

こんにちは@ user1279734、上記の関数は 'XMLTYPE'を返すだけです。どうやってそれを呼びますか? – davmos

関連する問題