CREATE OPERATOR
目的
CREATE
OPERATOR
文を使用すると、新しい演算子を作成し、バインディングを定義できます。
演算子は、索引タイプ、SQL問合せおよびDML文で参照できます。それに対して演算子は、ファンクション、パッケージ、型および他のユーザー定義オブジェクトを参照します。
関連項目:
これらの依存性および演算子の概要は、『Oracle Databaseデータ・カートリッジ開発者ガイド』および『Oracle Database概要』を参照してください。
前提条件
自分のスキーマ内に演算子を作成する場合は、CREATE
OPERATOR
システム権限が必要です。他のユーザーのスキーマ内に演算子を作成する場合は、CREATE
ANY
OPERATOR
システム権限が必要です。どちらの場合も、参照するファンクションおよび演算子に対するEXECUTE
オブジェクト権限が必要です。
構文
create_operator::=
context_clause::=
using_function_clause::=
セマンティクス
OR REPLACE
OR
REPLACE
を指定すると、演算子スキーマ・オブジェクトの定義を置換できます。
演算子の置換の制限事項
演算子に対して、その演算子をサポートする索引タイプなどの依存オブジェクトがない場合のみ、定義を置換できます。
IF NOT EXISTS
IF NOT EXISTS
を指定すると、次の効果が得られます。
-
演算子が存在していない場合は、文の最後に新しい演算子が作成されます。
-
演算子が存在している場合、これは文の最後の時点にある演算子になります。古いものが検出されるため、新しいものは作成されません。
単一の文には、一度に1つのOR REPLACE
またはIF NOT EXISTS
を指定できます。同じ文でOR REPLACE
とIF NOT EXISTS
の両方を使用すると、ORA-11541: REPLACE and IF NOT EXISTS cannot coexist in the same DDL statement
というエラーが発生します。
IF EXISTS
はCREATE
とともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statement
が発生します。
schema
演算子が含まれているスキーマを指定します。schema
を省略した場合、自分のスキーマ内に演算子が作成されます。
operator
作成する演算子の名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
binding_clause
binding_clause
を使用すると、演算子をファンクションにバインドするために、1つ以上のパラメータ・データ型(parameter_type
)を指定できます。各バインドのシグネチャ(対応するファンクションに対する引数のデータ型の順序)は、オーバーロードの規則に従って一意である必要があります。
parameter_type
自体をオブジェクト型にできます。この場合、任意にスキーマで修飾することもできます。
演算子のバインドの制限事項
REF
、LONG
またはLONG
RAW
のparameter_type
は指定できません。
関連項目:
オーバーロードの詳細は、『Oracle Database PL/SQL言語リファレンス』を参照してください。
RETURN句
バインドに戻りデータ型を指定します。
return_type
自体をオブジェクト型にできます。この場合、任意にスキーマで修飾することもできます。
戻りデータ型のバインドの制限事項
REF
、LONG
またはLONG
RAW
のreturn_type
は指定できません。
SHARING
SHARING句は、アプリケーションのメンテナンスの際に、アプリケーション・ルートにオブジェクトを作成する場合に使用します。このタイプのオブジェクトはアプリケーション共通オブジェクトと呼ばれ、アプリケーション・ルートに属するアプリケーションPDBと共有できます。
次の共有属性のいずれかを使用して、オブジェクトを共有する方法を指定できます。
-
METADATA
- メタデータ・リンクはメタデータを共有しますが、そのデータは各コンテナに固有です。このタイプのオブジェクトは、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。 -
NONE
- オブジェクトは共有されず、アプリケーション・ルートでのみアクセスできます。
implementation_clause
ANCILLARY TO句
ANCILLARY
TO
句を使用すると、演算子バインドが、指定した主演算子バインド(primary_operator
)を補助することを指定できます。この句を指定する場合は、1つのみの数値パラメータで前のバインドを指定しないでください。
context_clause
を使用すると、主演算子バインドを補助しないバインドのファンクション実装を指定できます。
WITH INDEX CONTEXT、SCAN CONTEXT
この句を使用すると、演算子のファンクション評価に、実装タイプで指定した索引およびスキャン・コンテキストが使用されるように指定できます。
COMPUTE ANCILLARY DATA
COMPUTE
ANCILLARY
DATA
を指定すると、演算子バインディングによって補助データが計算されます。
WITH COLUMN CONTEXT
WITH
COLUMN
CONTEXT
を指定すると、列情報が演算子のファンクション実装に渡されます。
この句を指定する場合は、実装するファンクションのシグネチャに、余分なODCIFuncCallInfo
構造を1つ含める必要があります。
関連項目:
ODCIFuncCallInfo
ルーチンを使用する手順については、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。
using_function_clause
using_function_clause
を使用すると、バインディングを実装するファンクションを指定できます。function_name
には、スタンドアロン・ファンクション、パッケージ・ファンクション、型メソッドまたはこれらのシノニムを指定できます。
ファンクションが後で削除された場合は、演算子などのすべての依存オブジェクトに、INVALID
のマークが付けられます。ただし、その後ALTER
OPERATOR
... DROP
BINDING
文を発行してバインディングを削除した場合は、後続の問合せおよびDMLで依存オブジェクトが再検証されます。
例
ユーザー定義演算子の作成: 例
この例は、非常に単純な等価性のファンクション実装を作成した後、このファンクションを使用する演算子を作成します。より詳細な例については、『Oracle Databaseデータ・カートリッジ開発者ガイド』を参照してください。
CREATE FUNCTION eq_f(a VARCHAR2, b VARCHAR2) RETURN NUMBER AS BEGIN IF a = b THEN RETURN 1; ELSE RETURN 0; END IF; END; / CREATE OPERATOR eq_op BINDING (VARCHAR2, VARCHAR2) RETURN NUMBER USING eq_f;