ヘッダーをスキップ
Oracle Data Provider for .NET開発者ガイド
11g リリース1(11.1)
E05791-01
  目次へ
目次
索引へ
索引

戻る
戻る
 
次へ
次へ
 

ODP.NETにおけるXMLのサポート

ODP.NETでは、リレーショナル表、オブジェクト・リレーショナル表およびビューのデータをXML文書形式で抽出できます。データベースに対する挿入、更新および削除の操作にも、XML文書を使用できます。 Oracle Databaseでは、Oracle XML DBにより、データベースでXMLがそのままの形でサポートされています。Oracle XML DBは、高パフォーマンスのXML格納および検索に関連する特殊なテクノロジ・グループです。Oracle XML DBは、SQLおよびXMLの両方のデータ・モデルが高度な相互運用性を持つように組み込まれた、データベースの進化形であり、XMLのネイティブ・サポートが提供されます。

ODP.NETにおけるXMLのサポートに関するサンプルは、次のディレクトリを参照してください。

ORACLE_BASE\ORACLE_HOME\ODP.NET\Samples

この項は次の項目で構成されています。

サポートされるXML機能

ODP.NETにおけるXMLのサポートでは、次の機能が提供されます。

  • XMLデータをそのままの形で、ネイティブなOracle Database型であるXMLTypeとして、データベースに格納します。

  • Oracle DatabaseインスタンスからMicrosoft .NET環境へ、XMLデータとしてリレーショナル・データおよびオブジェクト・リレーショナル・データにアクセスし、Microsoft .NETフレームワークを使用してXMLを処理します。

  • XMLデータを使用してデータベースに変更を保存します。

  • XQuery文を実行します。

.NETアプリケーション開発者を対象として、これらの機能には次のものが含まれます。

  • OracleCommandクラス、OracleConnectionクラスおよびOracleDataReaderクラスに対する拡張機能。

  • 次のXML固有のクラス。

    • OracleXmlType

      OracleXmlTypeオブジェクトは、Oracle固有のXMLTypeデータの取得に使用されます。

    • OracleXmlStream

      OracleXmlStreamオブジェクトは、OracleXmlTypeオブジェクトからXMLデータを読取り専用の.NET Streamオブジェクトとして取得する際に使用されます。

    • OracleXmlQueryProperties

      OracleXmlQueryPropertiesオブジェクトは、XmlCommandTypeプロパティがQueryである場合に、OracleCommandクラスにより使用されるXMLプロパティを表します。

    • OracleXmlSaveProperties

      OracleXmlSavePropertiesオブジェクトは、XmlCommandTypeプロパティがInsertUpdateまたはDeleteである場合に、OracleCommandクラスにより使用されるXMLプロパティを表します。

XQueryサポート

Oracle Database 10gリリース2(10.2)以降、ODP.NETは、SQL/XML関数、XMLQueryおよびXMLTableのネイティブ実装によりXQuery言語をサポートしています。XQuery文の実行時、Oracle XML DBは通常、リレーショナル問合せと同じ基礎構造にXQuery式をコンパイルしてXQuery式を評価します。問合せは最適化され、Oracle XML DBがネイティブXQueryエンジンの役割を果たすように、リレーショナル・データベースおよびXQuery固有の最適化テクノロジの両方が活用されます。すべてのXQuery式の処理は、ネイティブ・コンパイルされているか機能上の評価が行われているかに関係なく透過的となります。つまり、プログラマはXQueryの最適化を利用するようコードを変更する必要はありません。


参照:

Oracle's XQueryサポートの詳細は、『Oracle XML DB開発者ガイド』を参照してください。

OracleXmlTypeおよび接続依存性

OracleXmlTypeクラスの読取り専用のConnectionプロパティは、OracleXmlTypeクラスのインスタンス化に使用されるOracleConnectionオブジェクトへの参照を保持します。

