この章には、Oracle CQL 文の最も単純な構成要素のリファレンス情報が含まれています。
Oracle CEP で操作されるそれぞれの値にはデータ型があります。値のデータ型によって、固定のプロパティ セットが値に関連付けられます。Oracle CEP ではこれらのプロパティによって、あるデータ型の値が別のデータ型の値とは異なる方法で処理されます。たとえば、INTEGER
データ型の値は加算できますが、CHAR
データ型の値は加算できません。ストリームを作成する場合は、各要素のデータ型を指定する必要があります。ユーザ定義関数を作成する場合は、各引数のデータ型を指定する必要があります。これらのデータ型は、各要素または各引数が保持できる値の範囲を定義します。たとえば、データ型が TIMESTAMP
の属性は、February 29 (うるう年を除く) や、2 または 'SHOE' などの値を受け入れることができません。Oracle CQL では多数の組み込みデータ型を使用できます。Oracle CQL データ型の構文について、以下の図に示します。
Oracle CQL でサポートされていないデータ型をイベントが使用している場合は、ユーザ定義関数を作成して Oracle CQL クエリでそのデータ型を評価できます。
詳細については、以下を参照してください。
表 2-1 は、Oracle CQL 組み込みデータ型の概要を示しています。構文上の要素については、前の節の構文を参照してください。
表 2-1 Oracle CQL 組み込みデータ型の概要
Oracle CQL データ型 | 説明 |
---|---|
Java 詳細については、節 2.4.2「数値リテラル」を参照してください。 |
|
Java |
|
長さが 詳細については、節 2.4.2「数値リテラル」を参照してください。 |
|
長さが 詳細については、節 2.4.1「テキスト リテラル」を参照してください。 |
|
Java 詳細については、節 2.4.2「数値リテラル」を参照してください。 |
|
Java 詳細については、節 2.4.2「数値リテラル」を参照してください。 |
|
Java 詳細については、節 2.4.2「数値リテラル」を参照してください。 |
|
固定長の 詳細については、節 2.4.4「期間リテラル」を参照してください。 |
|
固定長の 詳細については、節 2.4.3「日時リテラル」を参照してください。 |
|
このデータ型は、XML データを含むストリーム要素に使用します。最大長は 4096 文字です。
詳細については、「SQL/XML (SQLX)」を参照してください。 |
|
|
任意の Java オブジェクト (つまり、 Oracle CEP エンジンでは 通常、この型はアダプタから送り先に値をそのまま渡す場合に使用します。Oracle CEP エンジンではこれらの値を解釈する必要はありませんが ( |
イベントの型を定義する場合は、これらのデータ型およびデータ型リテラルの制限を検討します。詳細については、『Oracle CEP IDE Eclipse 開発者ガイド』の「Oracle CEP イベント タイプの作成」を参照してください。
Oracle CQL でサポートされていないデータ型をイベントが使用している場合は、ユーザ定義関数を作成して Oracle CQL クエリでそのデータ型を評価できます。
例 2-1 のような enum
データ型があるとします。例 2-2 に示すイベントでは、この enum
データ型を使用しています。Oracle CQL では enum
データ型がサポートされていません。
例 2-1 列挙データ型 ProcessStatus
package com.oracle.app; public enum ProcessStatus { OPEN(1), CLOSED(0)} }
例 2-2 列挙データ型 ProcessStatus を使用するイベント
package com.oracle.app; import com.oracle.capp.ProcessStatus; public class ServiceOrder { private String serviceOrderId; private String electronicSerialNumber; private ProcessStatus status; ... }
ユーザ定義関数を作成し (例 2-3 を参照)、アプリケーション アセンブリ ファイルに関数を登録することで (例 2-4 を参照)、この enum
データ型を Oracle CQL クエリで評価できます (例 2-5 を参照)。
例 2-3 列挙データ型を評価するユーザ定義関数
package com.oracle.app; import com.oracle.capp.ProcessStatus; public class CheckIfStatusClosed { public boolean execute(Object[] args) { ProcessStatus arg0 = (ProcessStatus)args[0]; if (arg0 == ProcessStatus.OPEN) return Boolean.FALSE; else return Boolean.TRUE; } }
例 2-4 アプリケーション アセンブリ ファイルへのユーザ定義関数の登録
<wlevs:processor id="testProcessor"> <wlevs:listener ref="providerCache"/> <wlevs:listener ref="outputCache"/> <wlevs:cache-source ref="testCache"/> <wlevs:function function-name="statusClosed" exec-method=”execute” /> <bean class="com.oracle.app.CheckIfStatusClosed"/> </wlevs:function> </wlevs:processor>
例 2-5 ユーザ定義関数を使用した Oracle CQL クエリでの列挙データ型の評価
<query id="rule-04"><![CDATA[ SELECT meter.electronicSerialNumber, meter.exceptionKind FROM MeterLogEvent AS meter, ServiceOrder AS svco WHERE meter.electronicSerialNumber = svco.electronicSerialNumber and svco.serviceOrderId IS NULL OR statusClosed(svco.status) ]]></query>
詳細については、第 10 章「関数 : ユーザ定義」を参照してください。
この節では、Oracle CEP での各データ型の値の比較方法について説明します。
多い値は少ない値よりも大きいと見なされます。すべての負の数は 0 および正の数よりも小さいと見なされます。このため、-1 は 100 より小さく、-100 は -1 より小さい数です。
遅い日付は早い日付よりも大きいと見なされます。たとえば、'29-MAR-2005' と同等の日付は '05-JAN-2006' よりも小さい日付です。'05-JAN-2006 1:35pm' は '05-JAN-2005 10:09am' よりも大きい日付です。
Oracle CQL では辞書順に基づいた辞書的ソートがサポートされています。
内部的には、Oracle CQL では char
の数値が比較されます。使用するエンコーディングに応じて数値は異なりますが、通常は、比較する際に違いはありません。例を示します。
'a' < 'b' 'aa' < 'ab' 'aaaa' < 'aaaab'
通常、式では異なるデータ型の値を使用できません。たとえば、算術式で 5 × 10 の乗算の後に 'JAMES' を加算することはできません。ただし、Oracle CEP ではあるデータ型から別のデータ型への暗黙的および明示的な値の変換がサポートされています。
暗黙的または自動的な変換に依存する代わりに、Oracle では明示的な変換の指定をお勧めします。これは、以下の理由によります。
明示的なデータ型変換関数を使用すると、Oracle CQL 文が読みやすくなります。
暗黙的なデータ型変換はパフォーマンスに悪影響を及ぼす可能性があります。
暗黙的な変換は発生したコンテキストに依存し、すべてのケースで同じように動作しない可能性があります。
暗黙的な変換のアルゴリズムはソフトウェア リリース間や Oracle 製品間で変更される場合があります。明示的な変更では、動作がより安定しています。
Oracle CEP では、変換に意味がある場合に、あるデータ型から別のデータ型に値が自動的に変換されます。
表 2-2 は、Oracle の暗黙的な変換を示しています。この表は、使用可能なすべての変換を示しています (X
マークが付けられています)。サポートされていない変換には --
マークが付けられています。
表 2-2 暗黙的な型変換の表
CHAR | BYTE | BOOLEAN | INTEGER | DOUBLE | BIGINT | FLOAT | TIMESTAMP | INTERVAL | |
---|---|---|---|---|---|---|---|---|---|
CHAR から |
|
|
|
|
|
|
|
|
|
BYTE から |
|
|
|
|
|
|
|
|
|
BOOLEAN から |
|
|
|
|
|
|
|
|
|
INTEGER から |
|
|
|
|
|
|
|
|
|
DOUBLE から |
|
|
|
|
|
|
|
|
|
BIGINT から |
|
|
|
|
|
|
|
|
|
FLOAT から |
|
|
|
|
|
|
|
|
|
TIMESTAMP から |
|
|
|
|
|
|
|
|
|
INTERVAL から |
|
|
|
|
|
|
|
|
|
以下の規則は、Oracle CEP で暗黙のデータ型変換が行われる方向を決定します。
SELECT
FROM
操作で、Select 句に算術式または条件の評価が含まれている場合、Oracle CEP ではストリームのデータがターゲット変数の型に変換されます。
たとえば、c1+2.0
などの式評価や c1 < 2.0
などの条件評価のコンテキストで c1
が INTEGER
型である場合に、暗黙的な変換が発生します。
FLOAT
から BIGINT
への変換は正確です。
BIGINT
値が使用する精度のビット数が FLOAT
でサポートされる数を超えている場合、BIGINT
から FLOAT
への変換は正確ではありません。
文字値と TIMESTAMP
値を比較する場合、Oracle CEP では文字データが TIMESTAMP
に変換されます。
Oracle CQL 関数または演算子で許可されていないデータ型の引数を使用すると、Oracle CEP ではサポートされている場合は必ず、引数が使用可能なデータ型に変換されます。
代入時、Oracle CEP では等号 (=
) の右側の値が、左側の代入対象のデータ型に変換されます。
連結操作時、Oracle CEP では文字以外のデータ型が CHAR
に変換されます。
文字データ型と文字以外のデータ型の間で算術演算または比較を行う場合、Oracle CEP では数値型が CHAR
に変換されます (表 2-2 を参照)。
Oracle CQL 変換関数を使用して、明示的にデータ型の変換を指定できます。表 2-3 は、あるデータ型から別のデータ型に値を明示的に変換する Oracle CQL 関数を示しています。サポートされていない変換には --
マークが付けられています。
表 2-3 明示的な型変換の表
CHAR | BYTE | BOOLEAN | INTEGER | DOUBLE | BIGINT | FLOAT | TIMESTAMP | INTERVAL | |
---|---|---|---|---|---|---|---|---|---|
CHAR から |
-- |
|
-- |
-- |
-- |
-- |
-- |
|
-- |
BYTE から |
-- |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
BOOLEAN から |
|||||||||
INTEGER から |
|
-- |
|
-- |
|
|
|
-- |
-- |
DOUBLE から |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
BIGINT から |
|
-- |
|
-- |
|
-- |
|
-- |
-- |
FLOAT から |
|
-- |
-- |
-- |
|
-- |
-- |
-- |
-- |
TIMESTAMP から |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
INTERVAL から |
|
-- |
-- |
-- |
-- |
-- |
-- |
-- |
-- |
実行時、Oracle CEP ではユーザ定義関数の戻り値の型に指定した Oracle CQL データ型と Java の同等のデータ型との間でマッピングが行われます。
詳細については、節 10.1.2「ユーザ定義関数のデータ型」を参照してください。
リテラルおよび定数値という用語は同義であり、固定のデータ値を指しています。たとえば、'JACK'、'BLUE ISLAND'、'101' などはすべてテキスト リテラルです。5001 は数値リテラルです。
Oracle CEP では、Oracle CQL 文の以下の種類のリテラルがサポートされています。
このリファレンスの他の部分で説明している式、条件、Oracle CQL 関数、および Oracle CQL 文の構文で const_string
、quoted_string_double_quotes
、または quoted_string_single_quotes
と示されている箇所では常にテキスト リテラルの表記で値を指定します。このリファレンスでは、テキスト リテラル、文字リテラル、および文字という用語を相互に代わるものとして使用しています。
テキスト リテラルは、Oracle CEP でスキーマ オブジェクト名と区別されるように、一重引用符または二重引用符で囲みます。
一重引用符 ('
) または二重引用符 ("
) を使用できます。通常は、二重引用符を使用します。ただし、特定の式、条件、関数、および文では、このリファレンスの他の部分で指定されている構文に従って、quoted_string_double_quotes
または quoted_string_single_quotes
のいずれかの引用符を使用する必要があります。
構文で単に const_string
と示されている場合は、一重引用符または二重引用符のどちらでも使用できます。
構文で char
という用語が示されている場合は、テキスト リテラルを指定するか、または文字データに解決される別の式を指定できます。構文で char
と示されている場所では、一重引用符は使用しません。
Oracle CEP では Java ローカリゼーションがサポートされています。Java ロケールで指定された文字セットのテキスト リテラルを指定できます。
詳細については、以下を参照してください。
固定長の数値または浮動小数点数値を指定する場合は、数値リテラルの表記を使用します。
このリファレンスの他の部分で説明している式、条件、Oracle CQL 関数、および Oracle CQL 文で integer
と示されている箇所では常に整数表記を使用して整数を指定する必要があります。
integer
の構文は以下のとおりです。
digit
は 0、1、2、3、4、5、6、7、8、9 のいずれかです。
以下は、有効な整数です。
7 +255
このリファレンスの他の部分で説明している式、条件、Oracle CQL 関数、および Oracle CQL 文で number
または n
と示されている箇所では常に数または浮動小数点数の表記を使用して値を指定する必要があります。
number
の構文は以下のとおりです。
各項目は次のとおりです。
+ は正、- は負の値を示します。符号を省略すると、デフォルトで正の値になります。
digit
は 0、1、2、3、4、5、6、7、8、9 のいずれかです。
f
または F
は数値が FLOAT
型の 64 ビット バイナリ浮動小数点数であることを示します。
d
または D
は数値が DOUBLE
型の 64 ビット バイナリ浮動小数点数であることを示します。
f
または F
および d
または D
を省略すると、数値は型 INTEGER
になります。
サフィックス f
または F
および d
または D
は浮動小数点数リテラルでのみサポートされ、INTEGER
に変換される文字列ではサポートされていません。たとえば、Oracle CEP で INTEGER
が予期されている場合に文字列 '9'
が検出されると、文字列は Java Integer
9 に変換されます。ただし、Oracle CEP で文字列 '9f'
が検出された場合は、変換が失敗しエラーが返されます。
INTEGER
型の数は最大 32 桁の精度を格納できます。BIGINT
または FLOAT
で提供される精度よりも高い精度をリテラルが必要とする場合、Oracle CEP では値が切り詰められます。リテラルの範囲が BIGINT
または FLOAT
でサポートされる範囲を超えた場合、Oracle CEP ではエラーが発生します。
Java ロケールでピリオド (.
) 以外の小数点を使用している場合は、'text'
表記を使用して数値リテラルを指定する必要があります。この場合、Oracle CEP ではテキスト リテラルが自動的に数値に変換されます。
注意 : この表記は、浮動小数点数リテラルでは使用できません。 |
たとえば、Java ロケールでカンマ (,) の小数点が指定されている場合は、以下のように数値 5.123 を指定します。
'5,123'
以下は、有効な NUMBER
リテラルです。
25 +6.34 0.5 -1
以下は、有効な浮動小数点数リテラルです。
25f +6.34F 0.5d -1D
Oracle CEP では、日時データ型 TIMESTAMP
がサポートされています。
日時リテラルは 64 バイトを超えてはなりません。
すべての日時リテラルは、Oracle CQL でサポートされる java.text.SimpleDateFormat
書式モデルのいずれかに準拠している必要があります。詳細については、節 2.5.2「日時書式モデル」を参照してください。
現在、SimpleDateFormat
クラスでは xsd:dateTime
がサポートされていません。このため、Oracle CQL ではこの型を使用する XML 要素または属性がサポートされていません。
たとえば、XML イベントが例 2-6 のような XSD を使用する場合、Oracle CQL では MyTimestamp
要素を解析できません。
例 2-6 無効なイベント XSD : xsd:dateTime がサポートされていない
<xsd:element name="ComplexTypeBody">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyTimestamp" type="xsd:dateTime"/>
<xsd:element name="ElementKind" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="node" type="SimpleType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
Oracle では、XSD を定義して xsd:dateTime
を xsd:string
で置き換えることをお勧めします (例 2-7 を参照)。
例 2-7 有効なイベント XSD : xsd:dateTime の代わりに xsd:string を使用する
<xsd:element name="ComplexTypeBody">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="MyTimestamp" type="xsd:string"/>
<xsd:element name="ElementKind" type="xsd:string"/>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="node" type="SimpleType"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
例 2-7 の XSD を使用すると、Oracle CQL では、Timestamp
要素の String
値が Oracle CQL でサポートされる java.text.SimpleDateFormat
書式モデルに準拠している限り、例 2-8 に示すようなイベントを処理できます。詳細については、節 2.5.2「日時書式モデル」を参照してください。
例 2-8 XML イベント ペイロード
<ComplexTypeBody xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...> <MyTimestamp>2000-01-15T00:00:00</MyTimestamp> <ElementKind>plus</ElementKind> <name>complexEvent</name> <node> <type>complexNode</type> <number>1</number> </node> </ComplexTypeBody>
Oracle CQL での XML の使用の詳細については、「SQL/XML (SQLX)」を参照してください。
期間リテラルは期間を指定します。Oracle CEP では期間リテラル DAY
TO
SECOND
がサポートされています。このリテラルには先頭フィールドが含まれ、末尾フィールドを含めることができます。先頭フィールドは、測定する日付または時間の基本単位を定義します。末尾フィールドは、該当する基本単位の最小の増分を定義します。部分範囲 (SECOND
や MINUTE to SECOND
など) はサポートされていません。
期間リテラルは 64 バイトを超えてはなりません。
以下の構文を使用して、DAY
TO
SECOND
期間リテラルを指定します。
const_string
は、適切な日時書式モデルに準拠する TIMESTAMP
値です (節 2.5.2「日時書式モデル」を参照)。
INTERVAL
DAY
TO
SECOND
リテラルの例を示します。
期間リテラルの形式 | 解釈 |
---|---|
INTERVAL '4 5:12:10.222' DAY TO SECOND(3) |
4 日、5 時間、12 分、10 秒、222 ミリ秒 |
ある DAY
TO
SECOND
期間リテラルを別の DAY
TO
SECOND
リテラルと加算または減算したり、期間リテラルを比較したりできます (例 2-9 を参照)。この例で、ストリーム tkdata2_SIn1 のスキーマは (c1 integer, c2 interval)
です。
書式モデルは、文字列に格納されている日時または数値データの形式を記述する文字リテラルです。文字列を日付または数値に変換する場合、Oracle CEP での文字列の解釈のしかたは書式モデルによって決まります。Oracle CQL クエリに関連する以下の書式モデルがあります。
Oracle CQL では java.text.SimpleDateFormat
が指定する書式モデルがサポートされています。
表 2-4 は、Oracle CQL が TIMESTAMP
リテラルの解釈に使用する java.text.SimpleDateFormat
モデルを示しています。詳細については、節 2.4.3「日時リテラル」を参照してください。
表 2-4 日時書式モデル
書式モデル | 例 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
以下の関数で、日時書式モデルを使用できます。
TO_TIMESTAMP
: char
データ型の値を TIMESTAMP
データ型に変換します。
列の行に値がない場合、その列は null である、または null を含んでいる、と言われます。プライマリ キー整合性制約によって制限されていない任意のデータ型のタプルでは、null が含まれている場合があります (out_of_line_constraint::= を参照)。実際の値が不明な場合や、値が意味を持たない場合は null を使用します。
Oracle CEP では、長さが 0 の文字値は null として処理されます。ただし、数値 0 を表す場合には null を使用しないでください。これらは等しくありません。
注意 : 現在、Oracle CEP では長さ 0 の文字値が null として処理されます。ただし、将来のリリースではこの処理が変更される場合があるため、Oracle では空の文字列を null と同じように処理しないことをお勧めします。 |
null を含む算術式は常に null に評価されます。たとえば、10 に null を加算すると null です。実際、null オペランドを指定すると、すべての演算子では null が返されます (連結を除く)。
詳細については、以下を参照してください。
null 引数を指定すると、すべてのスカラ関数では null が返されます (NVL
と CONCAT
を除く)。NVL
関数を使用すると、null が発生した場合に値を返すことができます。たとえば、式 NVL(commission_pct,0)
は、commission_pct
が null の場合に 0 を返し、null でない場合に commission_pct
の値を返します。
ほとんどの集約関数では null が無視されます。たとえば、1000、null、null、null、および 2000 の 5 つの値を平均するクエリがあるとします。このようなクエリでは null が無視され、平均は (1000+2000)/2 = 1500 のように計算されます。
null をテストするには、null 比較条件のみを使用します (null_conditions::= を参照)。それ以外の条件を null で使用すると、結果が null 値に依存し、結果が UNKNOWN
になります。null はデータがないことを表すため、任意の値または別の null と等しいか等しくないかを比較できません。ただし、Oracle CEP では decode 式の評価時に 2 つの null が等価であると見なされます。構文と追加情報については、decode::= を参照してください。
UNKNOWN
に評価される条件は FALSE
とほぼ同様に動作します。たとえば、条件の WHERE
句が UNKNOWN
に評価される SELECT
文ではタプルが返されません。ただし、UNKNOWN
に評価される条件は、UNKNOWN
条件の評価でさらに操作を行う場合は UNKNOWN
に評価されるので FALSE
とは異なります。このため、NOT
FALSE
は TRUE
に評価されますが、NOT
UNKNOWN
は UNKNOWN
に評価されます。
表 2-5 は、条件で null を使用する場合のさまざまな評価の例を示しています。SELECT
文の WHERE
句で UNKNOWN
に評価される条件を使用する場合、クエリで返される行はありません。
条件 | A の値 | 評価 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
詳細については、節 12.6「Null 条件」を参照してください。
AS
演算子を使用すると、Oracle CQL でクエリ、リレーション、ストリーム、およびクエリの SELECT
リスト項目のエリアスを指定できます。
この節では、以下について説明します。
詳細については、第 14 章「Oracle CQL のクエリ、ビュー、および結合」を参照してください。
relation_variable
句の AS
演算子でエリアスを定義して select リストの直前の式にラベルを付け、その名前で結果を参照できます。エリアスによって、クエリの期間中に select リストの項目名が効率的に変更されます。エリアスは、ORDER
BY
句 (節 14.2.6「クエリ結果のソート」を参照) で使用できますが、クエリの他の句では使用できません。
例 2-10 は、SELECT
リストのストリーム要素 its.itemId
のエリアス badItem
と、MATCH_RECOGNIZE
句のエリアス its
を定義する方法を示しています。
例 2-10 SELECT 文での AS 演算子の使用
<query id="detectPerish"><![CDATA[ select its.itemId from tkrfid_ItemTempStream MATCH_RECOGNIZE ( PARTITION BY itemId MEASURES A.itemId as itemId PATTERN (A B* C) DEFINE A AS (A.temp >= 25), B AS ((B.temp >= 25) and (to_timestamp(B.element_time) - to_timestamp(A.element_time) < INTERVAL "0 00:00:05.00" DAY TO SECOND)), C AS (to_timestamp(C.element_time) - to_timestamp(A.element_time) >= INTERVAL "0 00:00:05.00" DAY TO SECOND) ) as its ]]></query>
詳細については、節 14.2.1.3「From 句」を参照してください。
AS
演算子でエリアスを定義して直前の枠演算子にラベルを付け、その名前で結果を参照できます。
枠演算子の内部では AS
演算子を使用できませんが、枠演算子の外部では AS
演算子を使用できます。
例 2-11 は、分割範囲の枠演算子の後でエリアス bid と ask を定義する方法を示しています。
例 2-11 枠演算子の後の AS 演算子の使用
<query id="Rule1"><![CDATA[ SELECT bid.id as correlationId bid.cusip as cusip max(bid.b0) as bid0 bid.srcid as bidSrcId, bid.bq0 as bid0Qty, min(ask.a0) as ask0, ask.srcid as askSrcId, ask.aq0 as ask0Qty FROM stream1[PARTITION by bid.cusip rows 100 range 4 hours] as bid, stream2[PARTITION by ask.cusip rows 100 range 4 hours] as ask GROUP BY bid.id, bid.cusip, bid.srcid,bid.bq0, ask.srcid, ask.aq0 ]]></query>
詳細については、節 1.1.3「ストリームからリレーションへの演算子 (枠)」を参照してください。
一部のスキーマ オブジェクトは、ストリームまたはビューのストリーム要素、整合性制約、枠、ストリーム、ビュー、およびユーザ定義の関数や枠などの、ユーザが指定できる部分または指定する必要のある部分で構成されています。この節には、以下の説明が含まれています。
詳細については、節 1.2.1「Oracle CQL 文の表記規則」を参照してください。
Oracle CEP の各オブジェクトには名前があります。Oracle CQL 文では、引用符付きの識別子または引用符なしの識別子を使用してオブジェクト名を表します。
引用符付きの識別子は、先頭と末尾に二重引用符 (") を付けます。引用符付きの識別子を使用してスキーマ オブジェクトを命名した場合は、そのオブジェクトを参照するときに必ず二重引用符を使用する必要があります。
引用符なしの識別子は記号で囲みません。
Oracle CEP オブジェクトを命名する際は、引用符付きまたは引用符なしのどちらの識別子でも使用できます。
名前では大文字と小文字が区別されます。
特に記載のある場合を除いて、以下の規則が引用符付きと引用符なしの両方の識別子に適用されます。
識別子がピリオドで区切られた複数の部分から成る場合、各属性は 30 バイトまでの長さで指定できます。各ピリオド区切り文字と外側の二重引用符は 1 バイトとしてカウントされます。たとえば、次のようなストリーム要素を識別するとします。
"stream"."attribute"
ストリーム名と要素名は 30 バイトの長さにできます。引用符記号とピリオドはそれぞれ 1 バイト文字であるため、この例の識別子の合計の長さは 65 バイトまで許可されます。
引用符なしの識別子は Oracle CEP 予約語にできません。引用符付きの識別子は予約語にできますが、これは推奨されません。
Oracle CEP オブジェクトへのアクセスに使用する Oracle 製品によっては、製品固有の予約語により名前がさらに制限される可能性があります。
Oracle CQL 言語には特殊な意味を持つ他の語が含まれています。これらの語は予約語ではありません。しかし、これらは内部的に特殊な方法で使用されます。このため、これらの語をオブジェクトやオブジェクトの各部分の名前として使用すると、Oracle CQL 文が読みにくくなり、予期しない結果が生じることがあります。
詳細については、以下を参照してください。
異なるプラットフォームまたはオペレーティング システム間で最適な互換性が提供されるため、Oracle ではスキーマ オブジェクト名に ASCII 文字を使用することをお勧めします。
引用符なしの識別子は、データベース文字セットのアルファベット文字で開始する必要があります。引用符付きの識別子は任意の文字で開始できます。
引用符なしの識別子には Java ロケールの文字セットの英数字、アンダースコア (_)、ドル記号 ($)、およびシャープ記号 (#) のみを使用できます。Oracle では、引用符なしの識別子に $ および # を使用しないことを強くお勧めします。
引用符付きの識別子には任意の文字、記号、およびスペースを使用できます。ただし、二重引用符または null 文字 (\0
) は、引用符付きまたは引用符なしのどちらの識別子にも使用できません。
詳細については、以下を参照してください。
通常、以下のオブジェクトでは、アプリケーションで一意の名前を選択する必要があります。
ストリーム
クエリ
ビュー
枠
ユーザ定義関数
ユーザ定義枠
特に、クエリとビューに同じ名前を付けることはできません。
引用符なしの識別子では大文字と小文字が区別されません。Oracle CEP ではそれらが大文字として解釈されます。引用符付きの識別子では大文字と小文字が区別されます。
二重引用符で名前を囲むことによって、以下の名前を同じ名前空間の異なるオブジェクトに割り当てることができます。
employees "employees" "Employees" "EMPLOYEES"
Oracle CEP では以下の名前が同等に解釈されるため、同じ名前空間の異なるオブジェクトにはこれらの名前を使用できません。
employees EMPLOYEES "EMPLOYEES"
同一のストリームまたはビューのストリーム要素には同じ名前を使用できません。ただし、異なるストリームまたはビューのストリーム要素には同じ名前を使用できます。
関数の引数の個数およびデータ型が異なる (つまり、シグネチャが固有である) 場合は、関数に同じ名前を使用できます。引数の異なる同名の関数を複数作成することは、関数のオーバーロードと呼ばれます。
組み込み関数と同じ名前とシグネチャを持つユーザ定義関数を登録または作成すると、ユーザ関数が組み込み関数のシグネチャに取って代わります。組み込み関数と同じ名前とシグネチャを持つ関数を作成することは、関数の上書きと呼ばれます。
組み込み関数はパブリックですが、ユーザ定義関数は特定のスキーマに属しています。
詳細については、以下を参照してください。
以下は、オブジェクトおよび各部分の命名に役立つガイドラインです。
完全な、わかりやすい、発音可能な名前 (またはよく知られた略語) を使用します。
一貫性のある命名規則を使用します。
ストリーム、ビュー、およびクエリ間で同一のエンティティまたは属性を記述するには、同じ名前を使用します。
オブジェクトを命名する際は、短くて簡単に使用できる名前と可能な限り説明的な名前を付けることのバランスを取ります。迷った場合は、より説明的な名前のほうを選びます。これは、Oracle CEP のオブジェクトが多くの人々によって一定の期間使用される可能性があるためです。payment_due_date
の代わりに pmdd
などのストリーム要素名を付けると、10 年後のユーザにとっては理解しづらいことが考えられます。
一貫性のある命名規則を使用すると、アプリケーションでの各ストリームの役割が理解しやすくなります。このような規則として、FINANCE
アプリケーションに属するすべてのストリーム名を fin_
で開始するなどがあります。
ストリーム間で同一の項目を記述するには、同じ名前を使用します。たとえば、employees
および departments
ストリームでは、どちらも部門番号のストリーム要素に department_id
という名前を付けます。
以下は、有効なスキーマ オブジェクト名の例です。
last_name horse hr.hire_date "EVEN THIS & THAT!" a_very_long_and_valid_name
これらの例はすべて節 2.9.1「スキーマ オブジェクトの命名規則」の規則に従っています。以下の例は 30 文字を超えているため無効です。
a_very_very_long_and_invalid_name