3 式
式は、次の目的に使用します。
-
INSERT...SELECT
文の選択リスト -
WHERE
句およびHAVING
句の条件 -
GROUP BY
句およびORDER BY
句
次の項では、TimesTenの式について説明します。
式の指定
式には、SQL処理で使用する値を指定します。
式は、算術演算子、比較演算子、文字列またはバイナリ演算子、ビット演算子、または「関数」で説明するいずれかの関数で連結された1つまたは複数のプライマリで構成できます。プライマリは、SQL構文に示された項目から算出される、符号付きまたは符号なしの値です。
SQL構文
{ColumnName
| ROWID | {? | :DynamicParameter
} |Function
|Constant
| (Expression
)}
または
[[+ |-] {ColumnName
| SYSDATE | TT_SYSDATE|GETDATE() | {? | :DynamicParameter
} |Function
|Constant
| {~ | + | -}Expression
}] [...]
または
Expression1
[& | | | ^ | + | / | * | - ]Expression2
または
Expression1
| |Expression2
または
Expression
構成要素 | 説明 |
---|---|
|
単項プラスと単項マイナス 単項マイナスはプライマリの符号を変更します。デフォルトの設定では、符号は変更しません。 |
|
値を取得する列の名前 詳細は、「名前、ネームスペースおよびパラメータ」を参照してください。 |
|
表に保存される各行の一意のID ROWID値は |
|
動的パラメータのプレースホルダ 動的パラメータの値は、実行時に設定されます。 |
|
計算された値 詳細は、「関数」を参照してください。 |
|
特定の値 詳細は、「定数」を参照してください。 |
|
カッコで囲まれた任意の式 |
|
指定された式
|
|
2つのプライマリを乗算します |
|
2つのプライマリを除算します |
|
2つのプライマリを加算します |
|
2つのプライマリを減算します |
|
2つのオペランドのビット単位の
|
|
2つのオペランドのビット単位の
|
|
オペランドのビット単位の
|
|
2つのオペランドの排他
|
|
連結演算子 両方の式が文字列の場合に、 |
説明
-
数値間の計算には、算術演算子を使用できます。詳細は、「数値データ型」を参照してください。
-
日時値および時間隔型でも、算術演算子を使用できます。日時式の結果は、日時データ型または時間隔データ型です。
-
文字列値に算術演算子は使用できません。
-
式の各要素は、次の順序で評価されます。
-
カッコ内の関数および式。
-
単項プラスと単項マイナス。
-
*
および/
の演算 -
+
および–
の演算 -
優先順位が同じ要素については、左から右の順に評価されます。
-
-
式をカッコで囲み、評価の順序を制御できます。次に例を示します。
10 * 2 – 1 = 19 but 10 * (2 – 1) = 10
-
評価される式によっては、データ型の変換、切捨て、アンダーフロー、オーバーフローが発生する場合があります。詳細は、「データ型」を参照してください。
-
数値式のいずれかのオペランドが
NULL
の場合、結果はNULL
になります。 -
NVL
は、2つのパラメータ(両方とも式で指定)をとるため、TimesTenではどちらの位置にもNULL
は使用できません。式にNULL
値が含まれる場合、比較演算子や他の条件はNULL
と評価されます。NULL
値を含む比較演算子や条件の評価の詳細は、「検索条件」を参照してください。TimesTenではNULL
を挿入することはできますが、通常、INSERT
には特定の値のみが使用され、一般的な式は使用されません。 -
条件に、別々のROWID等式を指定するか、または
IN
を使用すると、問合せオプティマイザと実行エンジンで複数のROWID検索が可能です。たとえば、複数の高速ROWID検索は、次のように実行します。WHERE ROWID = :v1 OR ROWID = :v2
または、次のように指定します。
WHERE ROWID IN (:v1, :v2)
-
?
または:
DynamicParameter
は、式の中で動的パラメータとして使用できます。
例
この例では、任意のSELECT
文のWHERE
句における動的パラメータを示します。
SELECT * FROM purchasing.orders WHERE partnumber = ? AND ordernumber > ? ORDER BY ordernumber;
この例では、UPDATE
文のWHERE
句およびSET
句における動的パラメータを示します。
UPDATE purchasing.parts SET salesprice = :dynamicparameter1 WHERE partnumber = :dynamicparameter2;
この例では、DELETE
文のWHERE
句における動的パラメータを示します。
DELETE FROM purchasing.orderitems WHERE itemnumber BETWEEN ? AND ?;
この例では、INSERT
文のVALUES
句における動的パラメータを示します。この例では、?
と:
dynamicparameter
の両方が使用されています。:dynamicparameter1
は、purchasing.orderitems
表の2番目と4番目の列の両方に対応しています。そのため、この式には、2番目と4番目の列の両方に使用する2番目のパラメータを使用して、4つの動的パラメータのみを渡す必要があります。
INSERT INTO purchasing.orderitems VALUES (?,:dynamicparameter1, :dynamicparameter2, :dynamicparameter1,?);
この例は、同じSQL文で?
と:dynamicparameter
の両方を使用できることと、両方のタイプの動的パラメータを繰り返すことの意味上の違いを示しています。
ビット単位演算子の例を次に示します。
Command> SELECT 0x183D & 0x00FF FROM dual; < 003D > 1 row found. Command> SELECT ~255 FROM dual; < -256 > 1 row found. Command> SELECT 0x08 | 0x0F FROM dual; < 0F > 1 row found.
副問合せ
TimesTenでは、検索条件のINSERT...SELECT
文、CREATE VIEW
文またはUPDATE
文、およびUPDATE
文のSET
句で、導出された表として副問合せがサポートされます。サポートされるのは、表の副問合せおよびスカラー副問合せです。TimesTenでは、行の副問合せはサポートされません。副問合せでは、HAVING
句または結合表を使用して集計を指定できます。副問合せは相関も可能です。
SQL構文
[NOT] EXISTS | [NOT] IN (Subquery
)Expression
{= | <> | > | >= | < | <= } [ANY | ALL] (Subquery
)Expression
[NOT] IN (ValueList
|Subquery
)
ValueList
は定数式のリストです。各定数式は、定数値または定数値になる式(数字、文字列、日付など)を指定します。バインドされた値(?
または:DynamicParameter
)、NULL
、および定数値を返す関数のコールのサポートが含まれます。
説明
表の副問合せ:
-
副問合せは、マテリアライズド・ビューを作成する文を除き、任意の文の
WHERE
またはHAVING
句に指定できます。表の副問合せは、1つの条件に1つのみ指定できます。これらの条件は、WHERE
句やHAVING
句、WHERE
句やHAVING
句内のOR
式または結合された表のON
句に指定できます。CASE
式、マテリアライズド・ビューまたは外部結合のために+
演算子を使用するHAVING
句には指定できません。 -
副問合せは、
EXISTS
またはNOT EXISTS
条件、ANY
またはALL
を使用する限定条件または比較条件に指定できます。比較条件および限定条件の両方に使用できる演算子は、=
、<
、>
、<=
、>=
、<>
です。UNIQUE
またはNOT UNIQUE
演算子を使用して、副問合せを外部問合せに連結することはできません。 -
限定条件または比較条件に指定できる副問合せは1つのみです。副問合せは、条件の右側のオペランドまたは左側のオペランドとして指定します。両方には指定しません。
-
副問合せに
ORDER BY
句を指定することはできません。 -
FIRST
NumRows
は、副問合せの文ではサポートされていません。 -
限定条件または比較条件に指定された問合せでは、基礎となる
SELECT
の選択リストは単一の式にする必要があります。比較条件で指定される問合せの場合に、基礎となるSELECTが単一の行を戻すときは、その戻り値が選択結果になります。基礎となるSELECTが行を戻さない場合、戻り値はNULL
です。副問合せが複数の行を戻す場合はエラーになります。
スカラー副問合せは単一の値を返します。外部問合せの各行に1行のみを戻すことを、コンパイル時にオプティマイザが検出できないような条件を含むスカラー副問合せは、検証できません。OR
式にこのような副問合せを指定することはできません。
例
次に、1件以上の未発送の発注を含む顧客リストの副問合せの例を示します。
SELECT customers.name FROM customers WHERE EXISTS (SELECT 1 FROM orders WHERE customers.id = orders.custid AND orders.status = 'unshipped'); SELECT customers.name FROM customers WHERE customers.id = ANY (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped'); SELECT customers.name FROM customers WHERE customers.id IN (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped');
この例では、発注日と同じ日付に発送されたアイテムをリストします。
SELECT line_items.id FROM line_items WHERE line_items.ship_date = (SELECT orders.order_date FROM orders WHERE orders.id = line_items.order_id);
定数
定数はリテラル値です。
SQL構文
{IntegerValue
|FloatValue
|FloatingPointLiteral
|FixedPointValue
| 'CharacterString
'| 'NationalCharacterString
' |HexadecimalLiteral
| 'DateString
' |DateLiteral
|'TimeString
' |TimeLiteral
| 'TimestampString
' | TimestampLiteral |IntervalLiteral
| BINARY_FLOAT_INFINITY | BINARY_DOUBLE_INFINITY | -BINARY_FLOAT_INFINITY | -BINARY_DOUBLE_INFINITY | BINARY_FLOAT_NAN | BINARY_DOUBLE_NAN }
定数 | 説明 |
---|---|
|
たとえば: 155, 5, -17 |
|
例: .2E-4, 1.23e -4, 27.03, -13.1 |
|
浮動小数点リテラル これらは、 123.23F, 0.5d |
|
たとえば: 27.03 |
|
文字列定数は、一重引用符で囲みます。たとえば: 'DON''T JUMP!' 行中の2つの一重引用符は一重引用符として解釈され、区切り文字や空の文字列としては解釈されません。 |
|
各国語文字列定数の先頭には、 N'Here''s how!' 行中の2つの一重引用符は、一重引用符として解釈されます。 各国語文字列定数は、次の組合せで構成されます。
ASCII文字およびUTF-8にエンコードされた文字は、対応するUTF-16書式のUnicode文字に内部的に変換されます。 エスケープされたUnicode文字の書式は、 N'This is an \u0061' これは、次と同じです。 N'This is an a' もう1つの |
|
16進リテラル 数字0-9とA-F(またはa-f)を含む16進リテラルは、 0xFFFAB0880088343330FFAA7 または 0x000A001231 奇数桁の16進数字の先頭には、偶数桁にするために0が付加されます。たとえば、値 文字リテラルを指定する場合は、文字のバイナリ値を使用します。たとえば、次に、表 Command> INSERT INTO tabvb VALUES (0x1234); 1 row inserted. Command> INSERT INTO tabvb VALUES ('1234'); 1 row inserted. Command> SELECT colbin FROM tabvb; < 1234 > < 31323334 > 2 rows found. ただし、Oracle Databaseは'1234'などの文字リテラルのみを受け入れ、その文字リテラルを0x1234のバイナリ・リテラルに変換する点が異なります。結果として、 |
|
一重引用符( たとえば: '2007-01-27 12:00:00'
'2007-01-27'
|
|
書式: たとえば: DATE '2007-01-27' or DATE '2007-01-27 12:00:00'
TT_DATE '2007-01-27'.
TimesTenでは、ODBCの日付リテラル構文もサポートされます。たとえば: {d '2007-01-27'}. 詳細はODBCドキュメントを参照してください。 |
|
一重引用符( たとえば: '20:25:30' 範囲は |
|
書式: たとえば: TIME '20:25:30'
使用例: INSERT INTO timetable VALUES (TIME '10:00:00'); SELECT * FROM timetable WHERE col1 < TIME '10:00:00'; TimesTenでは、ODBCの時間リテラル構文もサポートされます。たとえば: {t '12:00:00'} |
|
一重引用符(')で囲まれた 範囲は
SELECT * FROM testable WHERE C1 = TIME '12:00:00' この例では、 |
|
書式: たとえば: TIMESTAMP '2007-01-27 11:00:00.000000'
TimesTenでは、ODBCのタイムスタンプ・リテラル構文もサポートされます。たとえば: {ts '9999-12-31 12:00:00'} |
|
書式: たとえば: INTERVAL '8' DAY |
|
正の無限大
|
|
負の無限大
|
|
非数
|
書式モデル
書式モデルは、文字列に格納された日時および数値データの書式を示す文字リテラルです。文字列を日付または数値に変換する場合は、書式モデルによって、TimesTenでの文字列の解釈方法が決まります。
この項では、次の書式モデルについて説明します。
数値書式モデル
数値書式モデルは、次の関数で使用します。
-
NUMBER
、BINARY_FLOAT
またはBINARY_DOUBLE
データ型の値をVARCHAR2
データ型に変換するTO_CHAR
関数。 -
CHAR
またはVARCHAR2
データ型の値をNUMBER
データ型に変換するTO_NUMBER
関数。
デフォルトのamerican_america
NLS言語および地域の設定が使用されます。
数値書式モデルは、1つ以上の数値書式要素で構成されます。次の表に、数値書式モデルの要素を示します。数値書式モデルに書式要素MI
、S
またはPR
が指定されないかぎり、負の戻り値の先頭には自動的に負の符号が付けられ、正の戻り値の先頭には空白が付けられます。
表3-1 数値書式要素
要素 | 例 | 説明 |
---|---|---|
|
|
指定された位置にカンマを戻します。1つの数値書式モデルに複数のカンマを指定できます。 制限:
|
|
|
指定された位置に小数点(ピリオド(.))を戻します。 制限: 1つの書式モデルで指定できるピリオドは1つのみです。 |
$ |
|
先行ドル記号を含む値を戻します。 |
|
|
先行0 (ゼロ)を戻します。 後続0 (ゼロ)を戻します。 |
|
|
指定された桁数の値を戻します。正の場合は先行空白が含まれ、負の場合は先行マイナスが含まれます。 固定小数点数の整数部分の場合、先行0(ゼロ)に対して空白を戻します。ただし、値0(ゼロ)に対しては0(ゼロ)を戻します。 |
|
|
固定小数点数の整数部分が0(ゼロ)の場合、空白を戻します(書式モデル内の0(ゼロ)には関係ありません)。 |
|
|
指定された位置にISO通貨記号を戻します。 |
|
|
指定された位置に小数点文字を戻します。デフォルトはピリオド( 制限: 1つの数値書式モデルで指定できる小数点文字は1つのみです。 |
|
|
科学表記法で値を戻します。 |
|
|
指定された位置にグループ・セパレータを戻します。1つの数値書式モデルに複数のグループ・セパレータを指定できます。 制限: 数値書式モデルでは、小数点文字(ピリオド)の右側にグループ・セパレータは使用できません。 |
|
|
指定した位置にローカル通貨記号を戻します。 |
|
|
後続のマイナス符号( 後続の空白を含む正の値を戻します。 制限:
|
|
|
山カッコ( 先行および後続の空白を含む正の値を戻します。 制限:
|
|
|
値を大文字のローマ数字として戻します。 |
|
|
値を小文字のローマ数字として戻します。 1から3999までの整数を値として指定できます。 |
|
|
先行のマイナス符号( 先行のプラス符号( |
|
|
後続のマイナス符号( 後続のプラス符号( 制限:
|
|
|
テキストの最小数値書式モデルは、文字の最小数を(10進出力で)戻します。この要素の大文字と小文字は区別されません。 デフォルトは 制限:
|
|
|
指定された位置にユーロまたは他の二重通貨記号を戻します。 |
|
|
10nを乗算した値を戻します(この値は必要に応じて丸められます)。 |
|
|
指定された桁数の16進値を戻します。指定された数値が整数でない場合は、TimesTenによって整数に丸められます。 制限:
|
日時書式モデル
日時書式モデルは、次の関数で使用します。
-
日時値のデフォルト書式以外の文字値を変換する
TO_CHAR
、TO_DATE
およびTO_TIMESTAMP
関数。 -
デフォルト書式以外の日時値を文字列に変換する
TO_CHAR
関数。
日時書式モデルの合計の長さは、22文字を超えることができません。
デフォルトのamerican_america
NLS言語および地域の設定が使用されます。
日時書式要素
日時書式モデルは、1つ以上の日時書式要素で構成されます。表3-2に、日時フォーマットの要素を示します。次の追加事項もあります。
-
入力書式モデルの場合、書式要素は複数回出現できず、類似した情報を表す書式要素は結合できません。たとえば、同じ書式文字列で
SYYYY
およびBC
書式要素は使用できません。 -
DATE
書式要素の場合、スペル表記される単語、略語、またはローマ数字での大文字化は、対応する書式要素の大文字化に従います。たとえば、日付書式モデルDAY
では、MONDAY
のように大文字化された単語が生成されますが、Day
ではMonday
が、day
ではmonday
が生成されます。
表3-2 日時書式要素
要素 | 説明 |
---|---|
|
句読点と引用符付きテキストは、結果で複製されます。 |
|
ピリオド付きまたはピリオドなしで西暦を示す。 |
|
ピリオド付きまたはピリオドなしで午前を示す。 |
|
ピリオド付きまたはピリオドなしで紀元前を示す。 |
|
世紀:
たとえば、2002は21を返し、2000は20を返します。 |
|
曜日(1から7)。 |
|
曜日。最大幅の名前を表示するために空白で埋められます。 |
|
日付(1から31)。 |
|
通日。 |
|
長い日付書式。 デフォルトの 制限: この書式は、空白で区切られた |
|
短い日付書式 デフォルトの 制限: この書式は、空白で区切られた |
|
曜日の省略名。 |
|
小数秒。基数文字は出力されません。基数文字を追加するには |
|
先行および後続する空白を持たない値を返します。 |
|
文字データと書式モデルの完全一致を返します。 |
|
時(1から12)。 |
|
時(0から23)。 |
|
ISO 8601標準で定義されているカレンダ年の週(1から52または1から53)。
|
|
ISO 8601標準で定義されているカレンダ週を含む、4桁の年。 |
|
ISO 8601標準で定義されているカレンダ週を含む、下3桁、2桁または1桁の年。 |
|
ユリウス日。 紀元前4712年1月1日からの日数です。 |
|
分(0から59)。 |
|
月(01から12。1月=01)。 |
|
月の省略名。 |
|
月の名前。最大幅の名前を表示するために空白で埋められます。 |
|
ピリオド付きまたはピリオドなしで午前を示す。 |
|
年の四半期(1、2、3、4)。1月=1。 |
|
ローマ数字での月(IからXII。1月=I)。 |
|
20世紀の年(21世紀に2桁のみを使用) |
|
丸めた年。 4桁または2桁のいずれも入力可能。2桁の場合、 |
|
秒(0から59)。 |
|
午前0時以降の秒数(0から86399)。 |
|
短い時間書式で値を返す。 制限: この書式は、空白で区切られた |
|
年の週(1から53)。週1は年の最初の日で始まり、その年の7番目の日まで続きます。 |
|
月の週(1から5)。週1はその月の最初の日で始まり、7番目の日で終了します。 |
|
ローカル基数文字 たとえば: 'HH:MI:SSXFF' |
|
指定の位置にカンマを付けた年 |
|
スペル表記された年。 |
|
4桁の年。
|
|
年の下3桁、下2桁または下1桁 |
ROUNDおよびTRUNC日付関数の書式モデル
次の表に、ROUND
およびTRUNC
日付関数に使用可能な書式モデルと、日付が丸められる場合や切り捨てられる場合の単位を示します。デフォルトのモデルDD
では、時刻部分が午前0時に丸められるか切り捨てられた日付が戻されます。
書式モデル | 丸め単位または切捨て単位 |
---|---|
|
世紀 4桁の年の下2桁が01から99(01および99を含む)の場合、世紀はその年の上2桁に1を加えた値になります。 4桁の年の下2桁が00の場合、世紀はその年の上2桁と等しい値になります。たとえば、2002は21を返し、2000は20を返す。 |
|
年(7月1日で切上げ) |
|
ISO年 |
|
四半期(四半期の2番目の月の16日で切上げ) |
|
月の名前(16日で切上げ) |
|
対象となる年の最初の日と同じ曜日 |
|
ISO週の最初の日と同じ曜日(月曜日) |
|
対象となる月の最初の日と同じ曜日 |
|
通日 |
|
開始曜日 |
|
時 |
|
分 |
TimesTen日時データ型TO_CHARの書式モデル
この書式モデルは、TO_CHAR
関数を呼び出してTT_TIMESTAMP
またはTT_DATE
の日時値を変換する場合に使用します。また、TO_CHAR
関数を呼び出してNUMBER
またはORA_FLOAT
以外の任意の数値を変換する場合にも使用します。
-
指定した書式に数値が適合しない場合、値は切り捨てられます。
-
書式文字列は、50文字以内で指定します。
-
D
の結果は、常に小数点になります。NLSパラメータを使用して、その値を変更することはできません。 -
1e-126
未満または1e126
より大きい絶対値を含む浮動小数点を、TO_CHAR
関数への入力として指定した場合、エラーが発生します。
書式 | 説明 |
---|---|
|
日付(1から31) |
|
月(1から12) |
|
月(3文字の接頭辞) |
|
月(空白が埋め込まれた9文字の正式名) |
|
年(4桁) |
|
年(カンマ付き) |
|
年(末尾3桁) |
|
年(末尾2桁) |
|
年(末尾1桁) |
|
四半期 |
|
時(1から12) |
|
時(1から12) |
|
時(0から23) |
|
分(0から59) |
|
秒(0から59) |
|
6桁の精度の秒の小数部 |
|
|
|
正午標識 |
|
正午標識 |
|
正午標識 |
|
正午標識 |
|
出力される記号 |
"text" |
出力されるテキスト |
|
桁 |
|
先行または後続0(ゼロ) |
|
小数点 |
, |
カンマ |
|
科学表記法 |
|
符号モード |
|
空白モード 数字がない場合、文字列は空白で埋められます。 |
|
非空白モード(埋込みモード) この要素が使用される場合、後続または先行の空白は削除されます。 |
|
先行ドル記号 |
CASE式
条件付きの値を指定します。単純なCASE式と検索対象のCASE式がサポートされています。CASE
式は、式を任意の場所で指定でき、必要に応じて何度でも使用できます。
一連のIF文を使用するかわりに、CASE
式を使用すると、条件が満たされた場合に適切な値を返す一連の条件を使用できます。CASE
式を使用すると、問合せを簡略化し、効率のよいコードを記述できます。
SQL構文
検索対象のCASE
式の構文は、次のとおりです。
CASE {WHENSearchCondition
THENExpression1
}[…] [ELSEExpression2
] END
単純なCASE
式の構文は、次のとおりです。
CASEExpression
{WHENCompExpression
THENExpression1
}[…] [ELSEExpression2
] END
パラメータ
CASE
には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
|
検索条件を指定します。この句は副問合せを指定できません。 |
|
比較するオペランドを指定します。 |
式 |
各 |
|
結果の式を指定します。 |
|
条件を満たさない場合の結果の式を指定します。 |
説明
CASE
式は、INSERT
文の値の句の中では指定できません。
例
色の値を指定する検索対象のCASE
文を指定するには、次の文を使用します。
SELECT CASE WHEN color=1 THEN 'red' WHEN color=2 THEN 'blue' ELSE 'yellow' END FROM cars;
色の値を指定する単純なCASE
文を指定するには、次のようにします。
SELECT CASE color WHEN 1 THEN 'red' WHEN 2 THEN 'blue' ELSE 'yellow' END FROM cars;
ROWID疑似列
TimesTenでは、表に保存される各行にROWIDと呼ばれる一意のIDが割り当てられます。このrowid (ROWID
疑似列と呼ばれる)のデータ型はROWID
です。
TimesTen Scaleoutでは、ROWID
疑似列はTimesTen Classicとは異なる意味を持ちます。
TimesTen Scaleoutの場合:
-
TimesTen Scaleoutでは、すべての要素にわたる一意性を確保するために、
ROWID
が使用されます。 -
ROWID
は、行の特定のコピーの識別子です。コピー元の要素が使用可能でないためにそのコピーが使用可能ではない場合は、ROWID
で行にアクセスできません。この場合は、主キーで行にアクセスする必要があります。 -
行の各コピーには異なる
ROWID
値があります。このことは、K-safetyが1に設定されている複製分散スキーム、およびK-safetyが2に設定されているすべての表(どのような分散スキームでも)に該当します。この場合、ROWID
ベースのアクセスを使用すると、TimesTen Scaleoutは最初のデータ領域のROWID
の値を返します。 -
アプリケーションには
ROWID
値を格納せず、これらの値を後で使用するようにしてください。 -
ROWID
値は、(データの再分散によって)データの場所が変更された場合、変化することがあります。ttGridAdmin dbDistribute
コマンドの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のデータベースの分散スキーム(dbDistribute)の設定または変更に関する項を参照してください。 -
TimesTen Scaleoutでは、
ROWID
データ型はサポートされていません。
TimesTen Classicの場合:
-
ROWIDは、
ROWID
擬似列を問い合せることで確認できます。 -
ROWID
は(実際の列ではなく)疑似列であるため、データベース領域は必要ありません。ROWID
を更新したり、索引を作成したり、削除することはできません。 -
ROWID
値は、表に行が存在する間は保持されます。 -
ROWID
値は、リカバリ、バックアップおよびリストア処理を行っても保持されます。ただし、レプリケーションの結果として、またはttMigrate
を実行してデータベースから行を移行し、データベースに戻した結果として作成された行のコピー、またはttBulkCp
を実行してデータベースから行をコピーし、データベース戻した結果として作成された行のコピーは、元の行とは異なるROWID
値になります。
TimesTen Scaleoutの詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』のデータ分散におけるのROWIDの理解に関する項を参照してください。
TimesTen ClassicのROWIDの詳細は、「式の指定」を参照してください。ROWID
データ型の詳細は、「ROWIDデータ型」を参照してください。
ROWNUM疑似列
問合せによって戻される行ごとに、ROWNUM
擬似列によって、行が選択された順序を示す数値が戻されます。最初に選択された行にはROWNUM
として1が、2番目に選択された行にはROWNUM
として2が割り当てられ、以降も同様の割当てが行われます。
次の例に示すようにROWNUM
を使用して、問合せによって戻される行数を制限します。
SELECT * FROM employees WHERE ROWNUM < 10;
行が選択された順序は、使用している索引および結合順序によって異なります。ORDER BY
句を指定すると、ソートが行われる前にROWNUM
が割り当てられます。ただし、ORDER BY
句を指定すると、使用している索引および結合順序が変更される可能性があります。選択された行の順序が変更されると、選択された各行に関連付けられているROWNUM
値も変更される可能性があります。
たとえば、別の索引が使用された場合、次の問合せは、以前に実行した問合せとは異なる従業員を戻す可能性があります。
SELECT * FROM employees WHERE ROWNUM < 10 ORDER BY last_name;
比較条件「ROWNUM
値>正の整数」は、常に偽となるため注意してください。たとえば、次の問合せでは行が戻されません。
SELECT * FROM employees WHERE ROWNUM > 1;
ROWNUM
を使用して一意の値を表の各行に割り当てます。たとえば:
UPDATE my_table SET column1 = ROWNUM;
問合せにFIRST
NumRows
またはROWS
m
TO
n
が含まれている場合は、戻される行の数を制限するためにROWNUM
を使用しないでください。たとえば、次の問合せでは、エラー・メッセージが戻されます。
SELECT FIRST 2 * FROM employees WHERE ROWNUM <1 ORDER BY employee_id; 2974: Using rownum to restrict number of rows returned cannot be combined with first N or rows M to N
TimesTen Scaleoutの疑似列
疑似列は、表の実際の列ではありませんが、列と同じように動作します。疑似列は、列と同じコンテキストで使用される割当て値ですが、保存されません。
疑似列には選択操作を実行できますが、挿入操作や更新操作は実行できません。
TimesTen Scaleoutの疑似列は次のとおりです。
-
elementId#
: データベースの一部を格納する要素。elementId#
疑似列を使用して、行へのアクセス元の要素を判別します。この疑似列は、NOT
NULL
TT_INTEGER
データ型を戻します。 -
replicaSetId#
: この疑似列を使用して、行が格納されているレプリカ・セットを判別します。この疑似列は、NOT
NULL
TT_INTEGER
データ型を戻します。 -
dataspaceId#
: この疑似列を使用して、行のコピーが配置されているデータ領域を判別します。この疑似列は、NOT
NULL
TT_INTEGER
データ型を戻します。
ノート:
-
DML操作の場合、
elementId#
のかわりにreplicaSetId#
を使用します。これは、SELECT...FOR UPDATE
についても同様です。 -
SELECT
操作の場合は、特定の要素から行を選択する場合を除いて、replicaSetId#
を使用します。この場合、SELECT
文でTT_GridQueryExec (GLOBAL)
オプティマイザ・ヒントを使用します。詳細は、「TT_GridQueryExecオプティマイザ・ヒント」を参照してください。
次の各セクションでは、疑似列の使用方法について説明します。
疑似列を使用したデータの検索
この例では、疑似列を使用してデータを検索する方法を示します。まず、アプリケーションに接続する要素を判別します。次に、customers
表に対する問合せが発行され、データが配置されているelementId#
、replicaSetId#
およびdataspaceId#
が戻されます。
Command> SELECT elementid# FROM dual; < 1 > 1 row found. Command> SELECT elementId#,replicasetid#,dataspaceId#,cust_id,last_name,first_name FROM customers WHERE cust_id BETWEEN 910 AND 920 ORDER BY cust_id, last_name, first_name; < 3, 2, 1, 910, Riley, Tessa > < 1, 1, 1, 911, Riley, Rashad > < 1, 1, 1, 912, Riley, Emma > < 1, 1, 1, 913, Rivera, Erin > < 1, 1, 1, 914, Roberts, Ava > < 1, 1, 1, 915, Roberts, Lee > < 3, 2, 1, 916, Roberts, Clint > < 5, 3, 1, 917, Robertson, Faith > < 3, 2, 1, 918, Robinson, Miguel > < 3, 2, 1, 919, Robinson, Mozell > < 5, 3, 1, 920, Rodgers, Darryl > 11 rows found.
疑似列および重複表の使用
この例では、重複表で疑似列を使用する方法を示します。まず、account_status
表に対してttIsql
describe
コマンドを使用して、表が複製分散スキームであるかどうかを確認します。次に、要素1に接続されている接続から問合せを発行します。elementId#
、replicasetId#
およびdataspaceId#
が戻され、データの場所を判別できます。この例では、要素2に接続されている接続から同じ問合せを繰り返します。この例は、データがアプリケーションの接続先の要素に配置され、データベースのすべての要素に存在することを示しています(複製分散スキーム)。
Command> describe account_status; Table SAMPLEUSER.ACCOUNT_STATUS: Columns: *STATUS NUMBER (2) NOT NULL DESCRIPTION VARCHAR2 (100) INLINE NOT NULL DUPLICATE 1 table found. (primary key columns are indicated with *) Command> SELECT elementId# FROM dual; < 1 > 1 row found. Command> SELECT elementId#,replicaSetId#,dataspaceId#, * FROM account_status; < 1, 1, 1, 10, Active - Account is in good standing > < 1, 1, 1, 20, Pending - Payment is being processed > < 1, 1, 1, 30, Grace - Automatic payment did not process successfully > < 1, 1, 1, 40, Suspend - Account is in process of being disconnected > < 1, 1, 1, 50, Disconnected - You can no longer make calls or receive calls > 5 rows found.
接続から要素2に同じ問合せを発行します。
Command> SELECT elementid# from dual; < 2 > 1 row found. Command> SELECT elementId#,replicaSetId#,dataspaceId#, * FROM account_status; < 2, 1, 2, 10, Active - Account is in good standing > < 2, 1, 2, 20, Pending - Payment is being processed > < 2, 1, 2, 30, Grace - Automatic payment did not process successfully > < 2, 1, 2, 40, Suspend - Account is in process of being disconnected > < 2, 1, 2, 50, Disconnected - You can no longer make calls or receive calls > 5 rows found.
疑似列を使用したローカル要素の検索
この例では、アプリケーションに接続する要素の情報を返すために疑似列を使用する方法を示します。6つのデータ・インスタンスを含み、K-safetyを2に設定したグリッドを作成したと仮定します。この例の目的は、アプリケーションの接続先の要素の要素ID、レプリカ・セットおよびデータ領域グループを特定する方法を示すことです。
この例では、接続の接続先は要素1です。dual
表から選択すると、現在のローカル接続の要素ID、レプリカ・セットIDおよびデータ領域IDが戻されます。この例では、要素1はレプリカ・セット1およびデータ領域1にあります。
Command> SELECT elementId#,replicaSetId#,dataspaceId# FROM dual; < 1, 1, 1 > 1 row found.
この例では、接続の接続先は要素3です。要素3はレプリカ・セット2およびデータ領域1にあります。
Command> SELECT elementId#,replicaSetId#,dataspaceId# FROM dual; < 3, 2, 1 > 1 row found.
インスタンスに関連付けられた要素IDの表示
この例は、ttGridAdmin
dbStatus
-element
コマンドを使用して、各インスタンスに関連付けられた要素IDを表示する方法を示しています。このコマンドによって、各要素のステータスも示されます。(このコマンドは、アクティブな管理インスタンスから、インスタンス管理者として発行する必要があります)。
詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のデータベースのステータスのモニター(dbStatus)に関する項を参照してください。
$ ttGridAdmin dbStatus -element Database database1 element level status as of Thu Apr 5 12:57:44 PDT 2018 Host Instance Elem Status Date/Time of Event Message --------------- -------- ---- ------ ------------------- ------- host1 instance1 1 opened 2018-04-05 11:15:33 host2 instance2 2 opened 2018-04-05 11:15:33 host3 instance3 3 opened 2018-04-05 11:15:33 host4 instance4 4 opened 2018-04-05 11:15:33 host5 instance5 5 opened 2018-04-05 11:15:33 host6 instance6 6 opened 2018-04-05 11:15:33