OracleXmlTypeオブジェクトがOracleConnectionオブジェクトへの参照を取得する方法は、OracleXmlTypeクラスがインスタンス化される方法に応じて異なります。

  • GetOracleXmlTypeメソッド、GetOracleValueメソッドまたはGetOracleValuesメソッドを使用してOracleDataReaderクラスからインスタンス化された場合

    Connectionプロパティは、OracleDataReaderオブジェクトにより使用される同じOracleConnectionオブジェクトへの参照によって設定されます。

  • OracleConnection型のいずれかのパラメータにより、OracleXmlTypeコンストラクタを起動してインスタンス化された場合

    Connectionプロパティは、コンストラクタに指定された同じOracleConnectionオブジェクトへの参照によって設定されます。

  • OracleXmlType(OracleClob)コンストラクタを起動してインスタンス化された場合

    Connectionプロパティは、OracleClobオブジェクトにより使用されるOracleConnectionオブジェクトへの参照によって設定されます。

ある接続に関連付けられたOracleXmlTypeオブジェクトは、別の接続に使用できません。たとえば、あるOracleXmlTypeオブジェクトがOracleConnection Aを使用して取得される場合、そのOracleXmlTypeオブジェクトはOracleConnection Bを使用するコマンドの入力パラメータとして使用できません。アプリケーションは、OracleXmlTypeオブジェクトのConnectionプロパティをチェックすることで、OracleXmlTypeオブジェクトが、その接続プロパティで参照されるOracleConnectionのコンテキスト内でのみ使用されることを保証できます。それ以外の場合、ODP.NETでは例外が発生します。

データベースでのXMLTypeデータの更新

XMLType列の更新には、トランザクションは必要ありません。ただし、データベースの更新プロセス全体をトランザクション内にカプセル化することをお薦めします。これにより、エラーが発生した場合に更新をロールバックできます。

データベース内のXMLType列をOracle Data Provider for .NETを使用して更新するには、次のように複数の方法があります。

DataSet、OracleDataAdapterおよびOracleCommandBuilderによる更新

XMLType列がDataSetにフェッチされた場合、XMLTypeデータは.NET Stringとして表されます。

DataSet内のXMLTypeデータの変更には、特別な処理は必要ありません。XMLTypeデータは、DataSetに格納されたデータと同様に変更できます。変更が加えられ、OracleDataAdapter.Updateメソッドが起動されると、OracleDataAdapterオブジェクトにより、XMLTypeデータが確実に正しく処理されます。OracleDataAdapterオブジェクトでは、提供されているカスタムSQL文のINSERTUPDATEまたはDELETEが使用されます。それ以外の場合は、データベース・サーバーへの変更をフラッシュする際に、必要に応じてOracleCommandBuilderオブジェクトにより有効なSQL文が生成されます。

OracleCommandおよびOracleParameterによる更新

OracleCommandクラスは、特にOracleParameterオブジェクトの使用により、XMLTypeデータを更新するための強力な手段となります。データベース表内の列を更新するには、列の新しい値をコマンドの入力パラメータとして渡すことができます。

入力バインド

データベース内のXMLType列を更新するには、静的な値を使用してSQL文を実行できます。さらに、入力パラメータをSQL文、無名PL/SQLブロックまたはストアド・プロシージャにバインドし、XMLType列を更新できます。パラメータ値は、.NETフレームワーク・タイプ、ODP.NETタイプまたはOracleXmlTypeオブジェクトとして設定できます。

XMLType列はOracleXmlTypeオブジェクトを使用して更新できますが、OracleXmlTypeクラスのインスタンスを保持していても、データベース内のXMLType列を更新できることが保証されるわけではありません。

XMLType列のNULL値への設定

アプリケーションでは、次のように入力バインドを使用する方法または使用しない方法で、データベース内のXMLType列をNULL値に設定できます。

  • 入力バインドによるXMLType列内のNULL値の設定

    XMLType列をNULLに設定するには、アプリケーションにより、値がDBNull.Valueである入力パラメータをバインドできます。これによって、OracleCommandオブジェクトに対し、NULL値が挿入されることが示されます。

    NULLのOracleXmlTypeオブジェクトを入力パラメータとして渡した場合、XMLType列にNULLが挿入されません。この場合、OracleCommandオブジェクトでは例外が発生します。

  • 入力バインドを使用しないXMLType列内のNULL値の設定

    次の例では、入力バインドを使用せずにXMLType列でNULL値を設定する方法を示しています。

    // Create a table with an XMLType column in the database
    CREATE TABLE XML_TABLE(NUM_COL number, XMLTYPE_COL xmltype);
    
    

    アプリケーションでは、明示的にNULLを挿入するか、または次の例のようにXMLType列になにも挿入しないことで、この列にNULL値を設定できます。

    insert into xml_table(xmltype_col) values(NULL);
    
    
    update xml_table t set t.xmltype_col=NULL;
    
    

