4.5.4 字句規則

ここでは,edmSQLで使用する字句に関する規則について説明します。

<この項の構成>
(1) 文字コードセットとの対応
(2) edmSQLで使用できる文字
(3) <区切り文字>
(4) <トークン>
(5) <キーワード>
(6) <リテラル>
(7) <識別子>
(8) <名前>
(9) <ID文字列>
(10) <特殊なプロパティ>
(11) <?パラメタ>
(12) <OIID>

(1) 文字コードセットとの対応

ここでは,edmSQLで使用できる字句と,文字コードセットとの対応について説明します。

(2) edmSQLで使用できる文字

edmSQLで使用できる文字を,次の表に示します。

表4-25 edmSQLで使用できる文字

文字
英大文字A~Z
英小文字a~z
数字0~9
16進数字0~9,a~f,およびA~F
特殊文字(半角文字コード)<空白>
<ダブルクォート>(")
<パーセント>(%)
<アンパサンド>(&)
<シングルクォート>(')
<左括弧>(()
<右括弧>())
<アスタリスク>(*)
<+符号>(+)
<コンマ>(,)
<-符号>(-)
<ピリオド>(.)
<斜線>(/)
<コロン>(:)
<セミコロン>(;)
<小なり演算子>(<)
<等号演算子>(=)
<大なり演算子>(>)
<疑問符>(?)
<左角括弧またはtrigraph >( [ または (??)
<右角括弧またはtrigraph >( ] または ??))
<サーカムフレックス>(^)
<下線文字>(_)
<垂直棒>(|)
<左中括弧>({)
<右中括弧>(})
(a) 規約詳細

edmSQLで使用できる文字の詳細について説明します。

(3) <区切り文字>

<トークン>は,<区切り文字>によって分割されます。<区切り文字>は,<トークン>を抽出するための字句解析で削除される文字です。このため,構文解析を実行する時点では,<区切り文字>は出現しません。

(a) <区切り文字>として指定できる字句

<区切り文字>として指定できる字句は,<white space>です。

(b) 規約詳細

<区切り文字>の詳細について説明します。

edmSQLでは,次の定義を<white space>として定義します。

Horizontal Tab    [0x09]
Line Feed      [0x0A]
Vertical Tabulation [0x0B]
Form Feed      [0x0C]
Carriage Return   [0x0D]
Space        [0x20]

[ ]内は,対応するASCIIコードです。

(4) <トークン>

<トークン>の定義について説明します。<トークン>は,構文の基本要素です。

<トークン>の定義には,次の要素の定義が含まれます。

それぞれの要素については,「(5)<キーワード>」,「(6)<リテラル>」および「(7)<識別子>」を参照してください。

なお,<トークン>として指定できる文字列の長さなどは,データベースに依存します。

(a) <トークン>として指定できる字句

<トークン>として指定できる字句を,次の表に示します。

表4-26 <トークン>として指定できる字句

種類参照先
正規識別子先頭が<英字>で,先頭以外が<英字>,<数字>および<下線文字>の値(7)<識別子>
キーワード<予約されたキーワード>および<予約されないキーワード>の値(5)<キーワード>
符号なし数値リテラル符号なしの数字の値(6)<リテラル>
バイナリ長トークン<符号なし数値>に<multiplier>(k,m,g)が付いた値4.5.9 関数指定の構文規則」のAS<データ型指定>
区切られた識別子<ダブルクォート>で囲まれた値
(<区切り文字>,<ダブルクォート以外の文字>および<二重ダブルクォート>を含むことができる)。
(7)<識別子>
文字列リテラル<シングルクォート>で囲まれた値
(<シングルクォート以外の文字>または<二重シングルクォート>('')が指定できる)。
(6)<リテラル>
特殊文字edmSQLで使用できる特殊文字(2)edmSQLで使用できる文字
そのほかの文字
  • <不等号演算子>(<>)
  • <大なり等号演算子>(>=)
  • <小なり等号演算子>(<=)
  • <文字列連結演算子>(||)
  • <右矢印演算子>(->)
  • <二重コロン>(::)
  • <左大括弧> ([)
  • <右大括弧>(])
  • <アンパサンド>(&)
(凡例)
-:該当しません。

(b) 規約詳細

<トークン>の詳細について説明します。

<トークン>が区切られる単位についての詳細
  • <トークン>で指定できる要素のうち,<正規識別子>,<キーワード>,<符号なし数値リテラル>および<バイナリ長トークン>は,<トークン>を区切る要素として扱われます。これ以外の<トークン>を指定する場合は,前後に<区切り文字>または区切る要素になる<トークン>を指定して,前後との区切りを明確にしてください。区切る要素を指定しないで指定した場合,複数の<トークン>が一つの<トークン>として扱われたり,字句解析エラーになったりします。
    <トークン>の表記例とedmSQL検索実行時の値の対応を,次の表に示します。

    表4-27 トークンの表記例とedmSQL検索実行時の値の対応

    トークンの表記例edmSQL検索実行時の値
    ABC□123正規識別子ABCと数値リテラル123
    ABC123正規識別子ABC123
    ABC'123'正規識別子ABCと文字列リテラル'123'
    123ABC正規識別子の先頭に数字は指定できないため,字句解析エラーになります。
    (凡例)
    □:区切り文字

  • <トークン>と<トークン>の間には任意の個数の区切り文字を指定できます。
    例えば,□を区切り文字とした場合,「prop□□□=□□□□□□□□□10」は,「prop=10」と同じ意味になります。また,「COUNT□□□□□(□□□*□□)」は,「COUNT(*)」と同じ意味になります。
  • <トークン>の中に区切り文字を指定することはできません。ただし,<シングルクォート>に囲まれた文字列リテラルや<ダブルクォート>に囲まれた区切られた識別子の中には,区切り文字を指定できます。
    例えば,□を区切り文字とした場合,「<□=」は,演算子「<=」ではなく,二つの演算子「<」と「=」と識別されるため,構文解析エラーになります。また,「'<□='」は,文字列定数「'<□='」と識別されるため,エラーにはなりません。
<ダブルクォート><ダブルクォート以外の文字><二重ダブルクォート>に関する詳細
  • <ダブルクォート以外の文字>は,使用できる文字コードセットの文字から,<ダブルクォート>を除外したものです。edmSQLで使用できる文字で構成されている必要はありません。
    ただし,DocumentBrokerのメタ定義で使用できる文字およびHiRDBで使用できる文字以外は指定できません。
  • <二重ダブルクォート>は,<区切られた識別子>内で<ダブルクォート>を指定する場合に使用します。
<バイナリ長トークン>についての詳細
  • <バイナリ長トークン>は,Binary型の定義長を指定するためのトークンです。関数の引数に指定する?パラメタに対して,データ型を明示するためのAS<データ型指定>で使用します。
使用できる<特殊文字>についての詳細
  • 次に示す<特殊文字>および演算子は,文字列リテラルの字句としてだけ使用できます。それ以外で使用した場合,字句解析時にエラーになります。
    % & : (?? ??) ^ | { } -> ::

(5) <キーワード>

<キーワード>の定義について説明します。<キーワード>には<予約されるキーワード>(予約語)と<予約されないキーワード>があります。

<キーワード>では,大文字と小文字は区別されません。

ただし,このマニュアルの例では,<予約されるキーワード>を大文字で,<予約されないキーワード>を小文字で表記します。

edmSQLのキーワードはSQLのキーワードを基盤として,次のように定義されています。

(a) <キーワード>として指定できる字句

<キーワード>として指定できる字句を,次の表に示します。

表4-28 <キーワード>として指定できる字句

種類特徴
関数名concept_with_score
contains
cotains_with_score
extracts
objref
oiid
oiidstr
score
score_concept
予約されないキーワードです。
multiplierk
m
g
句に使用するキーワードSELECT
FROM
WHERE
ORDER
GROUP
BY
HAVING
予約されるキーワードです。
述語に使用するキーワードIS
ALL
SOME
ANY
IN
LIKE
XLIKE
EXISTS
BETWEEN
AS
ESCAPE
論理演算に使用するキーワードNOT
AND
OR
リテラルに使用するキーワードNULL
TRUE
FALSE
UNKNOWN
結合条件に使用するキーワードJOIN
INNER
OUTER
LEFT
ON
データ操作および重複排除に使用するキーワードDISTINCT
ASC
DESC
集合関数で使用するキーワードCOUNT
数値関数で使用するキーワードABS
DMAの検索モデルで使用するキーワードID
プロパティのデータ型で使用するキーワードBINARY
BOOL
BOOLEAN
INT
INTEGER
STRING
DocumentBrokerの文書モデルで使用するキーワードACL
CARDINALITY
CLASS
CONTAINER
CONTENT
DOCUMENT
EVERYONE
FOLDER
FOR
GROUP
LINK
LOCK
OBJECT
OF
OWNER
PARENT
PRIVATE
PROPERTY
PUBLIC
READ
TO
TYPE
UNLINK
UPDATE
VARRAY
VERSION
VERSIONABLE
WRITE
(b) 規約詳細

<キーワード>の詳細について説明します。

<キーワード>の表記についての詳細
キーワードでは,大文字と小文字が区別されません。正規識別子の規約とは異なりますので,ご注意ください。edmSQLでは,キーワードはすべて大文字として管理されます。
例えば,次の表記は,すべて<予約されるキーワード>「SELECT」として識別されます。

Select SeLect select selecT

また,次の表記はすべて<予約されないキーワード>「contains_with_score」として識別されます。

Contains_With_SCORE contains_with_scorE
CONTAINS_WITH_SCORE

<キーワード>と<正規識別子>の関係についての詳細
  • <予約されるキーワード>は正規識別子として使用できません。
  • <予約されないキーワード>は正規識別子として使用できますが,HiRDBで予約語として定義されている場合は,使用できません。使用すると,データベースエラーになります。

(6) <リテラル>

<リテラル>の定義について説明します。<リテラル>とは,NULL値以外の値です。

<リテラル>には,次の種類があります。

(a) <リテラル>として指定できる字句

<リテラル>として指定できる字句を,次の表に示します。

表4-29 <リテラル>として指定できる字句

種類
文字列リテラル<シングルクォート>で囲まれた文字列
(文字列には,<シングルクォート以外の文字>または<二重シングルクォート>('')が指定できる)。
数値リテラル符号(+または)付きの数字
(符号は省略できる)。
論理リテラルTRUE
FALSE
UNKNOWN
注※
<シングルクォート以外の文字>は,使用できる文字コードセットの文字から,<シングルクォート>を除外したものです。edmSQLで使用できる文字で構成される必要はありません。ただし,文字列リテラルはString型の値であるため,String型を格納するHiRDBのデータ型(MVARCHAR型)で制限される文字は使用できません。

(b) 規約詳細

<リテラル>の詳細について説明します。

文字列リテラルの詳細
文字列リテラルは,任意の文字列定数を表現する場合に使用します。文字列リテラルは,String型の値に対応します。したがって,文字列リテラルで使用できる文字列の長さは,データベースの制限に従います。データベースの制限以上の長さの文字列を文字列リテラルとして指定したい場合は,?パラメタを使用してください。
文字列リテラルの表記例とedmSQL検索実行時の値の対応を,次の表に示します。なお,文字列リテラルを表すString型の値は,HiRDBではMVARCHAR型のデータとして格納されます。

表4-30 文字列リテラルの表記例とedmSQL検索実行時の値の対応

文字列リテラルの表記例値の扱われ方edmSQL検索実行時の値
'aaa'文字列データaaa
'124'文字列データ124
'abc あいうえお'混在文字列データabc あいうえお
'ab''c あ''いうえお'シングルクォートのエスケープab'c あ'いうえお
数値リテラル(符号付き数値リテラル)の詳細
数値リテラルは,任意の数値定数を表現する場合に使用します。なお,DocumentBrokerで使用できる数値リテラルは,4バイトの整数値だけです。
なお,4バイトの整数値の有効値は,-2,147,483,648~2,147,483,647までの値です。この範囲外の値を指定した場合,データベースの制限に従って,目的の検索が実行できなかったり,データベースのエラーになったりします。
数値リテラルの表記例とedmSQL検索実行時の値の対応を,次の表に示します。

表4-31 数値リテラルの表記例とedmSQL検索実行時の値の対応

数値リテラルの表記例値の扱われ方edmSQL検索実行時の値
123数値データ123
0000000123​数値データ123
+1234567890​数値データ(正の整数値)1234567890​
-1234567890​数値データ(負の整数値)-1234567890​
987654321000000000​リテラルとしては正しい表記ですが,4バイト整数値の有効値ではないため,正しく扱われません。
(凡例)
-:該当する値がありません。

論理リテラルの詳細
論理リテラルは,論理値である「真」,「偽」および「不定」の三つの値を,それぞれ「TRUE」,「FALSE」および「UNKNOWN」で表現します。
論理型の値を表すBoolean型のプロパティの値は,TRUEは「1」,FALSEは「0」,UNKNOWNは「2」として,数値で格納されます。ただし,この値をedmSQLで数値として扱うことはできません。edmSQLで指定する場合は,必ずTRUE,FALSEまたはUNKNOWNとして表現してください。
また,論理リテラルを整数の演算に使用する値として使用することもできません。ただし,クラスライブラリを使用して,C++のデータモデルに変換した場合は,論理リテラルの値を数値として扱うこともできます。この場合の数値のデータベースでの扱われ方は,データベースでのデータモデルの対応付けに依存します。
論理リテラルの表記ごとの,論理値を表すTRUEの扱われ方について,例に示します。
  • 次のTRUEはデータベースによって,論理述語として処理されます。

 contains(edmProp_Content,'文章[概要{"コンピュータ"}]') IS TRUE

  • 次のTRUEはクラスライブラリを通して数値として処理されます。ただし,myProp_OKはBoolean型のプロパティです。

 myProp_OK = TRUE

(7) <識別子>

<識別子>の定義について説明します。<識別子>には,<正規識別子>と<区切られた識別子>があります。

なお,識別子には,日本語の文字コードセットは使用できません。

(a) <識別子>として指定できる字句

<識別子>として指定できる字句を,次の表に示します。

表4-32 <識別子>として指定できる字句

種類
正規識別子先頭は<英字>で,先頭以外が<英字>,<数字>および<下線文字>の値
usrClass_ABC
区切られた識別子<ダブルクォート>で囲まれた値
(<区切り文字>,<ダブルクォート以外の文字>または<二重ダブルクォート>("")を含むことができる)
"user class"
"user""class"
注※
<ダブルクォート以外の文字>として指定できるのは,英字,数字および「"」を除いた特殊文字です。

(b) 規約詳細

<識別子>の詳細について説明します。

<正規識別子>に関する詳細
  • edmSQLでは,<正規識別子>に使用される英字の<英大文字>と<英小文字>が区別して扱われます。このため,SQLを使用する時のように,<英大文字>と<英小文字>を区別するために,<区切られた識別子>を使用する必要はありません。
  • <正規識別子>に<キーワード>は使用できません。<キーワード>と同じ識別子を使用する場合は,<区切られた識別子>として指定してください。
<区切られた識別子>に関する詳細
  • 値が空の区切られた識別子「""」は,無効な識別子として扱われます。これを指定した場合は,字句解析エラーになります。

(8) <名前>

<名前>の定義について説明します。<名前>では,クラス名,プロパティ名,相関名および関数名を表現します。

<名前>の基本要素は,<識別子>と<ID文字列>です。

(a) <名前>として指定できる字句

<名前>として指定できる字句を,次の表に示します。

表4-33 <名前>として指定できる字句

種類参照先
クラス名
  • <識別子>
  • <ID文字列>
プロパティ名
  • <識別子>
  • <ID文字列>
  • <特殊なプロパティ>
関数名(変換関数)
  • oiidstr
  • objref
  • oiid
(全文検索関数)
  • contains
  • contains_with_score
  • score
  • extracts
(概念検索関数)
  • concept_with_score
  • score_concept
相関名<識別子>
(b) 規約詳細

<名前>の詳細について説明します。

クラス名の詳細
<クラス名>は,文書空間内でクラスを識別するための名称(dmaProp_DisplayNameの値),またはGUID値のID文字列表現です。使用できる文字列の長さは,データベースのテーブル名に使用できる文字列の長さに従います。
一つのedmSQL文の中で,同じクラスを識別するための<クラス名>の表現に,名称とID文字列を混用することはできません。一つのedmSQL文では,<クラス名>は,名称またはID文字列で統一して表記してください。例えば,<FROM句>の<クラス名>にID文字列を指定した場合は,<WHERE句>などでプロパティを修飾する<クラス名>にもID文字列を指定する必要があります。
<識別子>および<ID文字列>の詳細は,「(7)<識別子>」および「(9)<ID文字列>」を参照してください。
プロパティ名の詳細
<プロパティ名>は,文書空間内でプロパティを識別するための名称(dmaProp_DisplayNameの値),またはGUID値のID文字列表現です。使用できる文字列の長さは,データベースのカラム名に使用できる文字列の長さに従います。
一つのedmSQL文の中で,同じプロパティを識別するための<プロパティ名>の表現に,名称とID文字列を混用することはできません。なお,そのプロパティがどのクラスのプロパティであるかが明確でない場合は,<プロパティ名>を<クラス名>または<相関名>で修飾する必要があります。
一つのedmSQL文では,<プロパティ名>は,名称またはID文字列で統一して表記してください。例えば,<選択項目>の<プロパティ名>にID文字列を指定した場合は,ORDER BY句で指定する<プロパティ名>にも,ID文字列を指定する必要があります。
<識別子>,<ID文字列>および<特殊なプロパティ>の詳細は,「(7)<識別子>」,「(9)<ID文字列>」および「(10)<特殊なプロパティ>」を参照してください。
注意事項
DocumentBrokerでは,プロパティの定義は文書空間ごとに定義されています。したがって,異なるクラスに登録されたプロパティであっても,同じ文書空間内のクラスであれば,プロパティの性質は同じことが保証されています。ほかのオブジェクト指向言語で,クラスのスコープ単位にプロパティが定義されているものとは異なりますので,ご注意ください。
関数名の詳細
<関数名>は,edmSQLで予約されないキーワードとして登録されている関数を識別するための名称です。
関数についての詳細は,「4.5.9 関数指定の構文規則」を参照してください。
相関名の詳細
<相関名>は,同じクラスを結合する場合に,結合するクラスを区別するための名称です。一つの<FROM句>の中に,同じクラスを複数回指定する場合には,必ず<相関名>を指定して,それぞれのクラスを一意に識別できるようにしてください。
そのほか,<相関名>は,<クラス名>の別名としても使用できます。
<相関名>として使用できる文字列の長さなどの制限については,データベースの相関名に関する制限に従います。

(9) <ID文字列>

<ID文字列>の定義について説明します。<ID文字列>は,<クラス名>や<プロパティ名>を,名称(dmaProp_DisplayNameに定義した値)以外で表記するための文字列です。

DocumentBrokerの文書空間では,クラスやプロパティはGUIDによって定義され,識別されます。クラスライブラリのメソッドでも,クラスやプロパティの識別には,このGUIDを指定します。これと同様に,edmSQLでも,GUIDでクラスやプロパティを指定できます。

なお,クラスライブラリでは,GUID値は,DmaId型という構造体で管理されますが,edmSQLでは,データ型ではなく,GUIDを<ID文字列>という記述形式で表現します。<クラス名>や<プロパティ名>と同じ扱いになるため,<ID文字列>に?パラメタによって値を指定することはできません。

(a) <ID文字列>として指定できる字句

<ID文字列>は,<シングルクォート>で囲まれたGUID文字列として指定します。

GUID文字列とは,「X」を0~9およびa~f(小文字)で表される16進数とした「XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX(8けた-4けた-4けた-4けた-12けた)」の形式の文字列です。

なお,<ID文字列>に指定する「ID」と<ID本体>の間に,区切り文字は指定できません。

(b) 規約詳細

<ID文字列>の詳細について説明します。

<ID文字列>が区切られる単位についての詳細
ID文字列の「ID」は,<予約されるキーワード>です。したがって,<非区切りトークン>として扱われます。また,<ID本体>は,<区切りトークン>として扱われます。このため,<ID文字列>の前に<区切り文字>なしで<非区切りトークン>は指定できませんが,<ID文字列>の後ろに<区切り文字>なしで<非区切りトークン>は指定できます。
<ID文字列>の表記例とedmSQL検索実行時の値の扱われ方を,次の表に示します。

表4-34 <ID文字列>の表記例とedmSQL検索実行時の値の扱われ方

<ID文字列>の表記扱われ方
ID'FA7DA34B-CFF3-11d3-A03E-00A0C9967923​'正しい<ID文字列>として扱われます。
ID□'FA7DA34B-CFF3-11d3-A03E-00A0C9967923​'「ID」と<ID本体>の間に区切り文字が入っているため,字句解析エラーになります。
ID'FA7DA34B-CFF3-11d3-A03E-00A0C9967923​'FROM<ID文字列>と「FROM」として扱われます。
SELECTID'FA7DA34B-CFF3-11d3-A03E-00A0C9967923​'「SELECTID」と文字リテラルとして扱われます。
(凡例)
□:区切り文字または<空白>

(10) <特殊なプロパティ>

<特殊なプロパティ>の定義について説明します。<特殊なプロパティ>とは,全文検索で使用する全文検索インデクス用プロパティです。

(a) <特殊なプロパティ>として指定できる字句

<特殊なプロパティ>として指定できる字句を,次の表に示します。

表4-35 <特殊なプロパティ>として指定できる字句

種類説明
特殊なプロパティedmProp_TextIndexedmProp_TextIndexプロパティを表す<正規識別子>
edmProp_StIndexedmProp_StIndexプロパティを表す<正規識別子>
edmProp_ConceptTextIndexedmProp_ConceptTextIndexプロパティを表す<正規識別子>
edmProp_ConceptStIndexedmProp_ConceptStIndexプロパティを表す<正規識別子>
edmProp_ContentedmProp_Contentプロパティを表す<正規識別子>

これらのプロパティの特長については,「4.4.2 全文検索機能付き文書クラスの作成」を参照してください。

(b) 規約詳細

<特殊なプロパティ>の詳細について説明します。

<特殊なプロパティ>と<プロパティ名>についての詳細
  • <特殊なプロパティ>は,edmSQLで,DMAの検索モデルを拡張するための導入されたプロパティです。このプロパティは,edmSQLによって予約されたプロパティ名であるため,<プロパティ名>としては使用できません。なお,DocumentBrokerとしても,ユーザプロパティに「dmaProp_」,「edmProp_」および「dbrProp_」で始まるプロパティ名称は使用できません。
    なお,クラスライブラリで拡張したプロパティのうち,<特殊なプロパティ>として定義されていないプロパティについては,ほかのプロパティと同様の処理ができます。
<特殊なプロパティ>を指定できる関数についての詳細
<特殊なプロパティ>を指定できる関数を示します。
edmProp_TextIndex,edmProp_StIndex,edmProp_Contentを第1引数に指定できる関数
  • contains関数
  • contains_with_score関数
  • score関数
  • extracts関数
edmProp_ConceptTextIndex,edmProp_ConceptStIndexを第1引数に指定できる関数
  • contains関数
  • contains_with_score関数
  • score関数
  • extracts関数
  • concept_with_score関数
  • score_concept関数
<特殊なプロパティ>を引数に指定できる関数の詳細については,「4.5.9 関数指定の構文規則」を参照してください。

(11) <?パラメタ>

<?パラメタ>は,検索条件の定数を構文解析時には固定しないで,検索実行時に定数を指定するために使用するパラメタです。edmSQL文には定数を指定する代わりに「?」を指定して,問い合わせの実行直前にCdbrEqlStatementクラスのSetParamメソッドなどで値を「?」に設定します。<?パラメタ>を使用することで,構文解析済みのedmSQL文を定数値だけを変えて繰り返し利用できるので,処理性能があがります。

また,概念検索を実行する場合には,検索条件は<?パラメタ>を使用しないと指定できません。

(a) <?パラメタ>として指定できる字句

<?パラメタ>として指定できるのは,?だけです。

(b) 規約詳細

<?パラメタ>の詳細について説明します。

<?パラメタ>に指定する値のデータ型に関する詳細
  • <?パラメタ>で指定される値のデータ型は不定です。このため,edmSQL文の構文解析時にはデータ型はチェックされません。ただし,AS<データ型指定>で明示的にデータ型を指定した<?パラメタ>については,データ型のチェックの対象になります。
  • <ルーチンの起動>の引数として<?パラメタ>を使用する場合は,AS<データ型指定>で明示的にデータ型を指定してください。
<?パラメタ>に値を設定するメソッドについての詳細
  • CdbrEqlStatement::SetParamメソッド,CdbrEqlStatement::SetObjParamメソッドおよびCdbrEqlStatement::SetOIIDParamメソッドで<?パラメタ>に値を設定する場合,メソッドの引数には,edmSQLの定数表現ではなくクラスライブラリのデータ型に従った値を指定してください。
  • CdbrEqlStatement::SetParamメソッドによって<?パラメタ>の値を設定した場合,メソッドの引数に指定した値がそのまま<?パラメタ>の値として設定されます。
  • CdbrEqlStatement::SetOIIDParamメソッドによって<?パラメタ>の値を設定した場合,メソッドの引数に指定した値(OIID文字列)をdmaProp_OIIDプロパティの格納形式(16バイト)に変換された値が<?パラメタ>の値として設定されます。
  • CdbrEqlStatement::SetObjParamメソッドによって<?パラメタ>の値を設定した場合,メソッドの引数に指定した値(OIID文字列)をオブジェクトリファレンスの形式に変換された値が<?パラメタ>の値として設定されます。

(12) <OIID>

<OIID>の定義について説明します。

検索対象になるオブジェクトは,OIIDによって識別されます。OIIDの値は,データベース上では,各オブジェクトのdmaProp_OIIDプロパティに,String型の16バイトの値として格納されています。

一方,クラスライブラリでは,OIIDを「dma://」で始まるOIID文字列(DMA URL)で表記します。これは,実際にdmaProp_OIIDプロパティに格納されている値とは異なります。したがって,クラスライブラリで使用するOIID文字列を直接edmSQL文に指定しても,OIIDを対象にした検索はできません。また,検索結果としてdmaProp_OIIDプロパティの値を取得した場合は,クラスライブラリで使用するOIID文字列に変換されたものを使用します。

(a) OIID文字列をdmaProp_OIIDプロパティの値に変換する指定(OIID変換インタフェース

検索条件にOIID文字列を指定する場合に,指定したOIID文字列をdmaProp_OIIDプロパティの値に変換するためには,次のどちらかの方法を使用します。

OIID変換インタフェースの使用例
次に,OIID変換インタフェースの使用例について説明します。
OIID変換インタフェースを使用しないでOIIDを検索しようとしている例
dmaProp_OIIDプロパティの値とOIID文字列の形式は異なるため,検索結果が「真」になる(検索結果が取得できる)ことはありません。

SELECT  myProp_Foo
FROM    myClass
WHERE  dmaProp_OIID = 'dma:///xxx/xxx/xxx…x'

oiid関数を使用してOIIDを検索する例
検索結果が「真」になる(検索結果が取得できる)可能性があります。

SELECT  myProp_Foo
FROM    myClass
WHERE  dmaProp_OIID = oiid('dma:///xxx/xxx/xxx…x')

SetOIIDParamメソッドを使用してOIIDを検索する例
検索結果が「真」になる(検索結果が取得できる)可能性があります。

SELECT  myProp_Foo
FROM    myClass
WHERE  dmaProp_OIID = ?

このとき,SetParamメソッドやSetObjParamメソッドを使用して<?パラメタ>の値を設定しても,正しい検索はできません。
(b) dmaProp_OIIDプロパティの値をOIID文字列に変換する指定(dmaProp_OIID取得インタフェース

検索結果としてdmaProp_OIIDプロパティの値として取得した場合,検索結果として取得する構造体には,edmSQLによってOIID文字列に変換された値が格納されます。明示的に変換する必要はありません。