CREATE INDEXTYPE

目的

CREATE INDEXTYPE文を使用すると、(アプリケーション固有の)ドメイン索引を管理するルーチンを指定するオブジェクトである索引タイプを作成できます。索引タイプは、表、ビューおよび他のスキーマ・オブジェクトと同じネームスペースにあります。この文は、索引タイプ名を実装タイプに結合し、順番に索引タイプを実装するユーザー定義索引ファンクションおよびプロシージャを指定し、参照します。

関連項目:

索引タイプの実装の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

前提条件

自分のスキーマに索引タイプを作成する場合は、CREATE INDEXTYPEシステム権限が必要です。他のユーザーのスキーマ内に索引タイプを作成する場合は、CREATE ANY INDEXTYPEシステム権限が必要です。どちらの場合も、実装タイプおよびサポートしている演算子に対するEXECUTEオブジェクト権限が必要です。

索引タイプは、1つ以上の演算子をサポートしているため、索引タイプを作成する前に、サポートする演算子を設計し、これらの演算子に機能的な実装を提供する必要があります。

関連項目:

CREATE OPERATOR

構文

create_indextype::=

using_type_clause::=

array_DML_clause::=

storage_table_clause::=

セマンティクス

OR REPLACE

OR REPLACEを指定すると、既存の索引タイプを再作成できます。この句を使用すると、以前に付与したオブジェクト権限を削除、再作成、再付与することなく、既存の索引タイプの定義を変更できます。

IF NOT EXISTS

IF NOT EXISTSを指定すると、次の効果が得られます。

  • 索引タイプが存在していない場合は、文の最後に新しい索引タイプが作成されます。

  • 索引タイプが存在している場合、これは文の最後の時点にある索引タイプになります。古いものが検出されるため、新しいものは作成されません。

単一の文には、一度に1つOR REPLACEまたはIF NOT EXISTSを指定できます。同じ文でOR REPLACEIF NOT EXISTSの両方を使用すると、ORA-11541: REPLACE and IF NOT EXISTS cannot coexist in the same DDL statementというエラーが発生します。

IF EXISTSCREATEとともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statementが発生します。

schema

索引タイプが存在するスキーマ名を指定します。schemaを指定しない場合、自分のスキーマ内に索引タイプが作成されます。

indextype

作成する索引タイプの名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。

SHARING

SHARING句は、アプリケーションのメンテナンスの際に、アプリケーション・ルートにオブジェクトを作成する場合に使用します。このタイプのオブジェクトはアプリケーション共通オブジェクトと呼ばれ、アプリケーション・ルートに属するアプリケーションPDBと共有できます。

次の共有属性のいずれかを使用して、オブジェクトを共有する方法を指定できます。

  • METADATA - メタデータ・リンクはメタデータを共有しますが、そのデータは各コンテナに固有です。このタイプのオブジェクトは、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。

  • NONE - オブジェクトは共有されず、アプリケーション・ルートでのみアクセスできます。

FOR句

FOR句を使用すると、索引タイプでサポートされる演算子のリストを指定できます。

  • schemaには、演算子を含むスキーマを指定します。schemaを指定しない場合、その演算子は自分のスキーマ内にあるとみなされます。

  • operatorには、索引タイプによってサポートされる演算子の名前を指定します。

    この句に指定するすべての演算子は有効な演算子である必要があります。

  • parameter_typeには、演算子へのパラメータ・タイプを指定します。

using_type_clause

USING句を使用すると、新しい索引タイプを実装するタイプを指定できます。

implementation_typeには、適切なOracle Data Cartridge Interface(ODCI)を実装するタイプ名を指定します。

  • ODCIでルーチンを実装する有効なタイプを指定する必要があります。

  • 実装タイプは、索引タイプと同じスキーマに存在する必要があります。

関連項目:

このインタフェースの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

WITH LOCAL PARTITION

この句を使用すると、レンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表、および時間隔パーティション表に対するローカル・ドメイン索引の作成に、索引タイプが使用できることを指定できます。この句は、複数の方法でstorage_table_clauseと組み合せて使用します(storage_table_clauseを参照)。

  • WITH LOCAL PARTITION WITH SYSTEM MANAGED STORAGE TABLESを指定する方法をお薦めします。この組合せでは、システム管理記憶域表を使用しますが、これは推奨の記憶域管理であり、レンジパーティション表、リスト・パーティション表、ハッシュ・パーティション表、および時間隔パーティション表にローカル・ドメイン索引を作成できます。RANGEキーワードは、WITH LOCAL PARTITION WITH SYSTEM MANAGED STORAGE TABLESを指定すると不要となるため、この場合はオプションとなり無視されます。

  • WITH LOCAL RANGE PARTITION(RANGEキーワードを含む)を指定してstorage_table句を省略できます。レンジ・パーティション表上のローカル・ドメイン索引は、ユーザー管理記憶表で、下位互換性のためにサポートされています。この組合せは効率性の低いユーザー管理記憶表を使用するため、お薦めしません。

この句を完全に省略すると、後でこの索引タイプを使用してレンジ・パーティション表、リスト・パーティション表、ハッシュ・パーティション表、時間隔パーティション表にローカル・ドメイン索引を作成することができなくなります。

storage_table_clause

この句を使用すると、この索引タイプに基づいて作成された索引の記憶表およびパーティション・メンテナンス操作の管理方法を指定できます。

  • WITH SYSTEM MANAGED STORAGE TABLESを指定すると、統計データの格納がシステムで管理されます。statistics_typeに指定するタイプによって、システムで保持される表に統計関連の情報が格納されます。また、指定する索引タイプはすでに登録済であるか、またはWITH SYSTEM MANAGED STORAGE TABLES句をサポートするように変更されている必要があります。

  • WITH USER MANAGED STORAGE TABLESを指定すると、ユーザー定義の統計情報を格納する表は、ユーザーによって管理されます。これはデフォルトの動作です。

関連項目:

ドメイン索引の記憶表の詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

array_DML_clause

この句を使用すると、索引タイプでODCIIndexInsertメソッドの配列インタフェースをサポートできるようになります。

type およびvarray_type

索引付けする列のデータ型がユーザー定義オブジェクト型である場合は、Oracleがtypeの列値の保持に使用するVARRAY varray_typeを識別するために、この句を指定する必要があります。索引タイプで型のリストがサポートされている場合、対応するVARRAY型のリストを指定できます。typeまたはvarray_typeschemaを省略した場合、型が自分のスキーマ内に定義されているとみなされます。

索引付けする列のデータ型が組込みシステム型である場合、その索引タイプに指定されたVARRAY型は、システムで定義されたODCI型よりも優先されます。

関連項目:

ODCI配列インタフェースの詳細は、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。

索引タイプの作成: 例

次の文は、position_indextypeという名前の索引タイプを作成し、その索引タイプでサポートされているposition_between演算子、および索引インタフェースを実装するposition_imタイプを指定します。この索引タイプを使用する拡張索引作成機能の使用例は、「拡張索引作成機能の使用方法」を参照してください。

CREATE INDEXTYPE position_indextype
   FOR position_between(NUMBER, NUMBER, NUMBER)
   USING position_im;