XMLType列の空のXMLデータへの設定

XMLType列は、次のSQL文を使用して、空のXMLデータにより初期化できます。

// Create a table with an XMLType column in the database
CREATE TABLE XML_TABLE(NUM_COL number, XMLTYPE_COL xmltype);

INSERT INTO XML_TABLE (NUM_COL, XMLTYPE_COL) VALUES (4,
      XMLType.createxml('<DOC/>'));

OracleXmlTypeでのXMLデータの更新

OracleXmlTypeオブジェクトでXMLデータを更新するには、複数の方法があります。

  • OracleXmlTypeオブジェクトのUpdateメソッドにXPATH式および新しい値を渡すことで、XMLデータを更新できます。

  • XMLデータは、OracleXmlTypeオブジェクトのGetXmlDocumentメソッドを使用して、.NETフレームワークのXmlDocumentオブジェクトとしてクライアント側で取得できます。このため、このXMLデータは適切な.NETフレームワーク・クラスを使用して操作できます。.NETフレームワーク・クラスから、更新されたXMLデータにより新規のOracleXmlTypeを作成できます。この新規のOracleXmlTypeは、入力パラメータとしてUPDATE文またはINSERT文にバインドされます。

XMLの特殊文字

表3-15に示す文字は、XMLでは特殊な意味を持ちます。詳細は、XML 1.0の仕様を参照してください。

表3-15 XMLの特殊文字

特殊文字 XMLでの意味 実体エンコード

<


XMLタグの開始

&lt;

>

XMLタグの終了

&gt;

"

引用符

&quot;

'

アポストロフィまたは一重引用符

&apos;

&


アンパサンド

&amp;


これらの文字がXML要素内のデータとして使用されている場合、対応する実体エンコードに置き換えられます。

また、XML要素名では特定の文字が無効です。SQL識別子(列名など)がXML要素名にマップされている場合、これらの文字は、Unicodeの文字エンコードから導出された一連の16進数字に変換され、前置きのアンダースコア、小文字のxおよび後続のアンダースコアで囲まれます。空白はXML要素名では有効な文字ではありません。SQL識別子に空白文字が含まれる場合、対応するXML要素名においては、空白文字が_x0020_に置き換えられます。これは、Unicodeエンコードによる空白文字に基づいています。

問合せの結果セットのXML形式での取得

この項では、SQL問合せから結果セットをXMLデータ形式で取得する方法について説明します。

日時書式の処理

表3-16は、各データベース・リリースにおける、データ取得時の日時書式の処理のリストです。

表3-16 データ取得時の日時書式の処理

データベース・リリース サポートされる日時書式

Oracle9i リリース2(9.2.x)およびOracle Database 10g

Oracle DATE型のデータは、セッションでNLS_DATE_FORMATを使用して指定された書式で取得されます。

TIMESTAMPおよびTIMESTAMP WITH TIME ZONE型のデータは、セッションでNLS_TIMESTAMP_FORMATおよびNLS_TIMESTAMP_TZ_FORMATを使用して指定された書式で取得されます。

結果として得られたXML文書を使用して、データベースに変更を保存する場合は、すべてのDATEおよびTIMESTAMPデータが、ISO日時書式: YYYY-MM-DDThh:mm:ss.sss(ISO書式表記法)の形でXML文書で取得される必要があります。

このためには、問合せを実行する前に、アプリケーションで、セッションにおける次のNLSセッション・パラメータについて、ALTER SESSION文を明示的に実行する必要があります。

  • NLS_DATE_FORMAT : Oracle日時書式(YYYY-MM-DD"T"HH24:MI:SS)に設定する必要があります。

  • NLS_TIMESTAMP_FORMAT: Oracle日時書式(YYYY-MM-DD"T"HH24:MI:SS.FF3)に設定する必要があります。

  • NLS_TIMESTAMP_TZ_FORMAT: Oracle日時書式(YYYY-MM-DD"T"HH24:MI:SS.FF3)に設定する必要があります。

