0) { obj.className = "imgborder_on"; } } } function hideImage(obj) { if (obj.className.substr(0, 10) == "imgborder_") { obj.src = eyeglass.src; obj.className = "imgborder_off"; } } function showAllImages() { imgs = document.images; for (i=0; i < imgs.length; i++) { showImage(imgs[i]); } } function hideAllImages() { imgs = document.images; for (i=0; i < imgs.length; i++) { hideImage(imgs[i]); } } //-->
インプレースXMLスキーマ・エボルーションの実行
目的
このチュートリアルでは、既存データをコピー、削除、および再挿入することなく、XMLスキーマに変更を加える方法について説明します。
所要時間
約30分
トピック
このチュートリアルでは、以下のトピックについて説明します。
スクリーンショットの表示
このアイコンの上にカーソルを置くと、
すべてのスクリーンショットがロードし、表示されます。
(警告:すべてのスクリーンショットが同時にロードされるため、ご使用のインターネット接続によってはレスポンス・タイムが遅くなる場合があります。)
注:各手順に関連したスクリーンショットのみを表示する場合は、それぞれの手順にあるアイコンの上にカーソルを置いてください。 スクリーンショットをクリックすると、非表示になります。
概要
Oracle9i Database Release 2以降、Oracle XML DBはOracleデータベースとシームレスに統合され、XMLデータの格納、取得、管理においてデータベース固有の高いパフォーマンスを提供できるようになりました。 新しいOracle Database 11gのリリースにおいて、Oracle XML DBはさらに一歩進み、XMLおよびSOAアプリケーション開発者を強化しながら、DBAがXMLデータを簡単に管理できる豊富な新機能を提供することができます。 Oracle XML DBは、現在、複数のデータベースのネイティブなXML記憶域モデルとXML索引付けスキーマ、SQL/XML標準操作、W3C標準XQueryデータ・モデルとXQuery/XPath言語、インプレースXMLスキーマ・エボルーション、データベースのネイティブなWebサービス、高パフォーマンスのXMLパブリッシング、XML DBリポジトリ、およびバージョニングとアクセス制御をサポートします。 このチュートリアルでは、インプレースXMLスキーマ・エボルーションと、サービス指向アーキテクチャにおけるOracle XML DB Webサービスの使用について紹介します。
スキーマ・エボルーション
Oracle XML DBによるXMLスキーマを使用する開発者にとって、XMLドキュメントのコンテンツまたは構造の変更をどのように行うかは、大きな課題です。 環境によっては、新しい規定や内部からの要望、または外的な機会が発生することで、頻繁または広範に変更を実施する必要があります。 たとえば、新しい要素または属性のXMLスキーマ定義への追加、データ型の変更、最大または最小の出現頻度の調整などです。
このような場合、既存のインスタンス・ドキュメント(データ)を有効化(または有効可能な状態に)して、既存アプリケーションが稼働し続けられるようにしながら、新しい要件に対応できるようXMLスキーマを"エボルーション"させる必要があります。
既存のドキュメントに注意する必要がなければ、単純にXMLスキーマに依存するXML Type表をドロップして、古いXMLを削除し、同じURLに新しいXMLスキーマを登録することもできます。 もっとも、ほとんどの場合は新しいXMLスキーマに対応できるよう変換する形で既存のドキュメントを保持しなければなりません。
Oracle XML DBは、2つのスキーマ・エボルーションをサポートします。 各手法は、独自のPL/SQLプロシージャを持っています。 コピー・ベースでエボルーションした
DBMS_XMLSCHEMA.copyEvolveと、Oracle Database 11g
のリリースから導入されたインプレースでエボルーションした
DBMS_XMLSCHEMA.inPlaceEvolveです。
インプレースXMLスキーマ・エボルーション
インプレースXMLスキーマ・エボルーションは、既存データをコピー、削除、および再挿入することなく、XMLスキーマに変更を加えることができます。 よって、インプレース・エボルーションはコピー・ベースエボルーションよりも遥かに高速です。 一般的に、インプレース・エボルーションは記憶域モデルを変更しない場合、および既存ドキュメントを無効化しない場合(つまり、既存ドキュメントが新しいスキーマと整合性がある、もしくは整合性をとることができる場合)に許可されます。
インプレースXMLスキーマ・エボルーションは、
diffXMLドキュメントで定義されている変更を適用します。また、新しいXMLスキーマを有効化してDDL文を構築し、XMLスキーマと関連するXMLインスタンス・ドキュメントを格納するようディスク構造をエボルーションさせます。これらのDDL文を実行して、古いXMLスキーマを新しいスキーマに置き換えることで、XMLスキーマの新バージョンを構築します。
トピック・リストに戻る
前提条件
このチュートリアルを始める前に、次の手順を完了している必要があります。
| 1.
|
Oracle Database 11g
がインストールされ、
OE
、
HR
ユーザーがアンロックされていること。
|
| 2.
|
Oracle Database 11g
に接続するよう、環境変数を設定すること。
|
| 3.
|
xmldb2_a.zipファイルをダウンロードし、作業ディレクトリ(wkdir等)に解凍すること。
|
注:前のバージョンのOracle JDeveloperを使用している場合、スクリーンショットは若干異なる可能性があります。
前提条件の追加情報:
Oracle Database 11gのインストール時に、
OEおよび
HRユーザーがアンロックされていない場合、以下を実行します。
a. 端末ウィンドウを開き、以下のコマンドを入力します。
sqlplus sys/oracle as sysdba;
b.
sysとして接続できたら、OEおよびHRアカウントをアンロックします。そして、OEおよびHRに対して
dbaロールを与えます。 OEに
SELECT_CATALOG_ROLEを与えます。 SQL*Plusウィンドウで、以下のコマンドを入力します。 もしくは
accounts.sqlスクリプトを実行します。
ALTER USER HR IDENTIFIED BY HR ACCOUNT UNLOCK;
ALTER USER OE IDENTIFIED BY OE ACCOUNT UNLOCK;
GRANT DBA to OE, HR;
GRANT SELECT_CATALOG_ROLE TO OE;
必ずHTTPポートを
8080に設定してください。 端末ウィンドウを開き、以下の文を実行します。
sqlplus sys/oracle as sysdba;
exec dbms_xdb.sethttpport('8080');
『
Oracle XML DBを使用したXMLとリレーショナル・データの格納、問合せ、およびアクセス』Oracle by Example(OBE)をすでに実行している場合は、HTTPポートを再度8080に設定する必要はありません。
Oracle Database 11g
に接続するよう環境変数を設定するには、以下を実行します。
a. 端末ウィンドウを開き、
.bash_profileを検索します。
b.
.bash_profileを編集し、以下について確認します。
- ORACLE_HOME環境変数が設定されている
- ORACLE_HOME/libが
LD_LIBRARY_PATH環境変数に追加されている
たとえば、
ORACLE_HOMEが
$ORACLE_BASE/product/11.1.0/db_1であれば、
.bash_profileに以下のエントリが含まれていることを確認します。
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$ORACLE_HOME/lib
ORACLE_BASE=/u01/app/oracle
ORACLE_HOME=$ORACLE_BASE/product/11.1.0/db_1
ORACLE_SID=orcl
PATH=$ORACLE_HOME/bin:$PATH
export PATH
export ORACLE_BASE ORACLE_HOME ORACLE_SID LD_LIBRARY_PATH
c.
.bash_profileに変更を加えた場合、スクリプトを以下のとおり実行します。
./.bash_profile
トピック・リストに戻る
インプレースXMLスキーマ・エボルーションの実行
DBMS_XMLSCHEMA.inPlaceEvolveプロシージャを使用して、インプレースXMLスキーマ・エボルーションを実行します。 このプロシージャを使用し、XMLスキーマ差分ドキュメントを定義することで、既存XMLスキーマに対する変更を確認します。
以下のタスクを実行します。
トピック・リストに戻る
Oracle SQL Developerの開始
このチュートリアルでは、Oracle SQL Developerツールを使用します。 データベース接続の作成後、Oracle SQL Developerで自動トレース・パラメータおよびスクリプト・パス参照を設定します。 以下の手順を実行します。
| 1.
|
端末ウィンドウを開き、Oracle SQL Developerをインストールした場所に移動します。 次に、Oracle SQL Developerを開始します。 以下のコマンドを使用します。
cd /u01/app/oracle/product/11.1.0/db_1/sqldeveloper
chmod u+x sqldeveloper.sh
sh sqldeveloper.sh
|
| 2.
|
Oracle SQL Developerでは、OEユーザーとしてデータベース接続を作成する必要があります。 以下の手順を実行します。
a. Connectionsタブで「
Connections」を右クリックし、「
New Connection」を選択します。
b. New/Select Database Connectionウィンドウが表示されます。 以下の詳細を入力し、「
Test」をクリックして接続が正しく設定されていることを確認します。
Connection Name:
oe
UserName:
oe
Password:
oe
Hostname:
localhostまたはリモート・マシンを使用している場合は<
hostname>
Port:
1521
SID:
orcl
「
Save Password」チェック・ボックスを選択した場合、パスワードはXMLファイルに保存されます。 よって、Oracle SQL Developer接続を閉じてから再度開くと、パスワードは要求されません。
c. テストのステータスに成功したことが表示されます。 「
Connect」をクリックします。
|
| 3.
|
自動トレース・パラメータを設定します。 以下の手順を実行します。
a. 「
Tools」→「
Preferences」の順に選択します。
b.「
Database」を開き、
「
Autotrace Parameters」を選択します。
c. Preferencesウィンドウで、以下のチェック・ボックスを必ず選択します。 その後、「
OK」をクリックします。
Object_Name
Cost
Cardinality
|
| 4.
|
@構文を使用してスクリプトを実行するには、Oracle SQL Developerでスクリプト・パス参照を設定します。 以下の手順を実行します。
a. 「
Tools」→「
Preferences」→「
Database」→「
Worksheet Parameters」の順に選択します。 次に、「
Browse」をクリックします。
b. SQLスクリプトのある作業ディレクトリの場所へ移動します。 次に「
Open」をクリックします。
c. Preferencesウィンドウで、スクリプト・フィールドを検索するためにSelectデフォルト・パスのスクリプト・パスを確認します。 「
OK」をクリックします。
|
上記の項では、Oracle SQL Developerに接続し、自動トレース・パラメータおよびスクリプト・パス参照を設定する方法について学習しました。
トピックに戻る
インプレースXMLスキーマ・エボルーションの使用
| 1.
|
既存のXMLスキーマから新しいバージョンのXMLスキーマを作成します。
createSchemaV2.sql
スクリプトを実行します。
@createSchemaV2.sql
declare
new_schema xmltype;
res boolean;
begin
if (dbms_xdb.existsResource('/home/OE/purchaseOrder.v2.xsd')) then
dbms_xdb.deleteResource('/home/OE/purchaseOrder.v2.xsd');
end if;
select appendChildXML (xdbUriType('/home/OE/purchaseOrder.xsd').getXML(),
'/xs:schema/xs:complexType[@name="LineItemType"]/xs:sequence',
xmltype('<xs:element xmlns:xs="http://www.w3.org/2001/XMLSchema" name="Unit" type="xs:string" minOccurs="0" />'),
'xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xdb="http://xmlns.oracle.com/xdb"')
into new_schema from dual;
res := dbms_xdb.createResource('/home/OE/purchaseOrder.v2.xsd',new_schema);
commit;
end;
/
Oracle SQL DeveloperでSQLスクリプトを実行するには、
@構文を使用できます。 次に、「
Run Script」をクリックするか、[
F5]を押します。
または、「
Enter SQL Statement」ボックスを右クリックしてファイルを開きます。 次に、「
Run Script」をクリックするか、[
F5]を押します。
|
| 2.
|
XMLスキーマの新バージョンに準拠する新しいXMLドキュメントを挿入します。
insertNewXMLV2.sql
スクリプトを実行します。 スクリプト出力ペイン内でエラーを確認します。
@insertNewXMLV2.sql
declare
new_xml xmltype;
res boolean;
begin
select column_value into new_xml
from xmltable('for $i in ora:view("PURCHASEORDER")
where $i/PurchaseOrder/Reference = "SBELL-2002100912333601PDT"
return $i');
select appendChildXML (new_xml,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="1"]',
xmltype('<Unit>Box</Unit>'))
into new_xml from dual;
select appendChildXML (new_xml,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="2"]',
xmltype('<Unit>Carton</Unit>'))
into new_xml from dual;
select appendChildXML (new_xml,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="3"]',
xmltype('<Unit>Case</Unit>'))
into new_xml from dual;
select updateXML (new_xml,
'/PurchaseOrder/Reference/text()',
'SBELL-2002100912333601PDT-V2')
into new_xml from dual;
insert into PURCHASEORDER values new_xml;
commit;
end;
/
|
| 3.
|
次に、インプレースXMLスキーマ・エボルーションを実行します。
evolveSchema.sql
を実行します。
@evolveSchema.sql
set timing on
declare
schemaDiff XMLType;
res boolean;
begin
select xmlDiff
(
xdburitype('/home/OE/purchaseOrder.xsd').getXML(),
xdburitype('/home/OE/purchaseOrder.v2.xsd').getXML()
)
into schemaDiff
from dual;
if (dbms_xdb.existsResource('/home/OE/poSchemaDiff.xml')) then
dbms_xdb.deleteResource('/home/OE/poSchemaDiff.xml');
end if;
res := dbms_xdb.createResource('/home/OE/poSchemaDiff.xml',schemaDiff);
dbms_xmlschema.inPlaceEvolve('
http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd',
schemaDiff, 1);
end;
/
|
| 4.
|
XMLスキーマの新バージョンに準拠する新しいXMLドキュメントを、再度挿入します。
insertNewXMLV2.sql
スクリプトを実行します。 この時点で何もエラーがないことを確認します。
@insertNewXMLV2.sql
declare
new_xml xmltype;
res boolean;
begin
select column_value into new_xml
from xmltable('for $i in ora:view("PURCHASEORDER")
where $i/PurchaseOrder/Reference = "SBELL-2002100912333601PDT"
return $i');
select appendChildXML (new_xml,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="1"]',
xmltype('<Unit>Box</Unit>'))
into new_xml from dual;
select appendChildXML (new_xml,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="2"]',
xmltype('<Unit>Carton</Unit>'))
into new_xml from dual;
select appendChildXML (new_xml,
'/PurchaseOrder/LineItems/LineItem[@ItemNumber="3"]',
xmltype('<Unit>Case</Unit>'))
into new_xml from dual;
select updateXML (new_xml,
'/PurchaseOrder/Reference/text()',
'SBELL-2002100912333601PDT-V2')
into new_xml from dual;
insert into PURCHASEORDER values new_xml;
commit;
end;
/
|
| 5.
|
新しいXMLドキュメントの挿入に成功したことを確認します。
verifyEvol.sql
を実行します。
@verifyEvol.sql
select column_value from
XMLTable ('for $i in ora:view("PURCHASEORDER") where exists($i/PurchaseOrder/LineItems/LineItem/Unit) return $i/PurchaseOrder/Reference');
|
トピックに戻る
トピック・リストに戻る
まとめ
このチュートリアルでは、インプレースXMLスキーマ・エボルーションを実行する方法について学習しました。
トピック・リストに戻る
このアイコンの上にカーソルを置くと、すべてのスクリーンショットが非表示になります。
|