8

私は MSSQL 2008 を使用した経験があり、最近 MSSQL から Oracle 10g に移行する必要がありました。データを抽出する必要がある列を持つ (Oracle) テーブルを設計した人々は、BLOB格納する必要がある XML に型列を使用しました。

MSSQL では、単純に XML 文字列をXML型に格納するか、VARCHAR(MAX). タイプをタイプに変換したい場合は、単純に次のように記述しmyTableます。myColumnVARCHAR(MAX)<ROOT><a>111</a></ROOT>VARCHAR(MAX)XML

SELECT CONVERT(XML, myColumn) FROM myTable

必要に応じて、次のように XQuery を使用して、変換された列からデータを取得できます。

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

myColumn が である場合、Oracle 10gBLOBでストアド プロシージャを作成せずに再利用可能にする方法で同じことを達成するにはどうすればよいでしょうか? BLOB のテキストはUFT-8.

急ぎでお願いしたいので、よろしくお願いします。

4

3 に答える 3

9
select
XMLType( BLOB_COLUMN,
         1 /* this is your character set ID.
                   1 == USASCII */
       ) as XML
from my_table;
于 2013-06-07T17:52:01.007 に答える
4

BLOB から CLOB に変換し、その CLOB を のコンストラクタに渡すことができます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()代わりに関数を使用できます。

于 2013-05-15T07:12:27.313 に答える
1

myColumn が BLOB の場合

SELECT EXTRACT(XMLTYPE.CREATEXML(myColumn), '/ROOT/a')
FROM myTable;

ソース:

于 2016-06-01T11:03:42.653 に答える