Oracle Database 10gリリース2(10.2)以降

生成されるXMLのDATEおよびTIMESTAMPの形式は、標準XMLスキーマの形式に基づいています。

XMLスキーマ仕様の詳細は、次を参照してください。

http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#isoformats


列データの特殊文字

問合せ内の選択リストの列のデータに、XMLで特殊な意味を持つ文字が含まれる場合(表3-15を参照)、これらの文字は、結果として得られるXML文書では対応する実体エンコードに置き換えられます。

次の例では、ODP.NETで列データ内の山カッコの特殊文字が処理される方法を示しています。

/* Database Setup
connect scott/tiger@oracle
drop table specialchars;
create table specialchars ("id" number, name varchar2(255));
insert into specialchars values (1, '<Jones>');
commit;
*/

// C#

using System;
using System.Data;
using System.Xml;
using Oracle.DataAccess.Client;

class QueryResultAsXMLSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();

    con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;";
    con.Open();

    // Create the command
    OracleCommand cmd = new OracleCommand("", con);

    // Set the XML command type to query.
    cmd.XmlCommandType = OracleXmlCommandType.Query;

    // Set the SQL query
    cmd.CommandText = "select * from specialchars";

    // Set command properties that affect XML query behavior.
    cmd.BindByName = true;

    // Set the XML query properties
    cmd.XmlQueryProperties.MaxRows = -1;

    // Get the XML document as an XmlReader.
    XmlReader xmlReader = cmd.ExecuteXmlReader();
    XmlDocument xmlDocument = new XmlDocument();

    xmlDocument.PreserveWhitespace = true;
    xmlDocument.Load(xmlReader);
    Console.WriteLine(xmlDocument.OuterXml);

    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
  }
}

その表に対して次のXML文書が生成されます。山カッコを表すXML実体エンコードは太字で表示されます。

<?xml version = '1.0'?>
<ROWSET>
   <ROW>
      <id>1</id >
      <NAME>&lt;Jones&gt;</NAME>
   </ROW>
</ROWSET>

表名またはビュー名の特殊文字

表名またはビュー名に英数字以外の文字(アンダースコア(_)を除く)が含まれる場合、この表名またはビュー名は引用符で囲む必要があります。

たとえば、名前がtest'ingの表からすべてのエントリを選択するには、OracleCommandオブジェクトのCommandTextプロパティを次の文字列に設定する必要があります。

"select * from \"test'ing\"";

列名とXML要素名のマッピングにおける大/小文字区別

SQL識別子(列名)とXML要素名のマッピングは大/小文字が区別され、要素名は表またはビューの列名と大/小文字がまったく同じになります。

ただし、ルート・タグ名および行タグ名は大/小文字が区別されません。次の例では、この場合の大/小文字区別を示しています。

//Create the following table
create table casesensitive_table ("Id" number, NAME varchar2(255));

//insert name and id
insert into casesensitive_table values(1, 'Smith');

次のXML文書が生成されます。

<?xml version = '1.0'?>
  <ROWSET>
    <ROW>
      <Id>1</Id>
      <NAME>Smith</NAME>
    </ROW>
  </ROWSET>

Id列の要素名の大/小文字が列名と一致する点に注意してください。

列名とXML要素名のマッピング

SQL問合せにより生成された行ごとに、SQL識別子(列名)が、生成されたXML文書内のXML要素にマップされます。

// Create the following table
create table emp_table (EMPLOYEE_ID NUMBER(4), LAST_NAME varchar2(25));
// Insert some data
insert into emp_table values(205, 'Higgins');

SELECT * FROM EMP_TABLEというSQL問合せにより、次のXML文書が生成されます。

<?XML version="1.0"?>
  <ROWSET>
    <ROW>
      <EMPLOYEE_ID>205</EMPLOYEE_ID>
      <LAST_NAME>Higgins</LAST_NAME>
    </ROW>
  </ROWSET>

employees表のEMPLOYEE_IDおよびLAST_NAMEデータベース表列は、生成されたXML文書のEMPLOYEE_IDおよびLAST_NAME要素にマップされます。

この項では、データベースから問合せ結果をXMLで取得する場合に、Oracle DatabaseがSQL識別子をXML要素名にマッピングする方法を例示します。 この例では、some id列が含まれるspecialchars表を使用します。

// Create the specialchars table
create table specialchars ("some id" number, name varchar2(255));

specialchars表には、空白文字が含まれるsome id列がある点に注意してください。XML要素名では、空白文字は使用できません。

問合せの結果をXMLで取得する場合、問合せの選択リスト内のSQL識別子には、XML要素名では無効となる文字を使用できます。これらのSQL識別子(列名など)がXML要素名にマップされている場合、これらの各文字は、Unicodeの文字エンコードから導出された一連の16進数字に変換され、前置きのアンダースコア、小文字のxおよび後続のアンダースコアで囲まれます。

このため、次の例のSQL問合せを使用して、specialchars表から結果をXML文書で取得できます。

select "some id", name from specialchars;

デフォルト・マッピングの修正

次の方法でXML要素名へのSQL識別子のデフォルト・マッピングを修正できます。

  • ソースを変更します。ソース・スキーマ上にオブジェクト・リレーショナル・ビューを作成し、このビューを新規ソースにします。

  • SQL問合せでカーソル副問合せおよびキャスト多重集合構造を使用します。

  • SQL問合せで列名または属性名の別名を作成します。別名にアットマーク(@)を付加し、別名をXML要素ではなくXML属性にマップします。

  • XML文書を変更します。Extensible Stylesheet Language Transformation(XSLT)を使用してXML文書を変換します。XSL文書およびパラメータを指定します。リレーショナル・データからXML文書が生成された後、変換が自動的に実行されます。これはパフォーマンスに影響する可能性があります。

  • XML文書で使用されるルート・タグおよび行タグの名前を指定します。

オブジェクト・リレーショナル・データ

ODP.NETでは、オブジェクト・リレーショナル列、表およびビューに格納されたデータについて、XML文書を生成できます。

// Create the following tables and types
CREATE TYPE "EmployeeType" AS OBJECT (EMPNO NUMBER, ENAME VARCHAR2(20));
/
CREATE TYPE EmployeeListType AS TABLE OF "EmployeeType";
/
CREATE TABLE mydept (DEPTNO NUMBER, DEPTNAME VARCHAR2(20),
              EMPLIST EmployeeListType)
              NESTED TABLE EMPLIST STORE AS EMPLIST_TABLE;
INSERT INTO mydept VALUES (1, 'depta',
              EmployeeListType("EmployeeType"(1, 'empa')));

この表に対して次のXML文書が生成されます。

<?xml version = "1.0"?>
<ROWSET>
   <ROW>
      <DEPTNO>1</DEPTNO>
      <DEPTNAME>depta</DEPTNAME>
      <EMPLIST>
         <EmployeeType>
            <EMPNO>1</EMPNO>
            <ENAME>empa</ENAME>
         </EmployeeType>
      </EMPLIST>
   </ROW>
</ROWSET>

ODP.NETでは、コレクション要素内の各項目が、コレクション内の要素のデータベース型名で囲まれます。mydept表にはEMPLISTデータベース列にコレクションがあり、このコレクション内の各項目はEmployeeType型です。このため、XML文書では、例に太字で表されるように、コレクション内の各項目が型名EmployeeTypeで囲まれます。

NULL値

データベース行にNULL値の列が含まれる場合、生成されたXML文書内の対応する行には、その列は表示されません。

XMLを使用したデータ操作

この項では、XMLを使用してデータベースのデータに変更を加える方法について説明します。

日時書式の処理

表3-17は、各データベース・リリースにおける、データ保存時の日時書式の処理のリストです。

表3-17 データ保存時の日時書式の処理

データベース・リリース サポートされる日時書式

Oracle9i リリース2(9.2.x)およびOracle Database 10g

DATETIMESTAMPおよびTIMESTAMP WITH TIME ZONE型のすべてのデータは、ISO日時書式YYYY-MM-DDThh:mm:ss.sss(ISO書式表記法)でXML文書に指定される必要があります。

次の文字列は、Oracle日時書式表記法(YYYY-MM-DD"T"HH24:MI:SS.FF3)で表されたISO日時書式表記法です。

XML文書にISO書式表記法を使用するだけでなく、保存を実行する前に、アプリケーションで、セッションにおける次のNLSセッション・パラメータについて、ALTER SESSIONコマンドを明示的に実行する必要があります。

  • NLS_DATE_FORMAT : Oracle日時書式(YYYY-MM-DD"T"HH24:MI:SS)に設定する必要があります。

  • NLS_TIMESTAMP_FORMAT: Oracle日時書式(YYYY-MM-DD"T"HH24:MI:SS.FF3)に設定する必要があります。

  • NLS_TIMESTAMP_TZ_FORMAT: Oracle日時書式(YYYY-MM-DD"T"HH24:MI:SS.FF3)に設定する必要があります。

Oracle Database 10gリリース2(10.2)以降

生成されるXMLのDATEおよびTIMESTAMPの形式は、標準XMLスキーマの形式に基づいています。

XMLスキーマ仕様の詳細は、次を参照してください。

http://www.w3.org/TR/2004/REC-xmlschema-2-20041028/datatypes.html#isoformats


XMLを使用した変更の保存

XMLデータを使用して、データベース表およびビューに変更を保存できます。ただし、挿入、更新および削除の操作は、単一のXML文書では組み合せることができません。ODP.NETでは、単一のXML文書を受け入れて、どの変更が挿入、更新または削除のいずれであるかを判別できません。

挿入変更では挿入する行、更新変更では更新する行、削除変更では削除する行のみが含まれるXML文書である必要があります。

たとえば、HRサンプル・スキーマに付属するemployees表を使用して、次の問合せを指定できます。

select employee_id, last_name from employees where employee_id = 205;

次のXML文書が生成されます。

<?xml version = '1.0'?>
<ROWSET>
   <ROW>
      <EMPLOYEE_ID>205</EMPLOYEE_ID>
      <LAST_NAME>Higgins</LAST_NAME>
   </ROW>
</ROWSET>

従業員205の名前をHigginsからSmithに変更するには、employees表および変更が含まれるXMLデータを次のように指定します。

<?xml version = '1.0'?>
<ROWSET>
   <ROW>
      <EMPLOYEE_ID>205</EMPLOYEE_ID>
      <LAST_NAME>Smith</LAST_NAME>
   </ROW>
</ROWSET>

列データの特殊文字

XML文書内のいずれかの要素のデータに、XMLで特殊な意味を持つ文字が含まれる場合(表3-15を参照)、XML文書では、これらの文字を、適切な実体エンコードに置き換えるか、エスケープ文字を前に置いて、データベース表の列にデータが正しく格納されるようにする必要があります。そうしないと、ODP.NETでは例外が発生します。

次の例では、ODP.NETで実体エンコードを使用して列データ内の山カッコの特殊文字が処理される方法を示しています。

// Create the following table
create table specialchars ("id" number, name varchar2(255));

次のXML文書を使用して、値(1<Jones>)をspecialchars表に挿入できます。山カッコを表すXML実体エンコードは太字で表記されます。

<?xml version = '1.0'?>
 <ROWSET>
  <ROW>
   <id>1</id >
   <NAME>&lt;Jones&gt;</NAME>
  </ROW>
 </ROWSET>

表名またはビュー名の特殊文字

表名またはビュー名に英数字以外の文字(アンダースコア(_)を除く)が含まれる場合、この表名またはビュー名は引用符で囲む必要があります。

たとえば、test'ingという名前の表に変更を保存するには、OracleCommand.XmlSaveProperties.TableNameプロパティを"\"test'ing\""に設定する必要があります。

XML要素名と列名のマッピングにおける大/小文字区別

XML文書内のデータ行を表すXML要素ごとに、子XML要素がデータベース列名にマップされます。子要素名と列名のマッピングでは常に大/小文字が区別されますが、ルート・タグ名および行タグ名では区別されません。この大/小文字区別の例を次に示します。

//Create the following table
create table casesensitive_table ("Id" number, NAME varchar2(255));

次のXML文書を使用して、値(1Smith)をcasesensitive_tableに挿入できます。

<?xml version = '1.0'?>
  <ROWSET>
    <ROW>
      <Id>1</Id>
      <NAME>Smith</NAME>
    </ROW>
  </ROWSET>

Id列の要素名の大/小文字が列名と一致する点に注意してください。

XML要素名と列名のマッピング

この項では、データベースでデータ操作にXMLを使用する場合に、XML要素名から列名へのマッピングがOracle Databaseで処理される方法について説明します。 some id列が含まれる、次のspecialchars表で、この処理を例示します。

// Create the specialchars table
create table specialchars ("some id" number, name varchar2(255));

specialchars表には、空白文字が含まれるsome id列がある点に注意してください。XML要素名では、空白文字は使用できません。

XML文書を使用した表への変更の保存

XML文書を使用して表またはビューに変更を保存する場合、OracleCommand.XmlSaveProperties.UpdateColumnsListを使用して、更新または挿入する列のリストを指定します。

XML文書を使用して表またはビュー内の列に変更を保存する場合で、対応する列名にXML要素名では無効となる文字が含まれる場合、次の例のように、UpdateColumnsListプロパティにエスケープした列名を指定する必要があります。

次のXML文書を使用して、値(2<Jones>)をspecialchars表に挿入できます。

<?xml version = '1.0'?>
  <ROWSET>
    <ROW>
      <some_x0020_id>2</some_x0020_id>
      <NAME>&lt;Jones&gt;</NAME>
    </ROW>
  </ROWSET>

次のコード例は、更新または挿入する列のリストを指定します。

/* Database Setup
connect scott/tiger@oracle
drop table specialchars;
create table specialchars ("some id" number, name varchar2(255));
insert into specialchars values (1, '<Jones>');
commit;
*/

// C#

using System;
using System.Data;
using System.Xml;
using Oracle.DataAccess.Client;

class InsertUsingXmlDocSample
{
  static void Main()
  {
    OracleConnection con = new OracleConnection();

    con.ConnectionString = "User Id=scott;Password=tiger;Data Source=oracle;";
    con.Open();
    Console.WriteLine("Connected Successfully");

    // Create the command
    OracleCommand cmd = new OracleCommand("", con);

    // Set the XML command type to query.
    cmd.XmlCommandType = OracleXmlCommandType.Insert;

    // Set the XML document
    cmd.CommandText = "<?xml version = '1.0'?>\n" + "<ROWSET>\n" + "<ROW>\n" +
      "<some_x0020_id>2</some_x0020_id>\n" + "<NAME>&lt;Jones&gt;</NAME>\n" +
      "</ROW>\n" + "</ROWSET>\n";
    cmd.XmlSaveProperties.Table = "specialchars";

    string[] ucols = new string[2];

    ucols[0] = "some_x0020_id";
    ucols[1] = "NAME";
    cmd.XmlSaveProperties.UpdateColumnsList = ucols;

    // Insert rows
    int rows = cmd.ExecuteNonQuery();

    Console.WriteLine("Number of rows inserted successfully : {0} ", rows);

    // Close and Dispose OracleConnection object
    con.Close();
    con.Dispose();
  }
}

デフォルト・マッピングの修正

次の方法でデフォルト・マッピングを修正できます。

  • ターゲットを変更します。ターゲット・スキーマ上にオブジェクト・リレーショナル・ビューを作成し、このビューを新規ターゲットにします。

  • XML文書を変更します。XSLTを使用してXML文書を変換します。XSL文書およびパラメータを指定します。変更が保存される前に変換が実行されます。これはパフォーマンスに影響する可能性があります。

  • XML文書で使用される行タグの名前を指定します。

オブジェクト・リレーショナル・データ

XML文書の変更は、オブジェクト・リレーショナル・データにも保存できます。コレクション内の各項目は、XML文書に次のいずれかの方法で指定できます。

  • 項目のデータベース型名をXML要素名として囲みます。

  • _ITEMがXML要素名として追加されたコレクションを保持するデータベース列の名前を囲みます。

複数の表

Oracle Databaseでは、結合された複数のリレーショナル表への変更は保存しません。リレーショナル表に対するビューを作成してから、そのビューを更新することをお薦めします。ビューが更新可能でない場合は、かわりにトリガーを使用できます。


参照:

CREATE VIEW文の説明および構文については、『Oracle Database SQL言語リファレンス』を参照してください。

トランザクションのコミット

XML文書で変更を加えると、すべての変更がコミットされるか、エラーが発生した場合はすべての変更がロールバックされます。