6 SQL文

この章では、TimesTenで使用可能なSQL文について説明します。

通常、SQL文とはデータ操作言語(DML)文またはデータ定義言語(DDL)文のいずれかです。

DML文はデータベース・オブジェクトを変更します。DML文の例として、INSERTUPDATEおよびDELETEがあげられます。SELECT文は、1つ以上の表またはビューからデータを取得します。

DDL文はデータベース・スキーマを変更します。DDL文の例として、CREATE TABLEおよびDROP TABLEがあげられます。

この章には、すべての文のアルファベット順のリストに加えて、次の項が含まれています。

TimesTenでサポートされているSQL文の概要

表6-1に、TimesTenでのSQL文の概要を示します。2列目は、文がTimesTen Scaleoutでサポートされているかどうかを示します。ALTER SEQUENCEを除くすべての文は、TimesTen Classicでサポートされています。

表6-1 TimesTenでサポートされているSQL文

SQL文 TimesTen Scaleoutでのサポート

ALTER ACTIVE STANDBY PAIR

いいえ

ALTER CACHE GROUP

はい

ALTER FUNCTION

いいえ

ALTER PACKAGE

いいえ

ALTER PROFILE

はい

ALTER PROCEDURE

いいえ

ALTER REPLICATION

いいえ

ALTER SEQUENCE

はい

TimesTen Classicではサポートされていません。

ALTER SESSION

はい

ALTER TABLE

はい

サポートされていない句:

エージングおよび列ベースの圧縮

サポートされていないデータ型:

LOB列は表ではサポートされません。LOB変数はPL/SQLプログラムでサポートされます。

ALTER USER

はい

CALL

はい

COMMIT

はい

CREATE ACTIVE STANDBY PAIR

いいえ

CREATE CACHE GROUP

はい(増分自動リフレッシュを使用する静的読取り専用)

CREATE FUNCTION

はい

CREATE INDEX

はい

CREATE MATERIALIZED VIEW

はい(制限付き)

CREATE PACKAGE

はい

CREATE PACKAGE BODY

はい

CREATE PROCEDURE

はい

CREATE PROFILE

はい

CREATE REPLICATION

いいえ

CREATE SEQUENCE

TimesTen Scaleoutの特定のBATCH句ではあり。

CREATE SYNONYM

はい

CREATE TABLE

あり(CREATE TABLE... AS SELECTなど)

サポートされていない句:

エージングおよび列ベースの圧縮

サポートされていないデータ型:

LOBおよびROWID

分散句はグローバル一時表でサポートされていません。

CREATE USER

はい

CREATE VIEW

はい

DELETE

はい

DROPACTIVE STANDBY PAIR

いいえ

DROP CACHE GROUP

はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ)

DROP FUNCTION

はい

DROP INDEX

はい

DROP MATERIALIZED VIEW

はい

DROP PACKAGE [BODY]

はい

DROP PROCEDURE

はい

DROP PROFILE

はい

DROP REPLICATION

いいえ

DROP SEQUENCE

はい

DROP SYNONYM

はい

DROP TABLE

はい

DROP USER

はい

DROP VIEW

はい

FLUSH CACHE GROUP

いいえ

GRANT

はい

INSERT

はい

INSERT...SELECT

はい

LOAD CACHE GROUP

はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ)

MERGE

いいえ

REFRESH CACHE GROUP

はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ)

REVOKE

はい

ROLLBACK

はい

SELECT

はい

TRUNCATE TABLE

あり。ただし、TRUNCATE TABLEは、切り捨てられる表に依存するすべてのコマンドを無効にするDDL文に似ています。表内のすべての行を削除するには、DELETE文ではなくTRUNCATE文を使用することをお薦めします。

UNLOAD CACHE GROUP

はい(増分自動リフレッシュを使用する静的読取り専用キャッシュ・グループ)

UPDATE

はい

SQL文内のコメント

文内のキーワード、パラメータまたは句読点の間に、コメントを表示できます。次の2通りの方法で、文内にコメントを含めることができます。

  • スラッシュとアスタリスク(/*)を使用してコメントを開始します。この後にコメントのテキストを続けます。テキストは複数行にまたがってもかまいません。アスタリスクとスラッシュ(*/)を使用してコメントを終了します。開始文字と終了文字は、空白や改行によってテキストから切り離す必要はありません。

  • ハイフン2個(--)を使用してコメントを開始します。この後にコメントのテキストを続けます。テキストは1行しか使用できません。コメントの最後に改行を使用します。

オプティマイザ・ヒント

オプティマイザ・ヒントは、TimesTenの問合せオプティマイザに渡される命令です。問合せに対して最適な実行計画を選択するとき、オプティマイザではこれらのヒントが考慮されます。ほとんどのヒントは、TimesTen ScaleoutでもTimesTen Classicでもサポートされています。TimesTen Scaleoutでのみサポートされているヒントもあります。詳細は、「TimesTen Scaleoutでのみサポートされているオプティマイザ・ヒント」を参照してください。

TimesTenでは、次の3つのレベルのオプティマイザ・ヒントをサポートしています。

オプティマイザ・ヒントの優先順位は、文レベルのヒント、トランザクション・レベルのヒント、および接続レベルのヒントとなります。表6-2に、文、トランザクションおよび接続レベルのオプティマイザ・ヒントの概要を示します。

表6-2 文、トランザクションおよび接続レベルのオプティマイザ・ヒントの概要

文レベルのオプティマイザ・ヒント トランザクション・レベルのオプティマイザ・ヒント 接続レベルのオプティマイザ・ヒント

ヒントは、コメント構文内およびSQL文のSQL VERBの後に指定します。

ヒントは、ttOptSetFlagまたはttOptSetOrder、あるいはttOptUseIndex組込みプロシージャをコールして指定します。

ヒントは、OptimizerHint一般接続属性で指定します。

ヒントはSQL文を範囲とします。

ヒントはトランザクションを範囲とします。

ヒントは接続を範囲とします。

autocommit設定は無効になります。ヒントが含まれる文の実行後は、それ以降の文および問合せではそのヒントは無効になります。

autocommit設定は有効になります。autocommitをオフに設定する必要があります。こうすると、ヒントがトランザクションの期間中、(コミットまたはロールバックを発行するまで)有効になります。autocommitをオフに設定しない場合、文は独自のトランザクションで実行され、ヒントはその文にのみ影響します。

autocommit設定は無効になります。ヒントは、接続の期間中、有効になります。

オプティマイザは、文に対してのみヒントを考慮します。

オプティマイザは、トランザクションのすべての文に対してヒントを考慮します。

オプティマイザは、接続のすべての文に対してヒントを考慮します。

ヒントは、CREATE TABLE...AS SELECT文でサポートされます。

ヒントはCREATE TABLE...AS SELECT文ではサポートされません。これはDDL文であり、TimesTenが暗黙的にDDL文をコミットします。

ヒントはCREATE TABLE...AS SELECT文ではサポートされません。これはDDL文であり、TimesTenが暗黙的にDDL文をコミットします。

トランザクション・レベルのオプティマイザ・ヒントまたは接続レベルのオプティマイザ・ヒントが指定されたトランザクションで文レベルのオプティマイザ・ヒントを指定すると、そのヒントは、SQL文のトランザクション・レベルのヒントまたは接続レベルのオプティマイザ・ヒントをオーバーライドします。TimesTenによってSQL文が実行された後、次のようになります。

  • 元のトランザクション・レベルのオプティマイザ・ヒントは、トランザクションの期間中も有効なままです

  • 元の接続レベルのオプティマイザ・ヒントは、接続の期間中も有効なままです。

ヒントは、トランザクションの期間中、有効になります。SQL文で文レベルのオプティマイザ・ヒントを指定すると、文レベルのオプティマイザ・ヒントはその文に対して有効となり、オプティマイザはその文にトランザクション・レベルのヒントを使用しません。文の実行後、元のトランザクション・レベルのオプティマイザ・ヒントは、トランザクション中、有効のままです。

このレベルで指定されたヒントは、接続レベルで指定された同じヒントよりも優先されます。

ヒントは、接続の期間中、有効になります。優先順位は、文レベル、トランザクション・レベル、および接続レベルとなります。

特定の文に対してオプティマイザを有効にするには、文レベルのオプティマイザ・ヒントを使用します。オプティマイザに影響を与える文ごとにヒントを指定する必要があります。文に対して複数の変更が生じる場合があります。

トランザクションのすべての文に対してオプティマイザを適用するには、トランザクション・レベルのオプティマイザ・ヒントを使用します。ヒントを文ごとに指定する必要はありません。ヒントは、トランザクション内のすべての文に適用されます。ヒントは、文レベルでヒントを指定することで無効にできます。

接続のすべての文に対してオプティマイザを適用するには、接続レベルのオプティマイザ・ヒントを使用します。ヒントは、トランザクションまたは文レベルでヒントを指定することで無効にできます。

文レベルのオプティマイザ・ヒント

文レベルのオプティマイザ・ヒントは、TimesTen問合せオプティマイザに命令を渡すSQL文のコメントです。問合せに対して最適な実行計画を選択するとき、オプティマイザではこれらのヒントが考慮されます。オプティマイザはSQL文を分析し、SQL実行エンジンで問合せを実行してデータを戻すために使用される問合せ計画を生成します。

文レベルのオプティマイザ・ヒントの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』オプティマイザ・ヒントを使用した実行計画の変更に関する項を参照してください。

SQL構文

SQL文には、文レベルのオプティマイザ・ヒントが1つ以上あるコメントを1つ付けることができます。
次のオプティマイザ・ヒントは、TimesTen Cacheのみでサポートされています。
  • TT_DynamicLoadMultiplePKs
  • TT_DynamicLoadRootTbl
  • TT_DynamicPassThrough

いくつかのヒントは、特定のSQL文ではサポートされていません。

  • TT_CommitDMLOnSuccessは、DELETEINSERTおよびUPDATE文でサポートされます。INSERT...SELECT文でも有効で、SELECTキーワードの後に記述する必要があります。このヒントは、TimesTen Scaleoutのみでサポートされています。

  • TT_GridQueryExecヒントとTT_PartialResultヒントは、SELECTINSERT...SELECTおよびCREATE TABLE... AS SELECT SQL文のみでサポートされており、これらのヒントはSELECTキーワードの後に記述する必要があります。これらのヒントは、TimesTen Scaleoutのみでサポートされています。

  • それ以外のヒントはDELETEINSERTMERGESELECTUPDATEINSERT...SELECTおよびCREATE TABLE...AS SELECT SQL文でサポートされており、これらのヒントは、DELETEINSERTMERGESELECTまたはUPDATEキーワードの後に記述する必要があります。

表6-3に、SQL文でのヒントの正しい配置を示します。

文レベルのオプティマイザ・ヒントはコメント構文に埋め込みます。TimesTenでは、1行のコメントおよび複数行のコメント内のヒントがサポートされます。ヒントのあるコメントが複数行の場合は、コメント構文/*+...*/を使用します。ヒントのあるコメントが1行の場合は、コメント構文--+を使用します。

構文

SQL VERB {/*+ [CommentText] hint [{hint|CommentText} [...]] */ |
          --+ [CommentText] hint [{hint|CommentText} [...]] }
hint::= ScaleoutHint | CacheHint | JoinOrderHint | IndexHint| FlagHint
ScaleoutHint::= TT_CommitDMLOnSuccess({0|1})|TT_GridQueryExec({LOCAL|GLOBAL})|
                TT_PartialResult(0|1)
CacheHint::= TT_DynamicLoadMultiplePKs ({0|1})|TT_DynamicLoadRootTbl ({0|1})|
             TT_DynamicPassthrough(N) 
JoinOrderHint::= TT_JoinOrder (CorrelationName CorrelationName [...])
IndexHint::= TT_Index (CorrelationName,IndexName,{0|1} [;...])
FlagHint::= FlagName (0|1)
FlagName::= TT_BranchAndBound|TT_CountAsInt|TT_DynamicLoadEnable|
            TT_DynamicLoadErrorMode| TT_FirstRow|TT_ForceCompile|
            TT_GenPlan|TT_HashGb|TT_HashScan|TT_IndexedOr|TT_MergeJoin|
            TT_NestedLoop|TT_NoRemRowIdOpt|TT_Range|TT_Rowid|TT_RowLock|
            TT_ShowJoinOrder|TT_TblLock|TT_TblScan|TT_TmpHash|TT_TmpRange|
            TT_TmpTable|TT_UseBoyerMooreStringSearch|

パラメータ

パラメータ 説明

SQL VERB

SQL VERBDELETEINSERTMERGESELECTUPDATEキーワードのいずれかを指します。文レベルのオプティマイザ・ヒントをコメント構文に埋め込みます。コメント構文に文レベルのオプティマイザ・ヒントがある場合は、コメント構文はSQL VERBの後に記述する必要があります。

TT_GridQueryExecヒントとTT_PartialResultヒントは、SELECTキーワードのみで有効です。

/*+ hint */

1つ以上のヒントがコメント構文に埋め込まれています。コメント構文は1行または複数行になります。プラス記号(+)は、文レベルのオプティマイザ・ヒントの開始を意味します。

アスタリスク(*)とプラス記号(+)の間にスペースは入れません。

--+ hint

1つ以上のヒントがコメント構文に埋め込まれています。コメント構文は1行のみになります。プラス記号(+)は、文レベルのオプティマイザ・ヒントの開始を意味します。

ダッシュ(-)とプラス記号(+)の間にスペースは入れません。

hint

文レベルのオプティマイザ・ヒント。SQL文では、1つのコメント文字列として、1行以上の文レベルのオプティマイザ・ヒントがサポートされます。1つのSQL文に対して1つ以上のヒントが含まれるコメントを1つ指定できます。コメントはDELETEINSERTMERGESELECTまたはUPDATEキーワード(またはTT_GridQueryExecおよびTT_PartialResultの場合はSELECTキーワード)の後に記述する必要があります。TT_CommitDMLOnSuccessは、DELETEINSERTまたはUPDATEキーワードの後に記述する必要があります。INSERT...SELECT文では、SELECTキーワードの後に記述する必要があります。

コメント内に複数のヒントを指定する場合は、ヒント間にスペースを入れないようにします。

文レベルのオプティマイザ・ヒントは、1つのSQL文を範囲とし、問合せごとにセマンティクスを持ちます。

TT_GridQueryExecTT_PartialResultまたはTT_CommitDMLOnSuccess以外のヒント:

  • 文レベルのオプティマイザ・ヒントの名前と型は、トランザクション・レベルのオプティマイザ・ヒントにマップされます。トランザクション・レベルのオプティマイザ・ヒントは、組込みプロシージャttOptSetFlagttOptSetOrder、またはttOptUseIndexにより呼び出されます。

  • トランザクション・レベルのヒントは、そのトランザクションを範囲とし、トランザクション・セマンティクスを持ちます。自動コミットは0に設定する必要があります。トランザクション・レベルのオプティマイザ・ヒントは、トランザクションの間有効です。

  • 詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttOptSetFlagttOptSetOrderまたはttOptUseIndexに関する項を参照してください。

CommentText

コメント文字列内のテキスト。文レベルのオプティマイザ・ヒントとコメント・テキストの両方を1つのコメント内で使用できます。ヒントとコメント・テキスト間にスペースを入れるようにしてください。

ScaleoutHint

ScaleoutHintは、TT_CommitDMLOnSuccess文レベルのヒントと、TT_GridQueryExecおよびTT_PartialResult文レベルのオプティマイザ・ヒントを指します。これらのヒントは、TimesTen Scaleoutのみでサポートされています。

  • 詳細は、「TT_CommitDMLOnSuccessオプティマイザ・ヒント」を参照してください。

  • TT_GridQueryExec (LOCAL|GLOBAL)は、ローカル要素(LOCALの場合)またはすべての要素(GLOBALの場合)に対する問合せ結果を返します。K-safetyが2に設定され、GLOBALが指定されている場合、結果にはレプリカ・セット内のすべての要素のデータが含まれます。

    LOCAL: 問合せはローカル要素のみで実行されます。ローカル要素がデータの完全コピーを持っていない場合、TimesTen Scaleoutは結果の一部を返します。

    GLOBAL: TimesTen Scaleoutは、すべてのレプリカ・セットのすべての表の行のコピーを含むすべての要素からデータを取得し、結果を生成します。このため、K-safetyが2に設定されている場合、または表で複製分散スキームが使用されている場合、重複したデータが返されます。

    デフォルトはローカルでもグローバルでもありません。このヒントを指定しない場合、問合せは1つの論理データ領域で実行されます。データの1つの完全コピーを使用して、問合せを計算します。

  • データを使用できない場合、TT_PartialResult (0|1)はエラー(0の場合)または結果の一部(1)を返します。

    0: レプリカ・セット内のすべての要素を使用できず、必要なデータを使用できない場合はエラーが返されます。各レプリカ・セットの少なくとも1つの要素が使用可能であるか、問合せに必要なデータが使用可能な場合、オプティマイザは問合せ結果を正常に返し、エラーは発生しません。これがデフォルトです。

    1: レプリカ・セット内のすべての要素を使用できない場合、結果の一部が返されます。

SELECT /*+TT_GridQueryExec(LOCAL)*/   
        COUNT(*), elementId# FROM t
        GROUP BY elementId#;
SELECT /*+TT_GridQueryExec(GLOBAL)*/   
        COUNT(*), elementId# FROM t 
        GROUP BY elementId#;
SELECT /*+TT_PartialResult(0)*/ COUNT  
       (*), elementId# FROM t GROUP BY
       elementId#;
SELECT /*+TT_PartialResult(1)*/ COUNT  
      (*), elementId# FROM t GROUP BY
      elementId#;
CacheHint CacheHintは、TimesTen Cacheでサポートされているオプティマイザ・ヒントを表します。これに該当するヒントは、TT_DynamicLoadMultiplePKsTT_DynamicLoadRootTblおよびTT_DynamicPassthroughです。これらのヒントについては、この表で後述します(アルファベット順)。

JoinOrderHint::= TT_JoinOrder ( CorrelationName CorrelationName [...] )

JoinOrderHintは、文レベルのオプティマイザ・ヒントTT_JoinOrderの構文を指します。TT_JoinOrderヒントの指示により、オプティマイザは指定の順序で表を結合します。この結合順序は文でのみ有効です。

TT_JoinOrderおよび複数の相関名を指定します。相関名はカッコで囲みます。

CorrelationNameは、SQL文の問合せまたは副問合せで指定した表の別名を指します。このヒントを使用する際は、表の実際の名前ではなく相関名を使用してください。

たとえば、employees表とdepartments表を結合し、employees表の相関名にempsdepartments表の相関名にdeptsを指定した後、ttIsqlTT_JoinOrderヒントを指定するには、次のように実行します。

Command> SELECT /*+ TT_JoinOrder
           (EMPS DEPTS)*/...

TT_JoinOrderヒントに構文エラーがある場合、TimesTenではそのヒントは無視されます。TT_JoinOrderヒントに閉じカッコがない場合、残りのコメント文字列は無視されます。つまり、TT_JoinOrderヒントの後に追加の文レベルのオプティマイザ・ヒントを指定し、TT_JoinOrderヒントに閉じカッコがない場合、追加の文レベルのオプティマイザ・ヒントは無視されます。

組込みプロシージャttOptSetOrderを実行すると、トランザクション中の結合順序を指定できます。文レベルのオプティマイザ・ヒントTT_JoinOrderは、その文のみに有効です。

ttOptSetOrderの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttOptSetOrderに関する項を参照してください。

IndexHint::= TT_INDEX (CorrelationName IndexName {0|1} [;...] )

IndexHintは、文レベルのオプティマイザ・ヒントTT_INDEXの構文を指します。オプティマイザに表の索引を使用するかを指示するには、TT_INDEXヒントを使用します。索引ヒントは文のみで有効です。

CorrelationNameは、SQL文の問合せまたは副問合せで指定した表の別名を指します。表の実際の名前ではなく、相関名を使用してください。相関名を省略すると、この設定は、指定した索引名を持つすべての表に影響します。

IndexNameは、オプティマイザが表で考慮する索引を指します。索引名を省略すると、指定した相関関係のすべての索引に設定が適用されます。

オプティマイザで索引を考慮しないようにするには、0を指定します。オプティマイザで索引を考慮するようにするには、1を指定します。

たとえば、employees表の問合せにemp_name_ix索引を使用するようにオプティマイザに指示し、employees表に相関名eを指定した後、ttIsqlTT_INDEXヒントを指定するには、次のように実行します。

Command> SELECT /*+ TT_INDEX
          (E,EMP_NAME_IX,1) */ ...

TT_INDEXヒントに複数のCorrelationName, IndexName, {0|1}を指定する場合は、セミコロン(;)を使用します。CorrelationNameIndexNameの各パラメータに、0または1を指定する必要があります。

TT_Indexヒントに構文エラーがある場合、TimesTenではそのヒントは無視されます。TT_Indexヒントに閉じカッコがない場合、残りのコメント文字列は無視されます。つまり、TT_Indexヒントの後に追加の文レベルのオプティマイザ・ヒントを指定し、TT_Indexヒントに閉じカッコがない場合、追加の文レベルのオプティマイザ・ヒントは無視されます。

組込みプロシージャttOptUseIndexを実行し、トランザクション中の索引ヒントを指定できます。文レベルのオプティマイザ・ヒントTT_INDEXは、その文のみに有効です。

ttOptUseIndexの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttOptUseIndexに関する項を参照してください。

FlagHint

FlagHintは、TimesTen問合せオプティマイザの実行計画への影響を有効または無効にする文レベルのオプティマイザ・フラグを指します。これらのフラグは、組込みプロシージャttOptSetFlagで使用されるフラグにマップされます。

文レベルのオプティマイザ・ヒント・フラグは文のみで有効で、トランザクション・レベルのオプティマイザ・ヒント・フラグはトランザクション中に有効です。

TT_BranchAndBound

組込みプロシージャttOptSetFlagBranchAndBoundフラグにマップされたフラグ。

TT_CountAsInt

このヒントは、COUNT関数(問合せで使用)の戻りデータ型を制御します。1を指定すると、戻りデータ型はTT_INTEGERになります。0を指定すると、戻りデータ型はTT_BIGINTになります。このヒントを指定しない場合、デフォルトの戻りデータ型はTT_BIGINTになります。このヒントは、文および接続レベルでサポートされます。COUNT関数の詳細は、「COUNT」を参照してください。

このヒントは、下位互換性を確保するためのものです。1の値でヒントを指定すると、予期しない整数オーバーフローが発生する可能性があります。新しいアプリケーションには、このヒントを指定しないでください。これにより、TimesTenは、COUNT関数にデフォルトの戻りデータ型TT_BIGINTを使用するようになります。

この例では、ヒントに1の値を指定しています。戻りデータ型は、TT_INTEGERになります。

Command> describe SELECT /*+TT_CountAsInt(1)*/ COUNT (*) FROM dual;

Prepared Statement:
  Columns:
    EXP                             TT_INTEGER NOT NULL

この例では、ヒントに0の値を指定しています。戻りデータ型は、TT_BIGINTになります。

Command> describe SELECT /*+TT_CountAsInt(0)*/ COUNT (*) FROM dual;

Prepared Statement:
  Columns:
    EXP                             TT_BIGINT NOT NULL

この例では、オプティマイザ・ヒントを設定していません。デフォルトの戻り型は、TT_BIGINTです。

describe SELECT COUNT (*) FROM dual;

Prepared Statement:
  Columns:
    EXP                             TT_BIGINT NOT NULL

TT_DynamicLoadEnable

組込みプロシージャttOptSetFlagDynamicLoadEnableフラグにマップされたフラグ。

TT_DynamicLoadErrorMode

組込みプロシージャttOptSetFlagDynamicLoadErrorModeフラグにマップされたフラグ。

TT_DynamicLoadMultiplePKs{ 0|1} TimesTen ClassicでサポートされているTimesTen Cacheオプティマイザ・ヒント。このヒントでは、単一表キャッシュ・グループに複数のキャッシュ・インスタンスを動的にロードする機能を有効化(1に設定)または無効化(0に設定)します。動的ロードの操作は、WHERE句が含まれている修飾されたSELECT文でトリガーする必要があります。この文では、WHERE句でキャッシュ・グループのルート表の複数の主キー値を参照しています。デフォルトは1です。TT_DynamicLoadMultiplePKsTT_DynamicLoadRootTblの両方のヒントが指定されている場合は、TT_DynamicLoadMultiplePKsが優先されます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』複数のキャッシュ・インスタンスの複数の主キーを使用した動的なロード操作に関する項を参照してください。
TT_DynamicLoadRootTbl TimesTen ClassicでサポートされているTimesTen Cacheオプティマイザ・ヒント。このヒントでは、単一表キャッシュ・グループに複数のキャッシュ・インスタンスを動的にロードする機能を有効化(1に設定)または無効化(0に設定)します。動的ロードの操作は、WHERE句が含まれている修飾されたSELECT文でトリガーする必要があります。この文では、WHERE句がキャッシュ・グループのルート表の複数の主キー値を参照しません。デフォルトは0です。TT_DynamicLoadMultiplePKsTT_DynamicLoadRootTblの両方のヒントが指定されている場合は、TT_DynamicLoadMultiplePKsが優先されます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』複数のキャッシュ・インスタンスの複数の主キーを使用しない動的なロード操作に関する項を参照してください。
TT_DynamicPassThrough(N) TimesTen ClassicでサポートされているTimesTen Cacheオプティマイザ・ヒント。指定すると、このヒントによってTimesTenのキャッシュ・インスタンスに動的にロードできる行数が制限されます。具体的には、修飾されたSELECT文によってトリガーされる動的ロード操作によって、指定されたN行の制限を超える行数が生成される場合、キャッシュ・インスタンスはロードされず、問合せはOracleデータベースに渡されます。動的ロードは、修飾されたSELECT文によってトリガーする必要があります。また、キャッシュ・グループにはWHERE句を指定しないでください。ヒントはSELECT以外の文では無視されます。このヒントは、動的にロードする最大行数に設定します。このヒントの値を0以下に設定した場合や、ヒントを指定しない場合は、動的ロードの行制限がなくなります。この場合、キャッシュ・インスタンスにロードできる行数に制限はありません。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』Oracleデータベースへの動的ロードの自動パススルーに関する項を参照してください。

TT_FirstRow

組込みプロシージャttOptSetFlagFirstRowフラグにマップされたフラグ。

TT_ForceCompile

組込みプロシージャttOptSetFlagForceCompileフラグにマップされたフラグ。

TT_GenPlan

組込みプロシージャttOptSetFlagGenPlanフラグにマップされたフラグ。

TT_HashGb

組込みプロシージャttOptSetFlagHashGbフラグにマップされたフラグ。

TT_HashScan

組込みプロシージャttOptSetFlagHashフラグにマップされたフラグ。

TT_IndexedOr

組込みプロシージャttOptSetFlagIndexedOrフラグにマップされたフラグ。

TT_MergeJoin

組込みプロシージャttOptSetFlagMergeJoinフラグにマップされたフラグ。

TT_NestedLoop

組込みプロシージャttOptSetFlagNestedLoopフラグにマップされたフラグ。

TT_NoRemRowIdOpt

組込みプロシージャttOptSetFlagNoRemRowIdOptフラグにマップされたフラグ。

TT_Range

組込みプロシージャttOptSetFlagRangeフラグにマップされたフラグ。

TT_Rowid

組込みプロシージャttOptSetFlagRowidフラグにマップされたフラグ。

TT_RowLock

組込みプロシージャttOptSetFlagRowlockフラグにマップされたフラグ。

TT_ShowJoinOrder

組込みプロシージャttOptSetFlagShowJoinOrderフラグにマップされたフラグ。

TT_TblLock

組込みプロシージャttOptSetFlagTblLockフラグにマップされたフラグ。

TT_TblScan

組込みプロシージャttOptSetFlagScanフラグにマップされたフラグ。

TT_TmpHash

組込みプロシージャttOptSetFlagTmpHashフラグにマップされたフラグ。

TT_TmpRange

組込みプロシージャttOptSetFlagTmpRangeフラグにマップされたフラグ。

TT_TmpTable

組込みプロシージャttOptSetFlagTmpTableフラグにマップされたフラグ。

TT_UseBoyerMooreStringSearch

組込みプロシージャttOptSetFlagUseBoyerMooreStringSearchフラグにマップされたフラグ。

ノート:

前の表に示したフラグの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttOptSetFlagに関する項を参照してください

説明

  • コメント構文に文レベルのオプティマイザ・ヒントを埋め込みます。/*またはでコメントを開始します。コメント構文を開始した後、プラス記号(+)を追加します。プラス記号(+)により、TimesTenではコメントがヒントのリストとして解釈されます。プラス記号(+)はコメント・デリミタの直後に記述する必要があります。(たとえば、/* または--の後)。コメント・デリミタとプラス記号(+)の間にはスペースを入れません。

    次の例では、アスタリスク(*)とプラス記号(+)の間にスペースがあるため、ヒントは無視されます。

    Command> SELECT /* + TT_TblScan (1) This hint is ignored because there is a
              space between the star (*) and the plus (+) sign. */ ...
    
  • hintは、TimesTenでサポートされる文レベルのオプティマイザ・ヒントの1つです。プラス記号(+)とヒントの間にスペースを入れることができます。コメントに複数のヒントがある場合は、1つ以上のスペースでヒントを区切ります。たとえば、1行で2つのヒントを指定するには、次のように実行します。

    Command> SELECT --+ TT_MergeJoin (0) TT_NestedLoop (1) 
              ...
    
  • コメント内のヒントにコメント・テキストを組み入れることができます。たとえば、

    Command> SELECT /*+ TT_HashScan (1) This demonstrates a hint followed by a
               comment string. */ ...
    
  • TimesTenでは、次の場合にコメントが無視され、エラーは戻されません。

    • ヒントがDELETEINSERTMERGESELECTまたはUPDATEキーワード(またはTT_GridQueryExecまたはTT_PartialResultの場合はSELECTキーワード)の後に記述されていない場合。TT_CommitDMLOnSuccessは、DELETEINSERTUPDATEキーワードの後に記述する必要があります。INSERT...SELECTでは、SELECTキーワードの後に記述する必要があります。

    • ヒントにスペルミスや構文エラーがある場合。同じコメント内に複数のヒントがあり、構文的に正しいヒントと構文的に正しくないヒントがある場合、TimesTenでは、不正なヒントは無視され、正しいヒントが採用されます。

    • TT_JoinOrderヒントかTT_Indexヒントのいずれかを使用し、閉じカッコがないと、残りのヒント文字列は無視されます。

  • 互いに競合するヒントがある場合、コメントの右端のヒントが使用されます。たとえば、コメント文字列が/*+TT_TblScan (0)...TT_TblScan (1) */の場合は、右端のTT_TblScan(1)が使用されます。

  • 文レベルのオプティマイザ・ヒントは、競合するトランザクション・レベルのオプティマイザ・ヒントをオーバーライドします。文レベルのオプティマイザ・ヒントと競合するトランザクション・レベルのオプティマイザ・ヒントを指定すると、文レベルのオプティマイザ・ヒントは、競合するトランザクション・レベルのオプティマイザ・ヒントをオーバーライドします。たとえば、ttOptSetFlagを呼び出し、範囲フラグを有効にし、SQL問合せを発行して文レベルのオプティマイザ・フラグTT_Rangeを無効にすると、この問合せの範囲フラグが無効になります。問合せを実行した後、問合せ実行前にトランザクションに配置された元の範囲フラグ設定は、トランザクション実行中は有効のままです。詳細は、「SELECT問合せでの文レベルのオプティマイザ・ヒントの使用」を参照してください。TT_GridQueryExecTT_PartialResultTT_CommitDMLOnSuccessおよびTT_CountAsIntのヒントは、トランザクション・レベルではサポートされていません。

  • 副問合せでは文レベルのオプティマイザ・ヒントを使用しないでください。

  • TimesTen問合せオプティマイザは、パススルー文の文レベルのオプティマイザ・ヒントを認識しません。TimesTenでは、パススルー文のSQLテキストはOracle Databaseに渡され、Oracle DatabaseのSQL規則に従って処理されます。パススルー文は、TimesTen Scaleoutではサポートされていません。

文レベルのオプティマイザ・ヒントをサポートするSQL文

SQL文で文レベル・オプティマイザ・ヒントを指定できます。すべてのヒントがすべての文でサポートされているわけではありません。ヒントはコメント構文内に指定し、コメント構文はSQL VERBの直後に記述します。(たとえば、SELECT /*+ hint */...)。表6-3に、文レベルのヒントの正しい配置を示します。ヒントがその文でサポートされていないかどうかも示します。

表6-3 SQL文への文レベルのヒントの配置

SQL文 ヒントの配置

CREATE TABLE... AS SELECT

CREATE TABLE...AS SELECT [hint]...

CREATE TABLE...AS SELECT文ではトランザクション・レベルのヒントを使用しないでください。

TT_CommitDMLOnSuccessは、この文でサポートされていません。

DELETE

DELETE [hint]...

TT_GridQueryExecヒントとTT_PartialResultヒントは、この文でサポートされていません。

INSERT

INSERT [hint]...

TT_GridQueryExecヒントとTT_PartialResultヒントは、この文でサポートされていません。

INSERT...SELECT

INSERT...SELECT [hint]...

MERGE

MERGE [hint]...

TT_GridQueryExecヒントとTT_PartialResultヒントは、サポートされていません。

SELECT

SELECT [hint]...

副問合せではヒントを指定しないでください。

TT_CommitDMLOnSuccessヒントは、この文でサポートされていません。

SELECT...{UNION|MINUS| INTERSECT} SELECT...

SELECT [hint] {UNION|MINUS|INTERSECT} SELECT...

TT_CommitDMLOnSuccessヒントは、この文でサポートされていません。

UPDATE

UPDATE [hint]...

TT_GridQueryExecヒントとTT_PartialResultヒントは、この文でサポートされていません。

ヒントの理解

ヒントを使用することで、問合せの実行計画の選択決定においてTimesTen問合せオプティマイザに作用することができます。

TT_GridQueryExecTT_PartialResultおよびTT_CommitDMLOnSuccessは、接続レベルと文レベルでのみサポートされています。この項は、これらのヒントに対して有効ではありません。

トランザクション・レベルのオプティマイザ・ヒントを表示するには、組込みプロシージャttOptSetFlagを実行します。組込みプロシージャのttOptGetFlagの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttOptGetFlagに関する項を参照してください。

TT_CommitDMLOnSuccessの例は、「TT_CommitDMLOnSuccessオプティマイザ・ヒント」を参照してください。

TT_GridQueryExecおよびTT_PartialResultの例:

次の例は、文レベルのオプティマイザ・ヒントとトランザクション・レベルのオプティマイザ・ヒントの使用方法を説明しています。TimesTenオプティマイザは、コストベースのオプティマイザであり、文の最適な実行計画を判断して生成します。この計画は、リリース間で異なります。実行計画は、参照する表にある索引の他に、列および表の利用可能な統計に基づきます。統計の再計算や索引の変更時は、TimesTenオプティマイザは、再計算された統計および索引変更に基づいて実行計画を変更する場合があります。実行計画は多様なため、これらの例はあくまで実例です。次の例があります。

SELECT問合せでの文レベルのオプティマイザ・ヒントの使用

問合せの実行計画を表示します。次に、文レベルのオプティマイザ・ヒントを使用して、オプティマイザに別の実行計画を選択するように指示します。次の問合せを考慮します。

Command> SELECT r.region_name, c.country_name
         FROM regions r, countries c
         WHERE r.region_id = c.region_id
         ORDER BY c.region_id;

ttIsql EXPLAINコマンドを使用してオプティマイザが生成した計画を表示します。ノート:

  • オプティマイザは、それぞれのスキャンに表レベル・ロッキングを使用して2つの範囲スキャンを実行します。

  • オプティマイザは、MergeJoin処理を使用して2つの表を結合します。

Command> EXPLAIN SELECT r.region_name, c.country_name
         FROM regions r, countries c
         WHERE r.region_id = c.region_id
         ORDER BY c.region_id;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             COUNTRIES
  IXNAME:              COUNTR_REG_FK
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
 
  STEP:                2
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             REGIONS
  IXNAME:              REGIONS
  INDEXED CONDITION:   R.REGION_ID >= C.REGION_ID
  NOT INDEXED:         <NULL>
 
  STEP:                3
  LEVEL:               1
  OPERATION:           MergeJoin
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   C.REGION_ID = R.REGION_ID
  NOT INDEXED:         <NULL>

ここで文レベルのオプティマイザ・ヒントを使用して、低レベル・ロッキングを使用したスキャンの実行、およびNestedLoop処理を使用した表の結合をオプティマイザに指示します。自動コミットをオンに設定すると、文レベルのオプティマイザ・ヒントがSQL文を範囲としているために自動コミット設定が無効になることが分かります。

Command> autocommit on;
Command> EXPLAIN SELECT /*+ TT_RowLock (1), TT_TblLock (0), TT_MergeJoin (0),
         TT_NestedLoop (1) */
         r.region_name, c.country_name
         FROM regions r, countries c
         WHERE r.region_id = c.region_id
         ORDER BY c.region_id;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               3
  OPERATION:           RowLkRangeScan
  TBLNAME:             REGIONS
  IXNAME:              REGIONS
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                2
  LEVEL:               3
  OPERATION:           RowLkRangeScan
  TBLNAME:             COUNTRIES
  IXNAME:              COUNTR_REG_FK
  INDEXED CONDITION:   C.REGION_ID = R.REGION_ID
  NOT INDEXED:         <NULL>
 
  STEP:                3
  LEVEL:               2
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                4
  LEVEL:               1
  OPERATION:           OrderBy
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>

文レベルのオプティマイザ・ヒントなしで問合せを再度準備します。文レベルのオプティマイザ・ヒントがSQL文を範囲とするため、元の実行計画に戻ります。

Command> EXPLAIN SELECT r.region_name, c.country_name
         FROM regions r, countries c
         WHERE r.region_id = c.region_id
         ORDER BY c.region_id;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             COUNTRIES
  IXNAME:              COUNTR_REG_FK
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                2
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             REGIONS
  IXNAME:              REGIONS
  INDEXED CONDITION:   R.REGION_ID >= C.REGION_ID
  NOT INDEXED:         <NULL>
 
  STEP:                3
  LEVEL:               1
  OPERATION:           MergeJoin
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   C.REGION_ID = R.REGION_ID
  NOT INDEXED:         <NULL>

ヒントの有効化および無効化

この例は、類似の関数を実行するヒントを有効または無効にするかを明確にオプティマイザに指示することの重要性を示しています。たとえば、ハッシュ・ヒントおよび範囲ヒントにより、表のハッシュ・アクセス・パスまたは範囲アクセス・パスのいずれかを使用するようにオプティマイザに指示する場合です。特定のアクセス・パスをオプティマイザが確実に選択できるよう、1つのヒントを有効にしてその他すべての関連ヒントを無効にします。

表を作成し、表の1列目にハッシュ索引、2列目に範囲索引を作成します。

Command> CREATE TABLE test (col1 NUMBER, col2 NUMBER);
Command> CREATE HASH INDEX h_index ON test (col1);
Command> CREATE INDEX hr_index ON test (col2);

自動コミットをオフにし、組み込みプロシージャttOptGetFlagを実行して、トランザクションの現在のトランザクション・レベルのオプティマイザ・ヒントを表示します。1に設定すると、フラグは無効です。

Command> autocommit off;
Command> CALL ttOptGetFlag ('Hash');
< Hash, 1 >
1 row found.
Command> CALL ttOptGetFlag ('Scan');
< Scan, 1 >
1 row found.

ttIsq EXPLAINコマンドを使用して、WHERE句と動的パラメータを使用したSELECT問合せの計画を確認します。オプティマイザはハッシュ・スキャンを使用します。

Command> EXPLAIN SELECT * FROM test WHERE col1 = ? and col2 = ?;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkHashScan
  TBLNAME:             TEST
  IXNAME:              H_INDEX
  INDEXED CONDITION:   TEST.COL1 = _QMARK_1
  NOT INDEXED:         TEST.COL2 = _QMARK_2

文レベルのオプティマイザ・ヒントTT_Rangeを使用して、オプティマイザに範囲スキャンの使用を指示します。オプティマイザにハッシュ・スキャンの無効化を指示していないため、オプティマイザはTT_Rangeヒントを無視し、ハッシュ・スキャンを使用します。文を変更し、オプティマイザにハッシュ・スキャンを使用せずに範囲スキャンを使用するように指示します。そのためには、文レベルのオプティマイザ・ヒントTT_Rangeを有効にし、文レベルのオプティマイザ・ヒントTT_HashScanを無効にします。オプティマイザはTT_Rangeヒントを無視しなくなります。

Command> EXPLAIN SELECT --+ TT_Range (1) Single line comment to set TT_Range
         * FROM TEST WHERE col1 = ? and col2 = ?;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkHashScan
  TBLNAME:             TEST
  IXNAME:              H_INDEX
  INDEXED CONDITION:   TEST.COL1 = _QMARK_1
  NOT INDEXED:         TEST.COL2 = _QMARK_2

Command> EXPLAIN SELECT /*+ TT_Range (1) TT_HashScan (0)
          Multiple line comment to enable TT_Range and disable TT_HashScan */
          * FROM TEST WHERE col1 = ? and col2 = ?;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkRangeScan
  TBLNAME:             TEST
  IXNAME:              HR_INDEX
  INDEXED CONDITION:   TEST.COL2 = _QMARK_2
  NOT INDEXED:         TEST.COL1 = _QMARK_1

文レベルのオプティマイザ・ヒントを使用せず、コミットやロールバックを発行せずに、問合せを再度準備します。オプティマイザは、問合せの実行前に有効なトランザクション・レベルのオプティマイザ・ヒントを使用します。文レベルのオプティマイザ・ヒントがSQL文を範囲とするため、オプティマイザはトランザクション・レベルのオプティマイザ・ヒントを使用します。

Command> EXPLAIN SELECT * FROM TEST WHERE col1 = ? and col2 = ?;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkHashScan
  TBLNAME:             TEST
  IXNAME:              H_INDEX
  INDEXED CONDITION:   TEST.COL1 = _QMARK_1
  NOT INDEXED:         TEST.COL2 = _QMARK_2

TT_JoinOrderを使用した結合順序の指定

文レベルのオプティマイザ・ヒントTT_JoinOrderを使用して、オプティマイザに特定の結合順序の使用を指示します。まずトランザクション・レベルのオプティマイザ・ヒントを使用して、トランザクションでの特定の結合順序の使用をオプティマイザに指示します。次に文レベルのオプティマイザ・ヒントを使用して、文のみで結合順序の変更をオプティマイザに指示します。

Command> CALL ttOptSetOrder ('e d j');
Command> EXPLAIN SELECT *
         FROM employees e, departments d, job_history j
         WHERE e.department_id = d.department_id
         AND e.hire_date = j.start_date;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               3
  OPERATION:           TblLkRangeScan
  TBLNAME:             EMPLOYEES
  IXNAME:              EMP_DEPT_FK
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                2
  LEVEL:               3
  OPERATION:           TblLkRangeScan
  TBLNAME:             DEPARTMENTS
  IXNAME:              DEPARTMENTS
  INDEXED CONDITION:   D.DEPARTMENT_ID >= E.DEPARTMENT_ID
  NOT INDEXED:         <NULL>
 
  STEP:                3
  LEVEL:               2
  OPERATION:           MergeJoin
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   E.DEPARTMENT_ID = D.DEPARTMENT_ID
  NOT INDEXED:         <NULL>
 
  STEP:                4
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             JOB_HISTORY
  IXNAME:              JOB_HISTORY
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         E.HIRE_DATE = J.START_DATE
 
  STEP:                5
  LEVEL:               1
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>

トランザクション・レベルの結合順序オプティマイザ・ヒントを、そのSQL文に対してのみオーバーライドするようオプティマイザに指示するには、文レベルのオプティマイザ・ヒントTT_JoinOrderを使用します。

Command> EXPLAIN SELECT --+ TT_JoinOrder (e j d)
          *
          FROM employees e, departments d, job_history j
          WHERE e.department_id = d.department_id
          AND e.hire_date = j.start_date;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               3
  OPERATION:           TblLkRangeScan
  TBLNAME:             EMPLOYEES
  IXNAME:              EMP_DEPT_FK
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                2
  LEVEL:               3
  OPERATION:           TblLkRangeScan
  TBLNAME:             JOB_HISTORY
  IXNAME:              JOB_HISTORY
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         E.HIRE_DATE = J.START_DATE
 
  STEP:                3
  LEVEL:               2
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                4
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             DEPARTMENTS
  IXNAME:              DEPARTMENTS
  INDEXED CONDITION:   D.DEPARTMENT_ID >= E.DEPARTMENT_ID
  NOT INDEXED:         <NULL>
 
  STEP:                5
  LEVEL:               1
  OPERATION:           MergeJoin
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   E.DEPARTMENT_ID = D.DEPARTMENT_ID
  NOT INDEXED:         <NULL>

問合せを再度準備し、トランザクションで有効だった結合順序が有効のままであるかを確認します。

Command> EXPLAIN SELECT *
          FROM employees e, departments d, job_history j
          WHERE e.department_id = d.department_id
          AND e.hire_date = j.start_date;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               3
  OPERATION:           TblLkRangeScan
  TBLNAME:             EMPLOYEES
  IXNAME:              EMP_DEPT_FK
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                2
  LEVEL:               3
  OPERATION:           TblLkRangeScan
  TBLNAME:             DEPARTMENTS
  IXNAME:              DEPARTMENTS
  INDEXED CONDITION:   D.DEPARTMENT_ID >= E.DEPARTMENT_ID
  NOT INDEXED:         <NULL>
 
  STEP:                3
  LEVEL:               2
  OPERATION:           MergeJoin
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   E.DEPARTMENT_ID = D.DEPARTMENT_ID
  NOT INDEXED:         <NULL>
 
  STEP:                4
  LEVEL:               2
  OPERATION:           TblLkRangeScan
  TBLNAME:             JOB_HISTORY
  IXNAME:              JOB_HISTORY
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         E.HIRE_DATE = J.START_DATE
 
  STEP:                5
  LEVEL:               1
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>

文レベルのオプティマイザ・ヒントTT_INDEXの使用

emp_name_ix索引を使用するemployees表で問合せを実行します。次に、文レベルのオプティマイザ・ヒントTT_INDEXを使用して、この索引を使用しないことをオプティマイザに指示します。まずttIsqlコマンドindexesを実行し、employees表の索引を表示します。

Command> indexes employees;
 
Indexes on table TESTUSER.EMPLOYEES:
  EMPLOYEES: unique range index on columns:
    EMPLOYEE_ID
    (referenced by foreign key index JHIST_EMP_FK on table TESTUSER.JOB_HISTORY)
  TTUNIQUE_0: unique range index on columns:
    EMAIL
  EMP_DEPT_FK: non-unique range index on columns:
    DEPARTMENT_ID
    (foreign key index references table TESTUSER.DEPARTMENTS(DEPARTMENT_ID))
  EMP_JOB_FK: non-unique range index on columns:
    JOB_ID
    (foreign key index references table TESTUSER.JOBS(JOB_ID))
  EMP_NAME_IX: non-unique range index on columns:
    LAST_NAME
    FIRST_NAME
  5 indexes found.
 
5 indexes found on 1 table.

ttIsqlコマンドEXPLAINを使用して、last_name列でWHERE句を使用するemployees表でのSELECT問合せの実行計画を表示します。

Command> EXPLAIN SELECT e.first_name
           FROM employees e
           WHERE e.last_name BETWEEN 'A' AND 'B';
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkRangeScan
  TBLNAME:             EMPLOYEES
  IXNAME:              EMP_NAME_IX
  INDEXED CONDITION:   E.LAST_NAME >= 'A' AND E.LAST_NAME <= 'B'
  NOT INDEXED:         <NULL>

文レベルのオプティマイザ・ヒントTT_INDEXを使用して、索引emp_name_ixを使用しないことをオプティマイザに指示します。

Command> EXPLAIN SELECT --+ TT_INDEX (E,EMP_NAME_IX,0)
           e.first_name
           FROM employees e
           WHERE e.last_name BETWEEN 'A' AND 'B';
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           TblLkRangeScan
  TBLNAME:             EMPLOYEES
  IXNAME:              EMPLOYEES
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         E.LAST_NAME <= 'B' AND E.LAST_NAME >= 'A'

TimesTen Scaleoutでのみサポートされているオプティマイザ・ヒント

これらのオプティマイザ・ヒントは、TimesTen Scaleoutのみでサポートされています。これらは文レベルおよび接続レベルで有効です。

接続レベルのヒントの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』OptimizerHintに関する項、文レベルのオプティマイザ・ヒントの詳細は、このマニュアルの「文レベルのオプティマイザ・ヒント」を参照してください。

TT_GridQueryExecオプティマイザ・ヒント

TT_GridQueryExecオプティマイザ・ヒントを使用すると、問合せによって、ローカル要素から、またはすべての要素から(K-safetyが2に設定されている場合はレプリカ・セット内の要素を含む)のデータが返されるようにすることを指定できます。

このヒントを指定しない場合、問合せは1つの論理データ領域で実行されます。ローカルでもグローバルでもありません。これは、問合せを計算するためにデータの1つの完全なコピーのみが使用されることを意味します。複数の結果を取得することが正しい結果を取得するよりも重要な場合(1つ以上のレプリカ・セットを使用できない場合など)、このヒントを使用します。このヒントの有効なオプションは、LOCALおよびGLOBALです。

詳細は、次を参照してください。

この例は、dual表に対するTT_GridQueryExec(GLOBAL)ヒントを使用して、すべての要素、レプリカ・セットおよびデータ領域のIDを判別する方法を示しています。

Command> SELECT /*+TT_GridQueryExec(GLOBAL)*/ elementId#, replicasetId#,
           dataspaceId# FROM dual ORDER BY elementId#,replicasetId#,dataspaceId#;
 
ELEMENTID#, REPLICASETID#, DATASPACEID#
< 1, 1, 1 >
< 2, 1, 2 >
< 3, 2, 1 >
< 4, 2, 2 >
< 5, 3, 1 >
< 6, 3, 2 >
6 rows found.

他の例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』TT_GridQueryExecに関する項を参照してください。

TT_PartialResultオプティマイザ・ヒント

TT_PartialResultオプティマイザ・ヒントを使用すると、一部のデータを使用できない場合、問合せによって結果の一部が返されるようにするかどうかを指定できます。

レプリカ・セット内のすべての要素を使用できない場合に、問合せによって結果の一部が返されるようにするには、TT_PartialResult(1)を使用します。

レプリカ・セット内のすべての要素を使用できず、必要なデータを使用できない場合に、問合せによってエラーが返されるようにするには、TT_PartialResult(0)を使用します。各レプリカ・セットの少なくとも1つの要素が使用可能であるか、問合せに必要なデータが使用可能な場合、オプティマイザは問合せ結果を正常に返し、エラーは発生しません。

デフォルトは、TT_PartialResult(0)です。

詳細は、次を参照してください。

TT_CommitDMLOnSuccesオプティマイザ・ヒント

TT_CommitDMLOnSuccessヒントは、コミット操作をDML実行の一部として使用可能または使用不可にするために使用されます。

  • 文レベルでは、TT_CommitDMLOnSuccessは、DML操作の実行時にDML文(DELETEINSERTINSERT... SELECTおよびUPDATE)でトランザクションのコミット動作を有効または無効にするために使用します。INSERT...SELECT文では、TT_CommitDMLOnSuccessSELECTキーワードの後に指定します。

    TT_CommitDMLOnSuccessはDML操作のみで有効です。問合せやDDL操作では無効となり、DML以外の文で指定した場合は無視され、エラーは戻されません。構文およびセマンティクスの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

  • 接続レベルでも、TT_CommitDMLOnSuccessは、DML操作の実行時にトランザクションのコミットの動作を有効または無効にするために使用します。ただし、TT_CommitDMLOnSuccessOptimizerHint接続属性に対するパラメータとして指定します。TT_CommitDMLOnSuccessを接続レベルで使用する方法は、『Oracle TimesTen In-Memory Databaseリファレンス』OptimizerHintに関する項を参照してください。

どちらのレベルも、有効なオプションは01です。TT_CommitDMLOnSuccessを指定しない場合、標準のコミット動作に変更はありません。優先順位は、文レベル、接続レベルの順です。

文レベルのTT_CommitDMLOnSuccessコミット動作は次のとおりです。

  • ヒントが指定されたDML文が正常に実行された場合、TT_CommitDMLOnSuccess(1)は現在のトランザクションをコミットします。コミット時にオープン・カーソルがある場合、すべてのカーソルがクローズされ、トランザクションがコミットされます。このヒントを含む文が失敗した場合、トランザクションはコミットされません。

  • ヒントが指定されたDML文が正常に実行された場合、TT_CommitDMLOnSuccess(0)は現在のトランザクションのコミットを無効にします。

表6-4に、TT_CommitDMLOnSuccessを設定しない場合と、文レベルおよび接続レベルでTT_CommitDMLOnSuccess0および1に設定した場合のコミット動作を示します。この表は、autocommit0に設定した場合のコミット動作を示しています。

表6-5に、TT_CommitDMLOnSuccessを設定しない場合と、文レベルおよび接続レベルでTT_CommitDMLOnSuccess0および1に設定した場合のコミット動作を示します。この表は、autocommit1に設定した場合のコミット動作を示しています。

表6-4 TT_CommitDMLOnSuccessのコミット動作: 自動コミット0

空白 接続レベルで未設定 接続レベルで0に設定 接続レベルで1に設定

文レベルで未設定

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされません。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされません。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、接続レベルの設定が1であるためトランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、接続レベルの設定が1であるためトランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

文レベルで0に設定

  • オープン・カーソルがない場合、DML実行が成功すると、autocommit0に設定されているため、トランザクションはヒントを含むDML文までコミットされません。コミット動作は文レベルで無効化されるため、このDML文はコミットされません。(これは、TT_CommitDMLOnSuccessを文レベルで設定しない場合と同じ動作です。)

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。(これは、TT_CommitDMLOnSuccessを文レベルで設定しない場合と同じ動作です。)

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされません。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはヒントを含むDML文までコミットされます。コミット動作は文レベルで無効化されるため、このDML文はコミットされません。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

文レベルで1に設定

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

表6-5 TT_CommitDMLOnSuccessのコミット動作: 自動コミット1

空白 接続レベルで未設定 接続レベルで0に設定 接続レベルで1に設定

文レベルで未設定

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

文レベルで0に設定

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。(これは、TT_CommitDMLOnSuccessを文レベルで設定しない場合と同じ動作です。)

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。(これは、TT_CommitDMLOnSuccessを文レベルで設定しない場合と同じ動作です。)

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされず、トランザクションはコミットされません。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

文レベルで1に設定

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

  • オープン・カーソルがない場合、DML実行が成功すると、トランザクションはコミットされます。

  • オープン・カーソルがある場合、DML実行が成功すると、カーソルはクローズされ、トランザクションはコミットされます。

  • DML実行が成功しなかった場合、トランザクションはコミットされません。

詳細は、次を参照してください。

次の例は、TT_CommitDMLOnSuccessオプティマイザ・ヒントの使用例を示しています。

TT_CommitDMLOnSuccessを1に設定

この例では、最初にmytable表を作成します。次に、autocommit0に設定し、mytable表に行を挿入します。2番目の接続(conn2)がデータベースに接続し、mytable表に対してSELECT問合せを発行します。問合せによって0行が戻されます。ttIsql useコマンドを使用すると、アプリケーションは最初の接続(database1)に戻され、2番目のINSERT操作が発行されて、文レベルでTT_CommitDMLOnSuccess1に設定されます。2番目のttIsql useコマンドは、アプリケーションをconn2接続に戻します。SELECT問合せは、2つの行がmytable表に挿入されたことを示します。この例は、TT_CommitDMLOnSuccess(1)を発行すると、2番目のINSERT操作(ヒントを設定)が正常に実行された後、トランザクションがコミットされることを示しています。

Command> CREATE TABLE mytable (col1 TT_INTEGER, col2 VARCHAR2(4000));
Command> autocommit 0;
Command> INSERT INTO mytable VALUES (10, 'ABC');
1 row inserted.

2番目の接続(conn2)を確立します

Command> connect as conn2;
Using the connection string of connection database1 to connect...
...
(Default setting AutoCommit=1)

SELECT問合せを発行し、autocommit0に設定されているため、0行となることが予測されます。

conn2: Command> SELECT * FROM mytable;
0 rows found.

最初の接続(database1)に戻り、TT_CommitDMLOnSuccess1に設定してINSERT操作を発行します。

conn2: Command> use database1;
database1: Command> INSERT /*+TT_CommitDMLOnSuccess(1)*/ 
                       INTO mytable VALUES (10, 'ABC');
1 row inserted.

2番目の接続(conn2)に戻り、SELECTが問合せを発行します。(2つのINSERT文により) 2行を予測します。(TT_CommitDMLOnSuccess文レベルのヒントが1に設定され、2つのINSERT操作が正常に実行されたため、トランザクションがコミットされます。)

database1: Command> use conn2
conn2: Command> SELECT * FROM mytable;
< 10, ABC >
< 10, ABC >
2 rows found.

接続レベルでのTT_CommitDMLOnSuccessの使用

この例では、最初にmytable表を作成します。次に、PL/SQLを使用して表に1000行を挿入します。データベースへの2番目の接続(conn2)があり、この接続はTT_CommitDMLOnSuccessを接続レベルで1に設定して接続します。文レベルと接続レベルの両方のTT_CommitDMLOnSuccessの動作を示す様々な操作が実行されます。

Command>  CREATE TABLE mytable (col1 TT_INTEGER NOT NULL PRIMARY KEY, 
            col2 VARCHAR2 (4000));
Command> BEGIN
           FOR i in 1..1000
           LOOP
            INSERT INTO mytable VALUES (i,i);
          END LOOP;
        END;
        /
PL/SQL procedure successfully completed.

2番目の接続(conn2)を確立し、TT_CommitDMLOnSuccessを接続レベルで1に設定して接続します。

Command> CONNECT adding "OptimizerHint=TT_CommitDMLOnSuccess(1)" as conn2;
Connection successful: 
...

autocommit0に設定し、DELETE操作を発行します。

conn2: Command> autocommit 0;
conn2: Command> DELETE FROM mytable WHERE col1=1000;
1 row deleted.

元の接続(database1)に戻り、SELECT問合せを発行し、DELETE操作がコミットされたかどうかを確認します。TT_CommitDMLOnSuccessが接続レベルで1に設定されているため、操作はコミットされました。

conn2: Command> use database1;
database1: Command> SELECT * FROM mytable WHERE col1=1000;
0 rows found.

2番目の接続(conn2)に戻り、INSERT操作を発行します。次に、元の接続(database1)に戻ります。INSERT操作を含むトランザクションはコミットされました。

database1: Command> use conn2;
conn2: Command> INSERT INTO mytable VALUES (1000,1000);
1 row inserted.
conn2: Command> use database1
database1: Command> SELECT * FROM mytable WHERE col1=1000;
< 1000, 1000 >
1 row found.

2番目の接続(conn2)に戻り、DELETE操作を発行した後、INSERT操作を発行し、次にTT_CommitDMLOnSuccessを文レベルで0に設定した2番目のINSERT操作を発行します(2番目のINSERT操作)。

database1: Command> use conn2;
conn2: Command> DELETE FROM mytable WHERE col1=1000;
1 row deleted.
conn2: Command> INSERT INTO mytable VALUES (1001,1001);
1 row inserted.
conn2: Command> INSERT /*+TT_CommitDMLOnSuccess(0)*/ INTO mytable 
                  VALUES (1002,1002);
1 row inserted.

SELECT問合せを発行し、問合せの結果を確認します。1つのDELETE操作と2つのINSERT操作が正常に実行されました。

conn2: Command> SELECT * FROM mytable where col1 >= 1000;
< 1001, 1001 >
< 1002, 1002 >
2 rows found.

元の接続(database1)に戻り、同じSELECT問合せを発行します。1つのDELETE文と最初のINSERT操作がコミットされたことを確認します。これは、TT_CommitDMLOnSuccessが接続レベルで1に設定されているためです。この2番目のINSERT文のTT_CommitDMLOnSuccess0に設定されているため、2番目のINSERT文はコミットされませんでした。

conn2: Command> use database1;
database1: Command> SELECT * FROM mytable where col1 >= 1000;
< 1001, 1001 >
1 row found.

2番目の接続(conn2)に戻り、3番目のINSERT操作を発行します。SELECT問合せを発行し、結果を確認します。

database1: Command> use conn2;
conn2: Command> INSERT INTO mytable VALUES (1003,1003);
1 row inserted.
conn2: Command> SELECT * FROM mytable where col1 >= 1000 ORDER BY col1;
< 1001, 1001 >
< 1002, 1002 >
< 1003, 1003 >
3 rows found.

元の接続(database1)に戻り、同じSELECT問合せを発行します。結果がconn2接続と同じであることに注意してください。TT_CommitDMLOnSuccessが接続レベルで1に設定され、2番目と3番目のINSERT操作が正常に実行されたため、トランザクションはコミットされます。

conn2: Command> use database1
database1: Command> SELECT * FROM mytable where col1 >= 1000 ORDER BY col1;
< 1001, 1001 >
< 1002, 1002 >
< 1003, 1003 >
3 rows found.

ALTER ACTIVE STANDBY PAIR

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

アクティブ・スタンバイ・ペアは、次の方法で変更できます。

  • サブスクライバ・データベースを追加または削除します。

  • ストア属性を変更します

    サブスクライバには、PORTおよびTIMEOUT属性のみを設定できます。

  • 表、順序またはキャッシュ・グループをレプリケーション・スキームに含めます。

  • 表、順序またはキャッシュ・グループをレプリケーション・スキームから除外します。

『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアのその他の変更に関する項を参照してください。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

ALTER ACTIVE STANDBY PAIR { 
      SubscriberOperation | 
      StoreOperation | InclusionOperation |
      NetworkOperation } [...]

SubscriberOperationの構文は、次のとおりです。

{ADD | DROP } SUBSCRIBER FullStoreName

StoreOperationの構文は、次のとおりです。

ALTER STORE FullStoreName SET StoreAttribute

InclusionOperationの構文は、次のとおりです。

    [{ INCLUDE | EXCLUDE }{TABLE [[Owner.]TableName [,...]]|
         CACHE GROUP [[Owner.]CacheGroupName [,...]]|
         SEQUENCE [[Owner.]SequenceName [,...]]} [,...]]

NetworkOperationの構文は、次のとおりです。

ADD ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName
      { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost }
          PRIORITY Priority } [...] 
DROP ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName
      { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } [...] 

パラメータ

パラメータ 説明

ADD SUBSCRIBER FullStoreName

サブスクライバ・データベースを指定します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

DROP SUBSCRIBER FullStoreName

指定したサブスクライバ・データベースに更新が送信されないように指定します。この処理は、レプリケーション・スキームの持つサブスクライバが1つのみの場合に失敗します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

ALTER STORE FullStoreName SET StoreAttribute

データベースの属性への変更を指定します。サブスクライバには、PORTおよびTIMEOUT属性のみを設定できます。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

StoreAttribute句の詳細は、「CREATE ACTIVE STANDBY PAIR」を参照してください。

FullStoreName

次のいずれかとして指定されたデータベースです。

  • SELF

  • データベース・ファイル名の接頭辞

たとえば、データベースのパスがdirectory/subdirectory/data.ds0の場合、使用するデータベース名はdataになります。

この名前は、DSNの記述のDataStore属性で指定されるデータベース・ファイル名で、オプションでホストIDを次の書式で指定できます。

DataStoreName [ON Host]

Hostは、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』ネットワークの構成に関する項で説明されているように、IPアドレスまたは1つ以上のIPアドレスに割り当てられたリテラル・ホスト名です。ホスト名に特殊文字が含まれている場合は、二重引用符で囲む必要があります。たとえば、"MyHost-500"のようになります。

{INCLUDE|EXCLUDE}

{[TABLE [Owner.]TableName[,...]|

CACHE GROUP

[[Owner.]CacheGroupName]|[,...]

SEQUENCE [[Owner.]SequenceName [,...]}

[,...]

指定された表、順序またはキャッシュ・グループをレプリケーションに含めるか、またはレプリケーションから除外します。

INCLUDEを指定すると、表、順序またはキャッシュ・グループがレプリケーション・スキームに追加されます。INCLUDE句は、オブジェクト型(表、順序またはキャッシュ・グループ)ごとに1つ使用します。

EXCLUDEを指定すると、表、順序またはキャッシュ・グループがレプリケーションから除外されます。EXCLUDE句は、オブジェクト型(表、キャッシュ・グループまたは順序)ごとに1つ使用します。

EXCLUDE句はAWTキャッシュ・グループに対して使用できません。

ADD ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName

レプリケーション・スキームにNetworkOperationを追加します。各サブスクライバ・ストアへのすべてのアウトバウンド接続に対してマスター・ストアが使用するネットワーク・インタフェースを制御できます。ADD ROUTE句のコンテキストでは、各マスター・データベースは他のマスター・データベースのサブスクライバであり、各読取り専用サブスクライバは両方のマスター・データベースのサブスクライバです。

複数回指定できます。

FullStoreNameには、"ON host"を指定する必要があります。

DROP ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName

レプリケーション・スキームからNetworkOperationを削除します。

複数回指定できます。

FullStoreNameには、"ON host"を指定する必要があります。

MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost

MasterHostおよびSubscriberHostは、マスターおよびサブスクライバ・ストアのネットワーク・インタフェースのIPアドレスです。IPV6のドット表記または正規形式で指定するか、あるいはコロン表記で指定します。

句は複数回指定できます。ADDおよびDROP ROUTE MASTERの両方に対して有効です。

PRIORITY Priority

1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。

NetworkOperation 句の構文で必須です。MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost句の後ろに記述します。

説明

  • アクティブ・スタンバイ・ペアを変更する前に、レプリケーション・エージェントを停止する必要があります。例外は、DDL_REPLICATION_LEVEL属性とDDL_REPLICATION_ACTION属性の値に基づいて自動的にレプリケートされて組み込まれるオブジェクトおよび文の場合です。詳細は、「ALTER SESSION」を参照してください。

  • アクティブ・データベースのアクティブ・スタンバイ・ペア・レプリケーション・スキームのみを変更できます。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアのその他の変更に関する項を参照してください。

  • TimesTenでOracle Clusterwareを使用する場合は、ALTER ACTIVE STANDBY PAIRは使用できません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』コマンドおよびSQL文の制限に関する項を参照してください。

    かわりに、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』スキーマの変更に関する項で説明されているタスクを実行します。

  • ADD SUBSCRIBER FullStoreNameは、サブスクライバをレプリケーション・スキームに追加する場合に使用します。

  • DROP SUBSCRIBER FullStoreNameは、サブスクライバをレプリケーション・スキームから削除する場合に使用します。

  • INCLUDEまたはEXCLUDE句は、指定された表、順序またはキャッシュ・グループをレプリケーション・スキームに含めるか、またはレプリケーション・スキームから除外する場合に使用します。INCLUDEまたはEXCLUDE句は、オブジェクト型(表、順序またはキャッシュ・グループ)ごとに1つ使用します。ALTER ACTIVE STANDBY文は、DDL_REPLICATION_LEVEL属性とDDL_REPLICATION_ACTION属性の値に基づいて自動的にレプリケートされて組み込まれるオブジェクトおよび文には不要です。詳細は、「ALTER SESSION」を参照してください。ただし、DDL_REPLICATION_LEVELが2以上で、DDL_REPLICATION_ACTION="EXCLUDE"の場合は、INCLUDE句を使用して、レプリケートされたオブジェクトをレプリケーション・スキームに含めます。

  • EXCLUDE句はAWTキャッシュ・グループに対して使用しないでください。

  • DDL_REPLICATION_LEVELが2以上の場合は、INCLUDE句はアクティブ・データベースの空の表でのみ使用できます。スタンバイおよびサブスクライバの対応する表の内容は、表がレプリケーション・スキームに追加される前に切り捨てられます。

サブスクライバをレプリケーション・スキームに追加します。

ALTER ACTIVE STANDBY PAIR
    ADD SUBSCRIBER rep4;

2つのサブスクライバをレプリケーション・スキームから削除します。

ALTER ACTIVE STANDBY PAIR
    DROP SUBCRIBER rep3
    DROP SUBSCRIBER rep4;

rep3およびrep4データベースのストア属性を変更します。

ALTER ACTIVE STANDBY PAIR
    ALTER STORE rep3 SET PORT 23000 TIMEOUT 180
    ALTER STORE rep4 SET PORT 23500 TIMEOUT 180;

1つの表、1つの順序および2つのキャッシュ・グループをレプリケーション・スキームに追加します。

ALTER ACTIVE STANDBY PAIR
    INCLUDE TABLE my.newtab
    INCLUDE SEQUENCE my.newseq
    INCLUDE CACHE GROUP my.newcg1, my.newcg2;

アクティブ・スタンバイ・ペアにNetworkOperation句を追加します。

ALTER ACTIVE STANDBY PAIR
ADD ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2"
MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1;

ALTER CACHE GROUP

ALTER CACHE GROUP文は、キャッシュ・グループに対するAUTOREFRESHの状態、時間隔およびモードを変更します。

Oracle Database表の更新は、AUTOREFRESHを使用してTimesTenキャッシュ・グループに伝播させることができます。AUTOREFRESHは、キャッシュ・グループがユーザー管理キャッシュ・グループであるか、またはAUTOREFRESH句でREADONLYとして定義されている場合に有効にできます。

ALTER CACHE GROUPを使用して設定した任意の値または状態は永続的です。それらの設定はデータベースに保存されるため、デーモンやキャッシュ・エージェントを再起動した場合にも引き続き使用されます。

必要な権限

キャッシュ・グループの所有者に必要な権限はありません。

別のユーザーのキャッシュ・グループの場合はALTER ANY CACHE GROUPが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

この文は、キャッシュ・グループのAUTOREFRESHモードを変更し、これによって、自動リフレッシュ操作中に更新される行が決まります。ALTER CACHE GROUP...SET AUTOREFRESH MODE句は、TimesTen Scaleoutでは使用できません。

ALTER CACHE GROUP [Owner.]GroupName
        SET AUTOREFRESH MODE
        {INCREMENTAL | FULL}

この文は、キャッシュ・グループのAUTOREFRESHの時間隔を変更します。ALTER CACHE GROUP...SET AUTOREFRESH INTERVAL句は、TimesTen Scaleoutでは使用できません。

ALTER CACHE GROUP [Owner.]GroupName 
        SET AUTOREFRESH INTERVAL IntervalValue 
        {MINUTE[S] | SECOND[S] | MILLISECOND[S]}

この文は、AUTOREFRESHの状態を変更します。

ALTER CACHE GROUP [Owner.]GroupName 
        SET AUTOREFRESH STATE
        {ON | OFF | PAUSED}

パラメータ

パラメータ 説明

[Owner.]GroupName

新しいキャッシュ・グループに割り当てられる名前。

AUTOREFRESH

Oracle Database表への変更を自動的にTimesTenに伝播するように指定します。

MODE

自動リフレッシュ時に更新されるキャッシュ内の行を指定します。INCREMENTAL句が指定された場合、TimesTenは前回の伝播以降にOracle Databaseに加えられた変更のみをリフレッシュします。FULL句が指定された場合、またはFULL句もINCREMENTAL句も指定されなかった場合、TimesTenは自動リフレッシュのたびにキャッシュ内のすべての行を更新します。デフォルトのモードはINCREMENTALです。

INTERVAL

IntervalValue

AUTOREFRESHを実行する頻度を分、秒またはミリ秒単位の整数値で指定します。デフォルト値は5分です。自動リフレッシュ間隔を0ミリ秒に設定すると、連続的な自動リフレッシュが可能になり、最後の自動リフレッシュ・サイクルが終了した直後に次の自動リフレッシュ・サイクルがスケジュールされます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの自動リフレッシュに関する項を参照してください。

指定した時間隔でAUTOREFRESHを完了できない場合は、実行時に警告が生成され、現在の処理が終了するまで次回のAUTOREFRESHを待機します。待機キューが10に達すると、サポート・ログに通知メッセージが生成されます。

STATE

AUTOREFRESHをオン、オフまたは一時停止のいずれかに変更します。デフォルトでは、AUTOREFRESH STATEONです。

ON

指定した時間隔でAUTOREFRESHが実行されるようにスケジュールします。

OFF

スケジュールされたAUTOREFRESHを取り消し、TimesTenではINCREMENTALリフレッシュに必要な情報が保持されません。このため、後でAUTOREFRESHを再度オンに設定した場合、最初のリフレッシュはFULLです。

PAUSED

スケジュールされたAUTOREFRESHを取り消しますが、TimesTenではINCREMENTALリフレッシュに必要な情報が保持されます。このため、後でAUTOREFRESHを再度オンに設定した場合、完全リフレッシュは不要です。

説明

  • リフレッシュは、ALTER CACHE GROUP...SET AUTOREFRESH STATEを実行した直後には実行されません。この文では、AUTOREFRESHの状態を変更するだけです。ALTER CACHE GROUP文を含むトランザクションをコミットすると、AUTOREFRESHのスケジュールのためにキャッシュ・エージェントにはすぐに通知されますが、コミットはリフレッシュの完了を待たずに実行されます。自動リフレッシュ操作のスケジューリングはトランザクションの一部ですが、リフレッシュ自体はトランザクションの一部ではありません。

  • ALTER CACHE GROUP... SET AUTOREFRESH STATE OFF文を実行し、現在実行中の自動リフレッシュ操作がある場合、次のような結果になります。

    • LockWaitの時間隔が0の場合、ALTER文はロックのタイムアウト・エラーで失敗します。

    • LockWaitの時間隔が0以外の場合、現在の自動リフレッシュ・トランザクションはロールバックされ、ALTER文の処理が続行されます。これは、同じ自動リフレッシュ間隔を持つすべてのキャッシュ・グループに影響します。

  • AUTOREFRESHが設定されたキャッシュ・グループとAUTOREFRESHが設定されていないキャッシュ・グループの間では、レプリケートできません。

  • ALTER CACHE GROUP文がレプリケートされているトランザクションの一部である場合、およびレプリケーション・スキームにRETURN TWOSAFE属性が指定されている場合、トランザクションは失敗する可能性があります。

  • ALTER CACHE GROUP文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。

関連項目

ALTER FUNCTION

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

ALTER FUNCTION文は、スタンドアロンのストアド・ファンクションを再コンパイルします。明示的に再コンパイルすることによって、実行時に暗黙的に再コンパイルする必要がなくなり、関連する実行時コンパイル・エラーおよびパフォーマンス・オーバーヘッドが発生しなくなります。

パッケージに含まれるファンクションを再コンパイルするには、ALTER PACKAGE文を使用してパッケージを再コンパイルします。

必要な権限

PL/SQLファンクションの所有者に必要な権限はありません。

別のユーザーのファンクションの場合はALTER ANY PROCEDUREが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

ALTER FUNCTION [Owner.]FunctionName COMPILE
      [CompilerParametersClause [...]] 
      [REUSE SETTINGS]

パラメータ

パラメータ 説明

[Owner.]FunctionName

再コンパイルするファンクションの名前。

COMPILE

ファンクションの再コンパイルを発生させる必須キーワード。ファンクションを正常にコンパイルできなかった場合は、ttIsqlコマンドのSHOW ERRORSを使用してコンパイラのエラー・メッセージを表示します。

CompilerParametersClause

このオプション句を使用して、いずれかのPL/SQL永続コンパイラ・パラメータの値を指定します。PL/SQL永続コンパイラ・パラメータには、PLSQL_OPTIMIZE_LEVELおよびNLS_LENGTH_SEMANTICSがあります。

文の中で各パラメータを1回指定できます。

この句のパラメータを省略してREUSE SETTINGSを指定した場合、前回のコンパイルでパラメータに値を指定していると、この(前回の)値がTimesTenによって使用されます。パラメータを省略し、かつ、REUSE SETTINGSを指定しないか、または前回のコンパイルでパラメータに値を指定しなかった場合、TimesTenによってセッション環境からパラメータの値が取得されます。

REUSE SETTINGS

このオプション句を使用して、TimesTenがコンパイラのスイッチ設定を削除および再取得しないようにします。REUSE SETTINGSを指定すると、TimesTenによって既存の設定が保持され、値を指定していないパラメータのコンパイルに使用されます。

説明

  • ALTER FUNCTION文は、既存ファンクションの宣言または定義を変更しません。ファンクションを再宣言または再定義するには、CREATE FUNCTION文を使用します。

  • ファンクションが依存しているオブジェクトが無効な場合、TimesTenは最初にこれらのオブジェクトを再コンパイルします。

  • また、TimesTenは、再コンパイルされたファンクションをコールするファンクションや、再コンパイルされたファンクションをコールするファンクションが定義されているパッケージの本体など、ファンクションに依存しているオブジェクトをすべて無効にします。

  • TimesTenによってファンクションが正常に再コンパイルされると、そのファンクションは有効になります。ファンクションの再コンパイルでコンパイル・エラーになった場合、TimesTenによってエラーが返され、ファンクションは無効のままになります。ttIsqlコマンドのSHOW ERRORSを使用して、コンパイル・エラーを表示します。

  • 再コンパイル中に、TimesTenはすべての永続コンパイラ設定を削除し、セッションからこれらの設定を再取得して、コンパイルの最後に格納します。この処理を回避するには、REUSE SETTINGS句を指定します。

関連項目

ALTER PACKAGE

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

ALTER PACKAGE文は、パッケージ仕様部、パッケージ本体またはその両方を明示的に再コンパイルします。明示的に再コンパイルすることによって、実行時に暗黙的に再コンパイルする必要がなくなり、関連する実行時コンパイル・エラーが発生しなくなります。

この文では、同時にすべてのパッケージ・オブジェクトを再コンパイルします。ALTER PROCEDURE文またはALTER FUNCTION文を使用して、パッケージに含まれるプロシージャまたはファンクションを個別に再コンパイルすることはできません。

必要な権限

パッケージの所有者に必要な権限はありません。

別のユーザーのパッケージの場合はALTER ANY PROCEDUREが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

ALTER PACKAGE [Owner.]PackageName COMPILE
      [PACKAGE|SPECIFICATION|BODY]
      [CompilerParametersClause [...]] 
      [REUSE SETTINGS]

パラメータ

パラメータ 説明

[Owner.]PackageName

再コンパイルするパッケージの名前。

COMPILE

パッケージ仕様部、パッケージ本体またはその両方の再コンパイルを強制するために使用される必須の句。

[PACKAGE|SPECIFICATION|BODY]

パッケージ仕様部と本体の両方を再コンパイルするには、PACKAGEを指定します。パッケージ仕様部を再コンパイルするには、SPECIFICATIONを指定します。パッケージ本体を再コンパイルするには、BODYを指定します。

PACKAGEがデフォルトです。

CompilerParametersClause

このオプション句を使用して、いずれかのPL/SQL永続コンパイラ・パラメータの値を指定します。PL/SQL永続コンパイラ・パラメータには、PLSQL_OPTIMIZE_LEVELおよびNLS_LENGTH_SEMANTICSがあります。

文の中で各パラメータを1回指定できます。

この句のパラメータを省略してREUSE SETTINGSを指定した場合、前回のコンパイルでパラメータに値を指定していると、この(前回の)値がTimesTenによって使用されます。パラメータを省略し、かつ、REUSE SETTINGSを指定しないか、または前回のコンパイルでパラメータに値を指定しなかった場合、TimesTenによってセッション環境からパラメータの値が取得されます。

REUSE SETTINGS

このオプション句を使用して、TimesTenがコンパイラのスイッチ設定を削除および再取得しないようにします。REUSE SETTINGSを指定すると、TimesTenによって既存の設定が保持され、値を指定していないパラメータのコンパイルに使用されます。

説明

  • パッケージ仕様部を再コンパイルすると、TimesTenは、パッケージ内のプロシージャまたはファンクションをコールするプロシージャなど、仕様部に依存しているローカル・オブジェクトを無効にします。パッケージの本体もまた仕様部に依存しています。この後、先にこれらの依存オブジェクトのいずれかを明示的に再コンパイルしないで参照すると、このオブジェクトはTimesTenによって実行時に暗黙的に再コンパイルされます。

  • パッケージ本体を再コンパイルした場合、パッケージ仕様部に依存しているオブジェクトは無効になりません。本体が依存しているオブジェクトが無効な場合、TimesTenは最初にこれらのオブジェクトを再コンパイルします。TimesTenによって本体が正常に再コンパイルされると、その本体は有効になります。

  • パッケージを再コンパイルすると、仕様部と本体の両方が明示的に再コンパイルされます。コンパイル・エラーが発生しなかった場合、仕様部および本体は有効になります。コンパイル・エラーが発生した場合、TimesTenによってエラーが返され、パッケージは無効のままになります。

関連項目

ALTER PROCEDURE

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

ALTER PROCEDURE文は、スタンドアロンのストアド・プロシージャを再コンパイルします。明示的に再コンパイルすることによって、実行時に暗黙的に再コンパイルする必要がなくなり、関連する実行時コンパイル・エラーおよびパフォーマンス・オーバーヘッドが発生しなくなります。

パッケージに含まれるプロシージャを再コンパイルするには、ALTER PACKAGE文を使用してパッケージを再コンパイルします。

必要な権限

プロシージャの所有者に必要な権限はありません。

別のユーザーのプロシージャの場合はALTER ANY PROCEDUREが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

ALTER PROCEDURE [Owner.]ProcedureName COMPILE
      [CompilerParametersClause [...]] 
      [REUSE SETTINGS]

パラメータ

パラメータ 説明

[Owner.]ProcedureName

再コンパイルするプロシージャの名前。

COMPILE

プロシージャの再コンパイルを発生させる必須キーワード。プロシージャを正常にコンパイルできなかった場合は、ttIsqlコマンドのSHOW ERRORSを使用してコンパイラのエラー・メッセージを表示します。

CompilerParametersClause

このオプション句を使用して、いずれかのPL/SQL永続コンパイラ・パラメータの値を指定します。PL/SQL永続コンパイラ・パラメータには、PLSQL_OPTIMIZE_LEVELおよびNLS_LENGTH_SEMANTICSがあります。

文の中で各パラメータを1回指定できます。

この句のパラメータを省略してREUSE SETTINGSを指定した場合、前回のコンパイルでパラメータに値を指定していると、この(前回の)値がTimesTenによって使用されます。パラメータを省略し、かつ、REUSE SETTINGSを指定しないか、または前回のコンパイルでパラメータに値を指定しなかった場合、TimesTenによってセッション環境からパラメータの値が取得されます。

REUSE SETTINGS

このオプション句を使用して、TimesTenがコンパイラのスイッチ設定を削除および再取得しないようにします。REUSE SETTINGSを指定すると、TimesTenによって既存の設定が保持され、値を指定していないパラメータのコンパイルに使用されます。

説明

  • ALTER PROCEDURE文は、既存プロシージャの宣言または定義を変更しません。プロシージャを再宣言または再定義するには、CREATE PROCEDURE文を使用します。

  • プロシージャが依存しているオブジェクトが無効な場合、TimesTenは最初にこれらのオブジェクトを再コンパイルします。

  • また、TimesTenは、再コンパイルされたプロシージャをコールするプロシージャや、再コンパイルされたプロシージャをコールするプロシージャが定義されているパッケージの本体など、プロシージャに依存しているオブジェクトをすべて無効にします。

  • TimesTenによってプロシージャが正常に再コンパイルされると、そのプロシージャは有効になります。プロシージャの再コンパイルでコンパイル・エラーになった場合、TimesTenによってエラーが返され、プロシージャは無効のままになります。ttIsqlコマンドのSHOW ERRORSを使用して、コンパイル・エラーを表示します。

  • 再コンパイル中に、TimesTenはすべての永続コンパイラ設定を削除し、セッションからこれらの設定を再取得して、コンパイルの最後に格納します。この処理を回避するには、REUSE SETTINGS句を指定します。

システム・ビューUSER_PLSQL_OBJECT_SETTINGSに問合せを発行して、プロシージャquery_empPLSQL_OPTIMIZE_LEVELを確認します。PLSQL_OPTIMIZE_LEVELを3に変更することで、query_empを修正します。結果を確認します。

Command> SELECT PLSQL_OPTIMIZE_LEVEL FROM user_plsql_object_settings WHERE  name = 'QUERY_EMP';
< 2 >
1 row found.

Command> ALTER PROCEDURE query_emp COMPILE PLSQL_OPTIMIZE_LEVEL = 3;
 
Procedure altered.
 
Command> SELECT PLSQL_OPTIMIZE_LEVEL FROM user_plsql_object_settings WHERE  name = 'QUERY_EMP';
< 3 >
1 row found.

関連項目

ALTER PROFILE

ALTER PROFILE文では、プロファイル内の1つ以上のパスワード・パラメータを追加、変更または削除します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

ALTER PROFILE profile LIMIT password_parameters

password_parameters::=
[FAILED_LOGIN_ATTEMPTS password_parameter_options]
[PASSWORD_LIFE_TIME password_parameter_options]
[PASSWORD_REUSE_TIME password_parameter_options]
[PASSWORD_REUSE_MAX password_parameter_options]
[PASSWORD_LOCK_TIME password_parameter_options]
[PASSWORD_GRACE_TIME password_parameter_options]
[{PASSWORD_COMPLEXITY_CHECKER|PASSWORD_VERIFY_FUNCTION} password_checker_options]

password_parameter_options::=
UNLIMITED|DEFAULT|constant

password_checker_options::=
function|NULL|DEFAULT

function::=
TT_VERIFY_FUNCTION|TT_STRONG_VERIFY_FUNCTION|TT_STIG_VERIFY_FUNCTION

パラメータ

パラメータ 説明

profile

プロファイルの名前。

LIMIT password_parameters

LIMIT句では、パスワード・パラメータの制限を設定します。LIMITキーワードは必須です。

パスワード・パラメータは、パスワード・パラメータの名前とパスワード・パラメータの値(または制限)で構成されます。これには、パスワード複雑度チェッカ関数が含まれます。すべてのパラメータ(FAILED_LOGIN_ATTEMPTSPASSWORD_REUSE_MAXを除く)では、時間の長さを設定します。この長さは日数として解釈されます。小数値を使用できます(たとえば、約1時間を意味するために.0833を使用できます)。最小値は1秒です。最大値は106,751,991日です。定数値は日数で表す必要があります。たとえば、5分の値を設定するには、定数値の0.0034722222222222 (5/1440日)を指定します。FAILED_LOGIN_ATTEMPTSPASSWORD_REUSE_MAXには、整数を指定する必要があります。

LIMIT句の後にパスワード・パラメータを指定しないと、そのパスワード・パラメータの制限は、DEFAULTプロファイルで定義した制限に基づくようになります。また、追加のパラメータなしでLIMITキーワードのみを指定すると、プロファイルの制限はDEFAULTプロファイルの制限に基づくようになります。

FAILED_LOGIN_ATTEMPTS

ユーザーのアカウントがロックされるまでの、ユーザーによるデータベースへの接続試行の連続失敗回数を指定します。

PASSWORD_LIFE_TIME

ユーザーが認証に同じパスワードを使用できる日数を指定します。PASSWORD_GRACE_TIMEの値も設定すると、猶予期間内にパスワードが変更されない場合に、パスワードが期限切れになります。このような状況になると、その後のデータベースへの接続は拒否されます。

PASSWORD_REUSE_TIMEおよびPASSWORD_REUSE_MAX

これら2つのパラメータは、同時に使用する必要があります。

  • PASSWORD_REUSE_TIMEでは、ユーザーがパスワードを再利用できるようになるまでの経過日数を指定します。たとえば、30の値を指定した場合、ユーザーは、以前のパスワードを30日後に再利用できるようになります。

  • PASSWORD_REUSE_MAXでは、現行のパスワードが再利用できるようになるまでに必要なパスワードの変更回数を指定します。

これらのパラメータを有効にするには、その両方に値を指定する必要があります。具体的には、次のようになります。

  • 両方のパラメータに値を指定した場合: PASSWORD_REUSE_TIMEに指定した日数の間に、PASSWORD_REUSE_MAXに指定した回数になるまでパスワードを変更していないと、ユーザーはパスワードを再利用できません。たとえば、PASSWORD_REUSE_TIME30の値を指定し、PASSWORD_REUSE_MAX10の値を指定した場合、ユーザーはパスワードを10回変更していれば、30日後にパスワードを再利用できます。

  • どちらかのパラメータに値を指定して、もう一方のパラメータにUNLIMITEDの値を指定すると、ユーザーはパスワードを再利用できなくなります。

  • 両方のパラメータにUNLIMITEDの値を指定すると、TimesTenは両方の値を無視します。つまり、パスワードが再利用できることを意味します。

PASSWORD_LOCK_TIME

指定した回数連続して接続に失敗した後に、ユーザー・アカウントがロックされる日数を指定します。

PASSWORD_GRACE_TIME

猶予期間の開始後の日数を指定します。この間は、TimesTenが警告を示しますが、データベースへの接続は許可されます。猶予期間中にパスワードが変更されないと、そのパスワードは期限切れになります。このパラメータは、PASSWORD_LIFE_TIMEパラメータに関連付けられます。

UNLIMITED

パスワード・パラメータに制限がないことを示します。UNLIMITEDを指定した場合は、パスワード・パラメータに従うことになります。たとえば、FAILED_LOGIN_ATTEMPTS UNLIMITED

DEFAULT

このプロファイルのパスワード・パラメータに対する制限を省略することを示します。このプロファイルが割り当てられているユーザーは、このパスワード・パラメータのDEFAULTプロファイルで定義された制限を受けます。

DEFAULTを指定した場合は、パスワード・パラメータに従うことになります。たとえば、FAILED_LOGIN_ATTEMPTS DEFAULT

constant

UNLIMITEDまたはDEFAULTを指定していない場合のパスワード・パラメータの値を示します。指定した場合は、パスワード・パラメータに従うことになります。たとえば、FAILED_LOGIN_ATTEMPTS 3

{PASSWORD_COMPLEXITY_CHECKER| PASSWORD_VERIFY_FUNCTION} {function|NULL|DEFAULT}

パスワードに対するパスワード検証を実行するかどうかを示します。実行する場合は、検証に使用する関数を指定します。PASSWORD_COMPLEXITY_CHECKERまたはPASSWORD_VERIFY_FUNCTIONのどちらかのパスワード・パラメータを指定できます。これらは同じものです。

functionは、サポートされている3つのパスワード複雑度チェッカ関数のいずれかを示します。TimesTenにパスワード検証を実行するように指示するには、これらの関数のいずれかを指定します。有効な値は次のとおりです。
  • TT_VERIFY_FUNCTION
  • TT_STRONG_VERIFY_FUNCTION
  • TT_STIG_VERIFY_FUNCTION

NULLは、プロファイルに割り当てられたパスワード検証関数が存在しないことを示します。

DEFAULTは、ユーザーがDEFAULTプロファイルで定義された制限を受けることを示します。DEFAULTプロファイルの初期の値はNULLです。

PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータを指定しない場合、その値はDEFAULTプロファイルに定義されている制限にデフォルト設定されます。

説明

  • ALTER PROFILE文は、以前に作成したプロファイルを変更するために使用します。プロファイルの作成の詳細は、「CREATE PROFILE」を参照してください。

  • ALTER PROFILE文を使用した変更は、その影響を受けるユーザーが次回データベースに接続したときに有効になります。例外は、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータを変更した場合です。パスワード検証は、新規に作成されたパスワード(CREATE USERまたはALTER USER文のIDENTIFIED BY句で指定されたパスワード)に対してのみ実行されます。そのため、ユーザーは古いパスワードでデータベースに接続できます。例については、「PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの変更」を参照してください。

  • DEFAULTプロファイルは変更できます。ただし、DEFAULTプロファイルは削除できません。DEFAULTプロファイルの変更例は、「DEFAULTプロファイルの変更」を参照してください。

  • SYSTEMプロファイルのパスワード・パラメータは変更できません。このプロファイルはインスタンス管理者を含むシステム・ユーザーに割り当てられます。

  • プロファイルを変更して、そのプロファイルが割り当てられているユーザーのパスワードに対して実行するパスワード検証を変更できます。パスワード検証およびパスワード複雑度チェッカ検証関数の詳細は、「パスワード複雑度チェッカの検証について」を参照してください。

PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの変更

この例では、myprofile_alterpw1プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータにTT_VERIFY_FUNCTIONを指定します。その後で、sampleuser_alterpw1ユーザーを作成して、sampleuser_alterpw1ユーザーにmyprofile_alterpw1プロファイルを割り当てます。この例では、プロファイルを変更して、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータにTT_STIG_VERIFY_FUNCTIONを指定します。sampleuser_alterpw1は、元のパスワードでデータベースに接続しようとします。その接続に成功します。TimesTenは古いパスワードに対するパスワード検証を実行しません。その後で、ALTER USER文を使用して、TT_STIG_VERIFY_FUNCTIONの要件を満たすようにsampleuser_alterpw1のユーザー・パスワードを変更しています。ALTER USER文が成功して、ユーザーのパスワードが変更されています。

Command> CREATE PROFILE myprofile_alterpw1 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_VERIFY_FUNCTION;

Profile created.

Command> CREATE USER sampleuser_alterpw1 
           IDENTIFIED BY "%aabb2L90" PROFILE myprofile_alterpw1;

User created.

myprofile_alterpw1プロファイルを変更することで、PASSWORD_COMPLEXITY_CHECKERの値をTT_STIG_VERIFY_FUNCTIONに変更します。sampleuser_alterpw1ユーザーとして、データベースに接続します。接続が成功します。

Command> ALTER PROFILE myprofile_alterpw1 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STIG_VERIFY_FUNCTION;

Profile altered.

Command> GRANT CONNECT TO sampleuser_alterpw1;
Command> connect adding "UID=sampleuser_alterpw1;PWD=%aabb2L90" as sampleuser;
Connection successful: DSN=access1;UID=sampleuser_alterpw1;
DataStore=/scratch/sampleuser/mydatabase1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

同じパスワードを指定して、sampleuser_alterpw1ユーザーを変更します。ALTER USER文は失敗します。新しく作成したパスワードは、TT_STIG_VERIFY_FUNCTION関数の要件を満たしていません。TT_STIG_VERIFY_FUNCTION関数の要件を満たすパスワードを指定して、sampleuser_alterpw1を再度変更します。ALTER USER文は成功します。TT_STIG_VERIFY_FUNCTION関数の詳細は、「TT_STIG_VERIFY_FUNCTION」を参照してください。

Command> ALTER USER sampleuser_alterpw1 
           IDENTIFIED BY  "%aabb2L90";
15186: Password complexity check for the specified password failed
15188: TT-20001: Password length less than 15
The command failed.

Command> ALTER USER sampleuser_alterpw1 
           IDENTIFIED BY  "%aabb2L##mf5Fn!";

User altered.

DEFAULTプロファイルの変更

この例では、DEFAULTプロファイルのパスワード・パラメータの値を検証します。その次に、プロファイルを別の値に変更します。DEFAULTプロファイルが割り当てられているユーザーは、ユーザーがデータベースに次回接続したときに変更された値を継承します。

Command> SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND 
           resource_type='PASSWORD';
< DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 >
< DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 >
< DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED >
7 rows found.

user1ユーザーを作成しますが、プロファイルは指定しません。User1に、DEFAULTプロファイルが割り当てられます。ALTER PROFILE文を使用して、DEFAULTプロファイルのFAILED_LOGIN_ATTEMPTSパスワード・パラメータの値を5に、PASSWORD_LOCK_TIMEパスワード・パラメータの値を1に変更します。DEFAULTは予約語なので、DEFAULTを二重引用符で囲みます。user1として、毎回間違ったパスワードを指定してデータベースに5回接続します。6回目の試行時に、user1アカウントがロックされます。

Command> CREATE USER user1 IDENTIFIED BY user1;
 
User created.
Command> GRANT CONNECT TO user1;

dba_usersシステム・ビューを問い合せて、user1DEFAULTプロファイルが割り当てられていることを確認します。

Command> SELECT profile FROM dba_users WHERE username='USER1';
< DEFAULT >
1 row found.

ALTER PROFILE文を使用して、DEFAULTプロファイルを変更します。

Command> ALTER PROFILE "DEFAULT" LIMIT 
           FAILED_LOGIN_ATTEMPTS 5 
           PASSWORD_LOCK_TIME 1;
 
Profile altered.
 

dba_profilesシステム・ビューを問い合せて、値が変更されていることを確認します(太字で表示)。

Command> SELECT * FROM dba_profiles WHERE profile='DEFAULT' AND 
   resource_type='PASSWORD';
< DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 5 >
< DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, 1 >
< DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED >
7 rows found.

user1として、データベースに接続してみます。間違ったパスワードを指定します。6回目の試行時に、user1アカウントがロックされます。

Command> connect adding "uid=user1;pwd=user1_test1" as user1;
 7001: User authentication failed
The command failed.
none: Command> connect adding "uid=user1;pwd=user1_test2" as user1;
 7001: User authentication failed
The command failed.
none: Command> connect adding "uid=user1;pwd=user1_test3" as user1;
 7001: User authentication failed
The command failed.
none: Command> connect adding "uid=user1;pwd=user1_test4" as user1;
 7001: User authentication failed
The command failed.
none: Command> connect adding "uid=user1;pwd=user1_test5" as user1;
 7001: User authentication failed
The command failed.
none: Command> connect adding "uid=user1;pwd=user1_test6" as user1;
15179: the account is locked
The command failed.

プロファイルの作成後のプロファイルの変更

この例では、profile1プロファイルを作成して、パスワード・パラメータFAILED_LOGIN_ATTEMPTSPASSWORD_LIFE_TIMEPASSWORD_LOCK_TIMEおよびPASSWORD_GRACE_TIMEの値を指定します。その次に、profile1プロファイルを変更して、パスワード・パラメータPASSWORD_REUSE_TIMEおよびPASSWORD_REUSE_MAXを変更します。

Command> CREATE PROFILE profile1 LIMIT 
           FAILED_LOGIN_ATTEMPTS 3 
           PASSWORD_LIFE_TIME 90 
           PASSWORD_LOCK_TIME 30 
           PASSWORD_GRACE_TIME 10;
 
Profile created.

dba_profilesシステム・ビューを問い合せて、パスワード・パラメータの値を確認します。パスワード・パラメータPASSWORD_REUSE_TIMEおよびPASSWORD_REUSE_MAXの値は、どちらもDEFAULT (太字で表示)になっています。これらのパスワード・パラメータはCREATE PROFILE定義で指定されていないため、TimesTenは各パラメータにDEFAULTの値を割り当てます。これらのパラメータの値は、DEFAULTプロファイルの値から導出されます。

Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE1' AND
           resource_type= 'PASSWORD';
< PROFILE1, FAILED_LOGIN_ATTEMPTS, PASSWORD, 3 >
< PROFILE1, PASSWORD_LIFE_TIME, PASSWORD, 90 >
< PROFILE1, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT >
< PROFILE1, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT >
< PROFILE1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT >
< PROFILE1, PASSWORD_LOCK_TIME, PASSWORD, 30 >
< PROFILE1, PASSWORD_GRACE_TIME, PASSWORD, 10 >
7 rows found.

profile1プロファイルを変更して、PASSWORD_REUSE_TIMEパスワードに20の値を指定し、PASSWORD_REUSE_MAXパスワード・パラメータに15の値を指定します(太字で表示)。このプロファイルが割り当てられているユーザーは、パスワードを15回変更していれば、20日後に同じパスワードを再利用できます。

Command> ALTER PROFILE profile1 LIMIT 
           PASSWORD_REUSE_TIME 20 
           PASSWORD_REUSE_MAX 15;
 
Profile altered.

dba_profilesシステム・ビューを問い合せて、パスワード・パラメータの値が変更されていることを確認します(太字で表示)。

Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE1' AND 
           resource_type= 'PASSWORD';
< PROFILE1, FAILED_LOGIN_ATTEMPTS, PASSWORD, 3 >
< PROFILE1, PASSWORD_LIFE_TIME, PASSWORD, 90 >
< PROFILE1, PASSWORD_REUSE_TIME, PASSWORD, 20 >
< PROFILE1, PASSWORD_REUSE_MAX, PASSWORD, 15 >
< PROFILE1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT >
< PROFILE1, PASSWORD_LOCK_TIME, PASSWORD, 30 >
< PROFILE1, PASSWORD_GRACE_TIME, PASSWORD, 10 >
7 rows found.

ALTER REPLICATION

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

ALTER REPLICATION文では、レプリケーション要素の追加、変更、削除を行い、クラシック・レプリケーション・スキームに関連するデータベースのレプリケーション属性を変更します。

ほとんどのALTER REPLICATION処理は、レプリケーション・エージェントが停止している場合(ttAdmin -repStop)にのみサポートされます。ただし、レプリケーション・エージェントの実行中にサブスクライバ・データベースをレプリケーション・スキームに動的に追加することは可能です。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』クラシック・レプリケーション・スキームの変更に関する項を参照してください。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

ALTER REPLICATION文の構文は、次のとおりです。

ALTER REPLICATION [Owner.]ReplicationSchemeName
  ElementOperation [...] | StoreOperation |
  NetworkOperation [...]

ElementOperationを1回以上指定します。

ADD ELEMENT ElementName
  { DATASTORE | 
  { TABLE [Owner.]TableName [CheckConflicts] } | 
    SEQUENCE [Owner.]SequenceName }
  { MASTER | PROPAGATOR } FullStoreName
  { SUBSCRIBER FullStoreName [,... ] [ReturnServiceAttribute] } [ ... ] 
  { INCLUDE | EXCLUDE } { TABLE [[Owner.]TableName[,...]] | 
    SEQUENCE [[Owner.]SequenceName[,...]] } [,...]

ALTER ELEMENT { ElementName | * IN FullStoreName ]}
  ADD SUBSCRIBER FullStoreName [,...] [ReturnServiceAttribute] |
  ALTER SUBSCRIBER FullStoreName [,...]|
  SET [ReturnServiceAttribute] 
  DROP SUBSCRIBER FullStoreName [,... ]

ALTER ELEMENT * IN FullStoreName
  SET { MASTER | PROPAGATOR } FullStoreName

ALTER ELEMENT ElementName
  {SET NAME NewElementName | SET CheckConflicts}

ALTER ELEMENT ElementName 
  { INCLUDE | EXCLUDE } { TABLE [Owner.]TableName |
    SEQUENCE [Owner.]SequenceName }[,...] 

DROP ELEMENT { ElementName | * IN FullStoreName }

CheckConflictsは、TABLE要素をレプリケートした場合にのみ設定できます。構文の要件は、「CHECK CONFLICTS」を参照してください。

ReturnServiceAttributeの構文は、次のとおりです。

{ RETURN RECEIPT [BY REQUEST] | NO RETURN }

StoreOperation句:

ADD STORE FullStoreName [StoreAttribute [... ]]
ALTER STORE FullStoreName SET StoreAttribute [... ]

StoreAttributeの構文は、次のとおりです。

DISABLE RETURN {SUBSCRIBER | ALL} NumFailures
RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED
DURABLE COMMIT {ON | OFF}
RESUME RETURN Milliseconds 
LOCAL COMMIT ACTION {NO ACTION | COMMIT}
RETURN WAIT TIME Seconds
COMPRESS TRAFFIC {ON | OFF} 
PORT PortNumber 
TIMEOUT Seconds 
FAILTHRESHOLD Value
CONFLICT REPORTING SUSPEND AT Value 
CONFLICT REPORTING RESUME AT Value 
TABLE DEFINITION CHECKING {EXACT|RELAXED}

NetworkOperationを1回以上指定します。

ADD ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName
  { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost }
      PRIORITY Priority } [...] 

DROP ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName
  { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost } [...] 

パラメータ

パラメータ 説明

[Owner.]ReplicationSchemeName

クラシック・レプリケーション・スキームに割り当てる名前です。

ADD ELEMENT ElementName

新しい要素を既存のクラシック・レプリケーション・スキームに追加します。ElementNameは、30文字以下の識別子です。DATASTORE要素を使用する場合、ElementNameの最初の20文字を、他のDATASTORE要素名に対して一意にする必要があります。

要素がDATASTOREの場合、すべての表がデータベースに含まれます。データベースの一部にSEQUENCE要素が含まれる場合、その要素のRETURNサービスはこの文では変更されません。

ADD ELEMENT ElementName DATASTORE

{INCLUDE | EXCLUDE}

{TABLE [[Owner.]TableName [,...]]|

SEQUENCE [[Owner.]SequenceName[,...]]} [,...]

新しいDATASTORE要素を既存のクラシック・レプリケーション・スキームに追加します。ElementNameは、30文字以下の識別子です。DATASTORE要素を使用する場合、ElementNameの最初の20文字を、他のDATASTORE要素名に対して一意にする必要があります。

INCLUDEは、指定された表と順序のみをデータベースに含めます。INCLUDE句は、オブジェクト型(表または順序)ごとに1つ使用します。

EXCLUDEは、指定された表と順序を除外して、すべての表と順序をデータベースに含めます。EXCLUDE句は、オブジェクト型(表または順序)ごとに1つ使用します。

要素が順序の場合、RETURN属性は適用されず、競合チェックはサポートされず、循環する順序はエラーを返します。

ADD SUBSCRIBER FullStoreName

追加のサブスクライバ・データベースを指定します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

ALTER ELEMENT * IN FullStoreName

SET { MASTER | PROPAGATOR } FullStoreName

FullStoreNameMASTERまたはPROPAGATORであるすべての要素を変更します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

この構文を一連の要素名に使用すると、次の操作を実行できます。

  • サブスクライバの追加、変更、削除。

  • 要素セットのMASTERまたはPROPAGATORのステータスの設定。

変更されるデータベースの一部にSEQUENCE要素が含まれる場合、その要素のRETURNサービスはこの文では変更されません。

ALTER ELEMENT ElementName

サブスクライバが追加または削除される要素の名前です。

ALTER ELEMENT

ElementName1

SET NAME ElementName2

ElementName1ElementName2の名前に変更します。TABLE型の要素の名前のみを変更できます。

ALTER ELEMENT ElementName

{INCLUDE|EXCLUDE}

{TABLE [Owner.]TableName |

SEQUENCE [Owner.]SequenceName} [,...]

ElementNameは、変更する要素の名前です。

INCLUDEは、指定された表と順序をデータベースに追加します。INCLUDE句は、オブジェクト型(表または順序)ごとに1つ使用します。

EXCLUDEは、指定された表と順序をデータベースから削除します。EXCLUDE句は、オブジェクト型(表または順序)ごとに1つ使用します。

要素が順序の場合、RETURN属性は適用されず、競合チェックはサポートされず、循環する順序はエラーを返します。

ALTER SUBSCRIBER FullStoreName

SET RETURN RECEIPT

[BY REQUEST]|NO RETURN

RETURN RECEIPTサービスを有効化、無効化または変更するように、サブスクライバ・データベースを変更します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

CheckConflicts

データベース間でTABLE要素を双方向にレプリケートするための同時書込みで、レプリケーションの競合をチェックします。DATASTORE型の要素をレプリケートする場合は、競合をチェックできません。「CHECK CONFLICTS」を参照してください。

COMPRESS TRAFFIC {ON | OFF}

レプリケートされた通信量を圧縮して、ネットワークの帯域幅の量を削減します。ONは、STOREで定義されたデータベースに対してレプリケートされた通信量をすべて圧縮するように指定します。OFF(デフォルト)は、通信量を圧縮しないように指定します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケートされた通信量の圧縮に関する項を参照してください。

CONFLICT REPORTING SUSPEND AT Value

競合解消のレポートを一時停止します。

Valueは、負ではない整数です。競合のレポートは、競合の割合がValueを超えると一時的に停止されます。デフォルトは0です。これは、競合レポートが常にオンになり、一時停止されないことを意味します。

この句は、表レベルのレプリケーションで有効です。

CONFLICT REPORTING RESUME AT Value

競合解消のレポートを再開します。

Valueは、負ではない整数です。競合のレポートは、競合の割合がValueを下回ると再開されます。デフォルトは1です。

この句は、表レベルのレプリケーションで有効です。

DISABLE RETURN {SUBSCRIBER | ALL} NumFailures

NumFailuresで指定されているタイムアウト回数を経過した後、RETURNサービスのブロッキングを無効にするようにRETURNサービス障害ポリシーを設定します。SUBSCRIBERを選択すると、レプリケートされた更新を、指定されているタイムアウト期間内に確認できなかったサブスクライバのみにこのポリシーが適用されます。ALLを選択すると、いずれかのサブスクライバから応答がなかった場合、すべてのサブスクライバにこのポリシーが適用されます。この障害ポリシーは、RETURN RECEIPTまたはRETURN TWOSAFEサービスのいずれかで指定できます。

DISABLE RETURNが指定され、RESUME RETURNが指定されていない場合、データベースのレプリケーション・エージェントが再起動されるまでRETURNサービスはオフのままです。

DURABLE COMMIT {ON | OFF}

DurableCommits一般接続属性設定を上書きします。DURABLE COMMIT ONは、レプリケーション・エージェントが実行中か停止しているかに関係なく、永続コミットを有効にします。

DROP ELEMENT * IN FullStoreName

FullStoreNameMASTERであるすべての要素のレプリケーションの記述を削除します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

DROP ELEMENT ElementName

ElementNameのレプリケーションの記述を削除します。

DROP SUBSCRIBER FullStoreName

指定したサブスクライバ・データベースに更新が送信されないように指定します。この処理は、クラシック・レプリケーション・スキームの持つサブスクライバが1つのみの場合に失敗します。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

FAILTHRESHOLD Value

サブスクライバ・データベースのために累積できるログ・ファイルの数。この値を超えると、サブスクライバはFailedの状態に設定されます。

0を指定すると、この上限は設定されません。これがデフォルトです。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』トランザクション・ログ障害しきい値の設定に関する項を参照してください。

FullStoreName

次のいずれかとして指定されたデータベースです。

  • SELF

  • データベース・ファイル名の接頭辞

たとえば、データベースのパスがdirectory/subdirectory/data.ds0の場合、データベース名はdataになります。

この名前は、DSNの記述のDataStore属性で指定されるデータベース・ファイル名で、オプションでホストIDを次の書式で指定できます。

DataStoreName [ON Host]

Hostは、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』ネットワークの構成に関する項で説明されているように、IPアドレスまたは1つ以上のIPアドレスに割り当てられたリテラル・ホスト名です。ホスト名に特殊文字が含まれている場合は、二重引用符で囲む必要があります。たとえば、"MyHost-500"のようになります。

LOCAL COMMIT ACTION {NO ACTION | COMMIT}

タイムアウト・イベントのRETURN TWOSAFEトランザクションで実行されるデフォルトのアクションを指定します。

NO ACTION: タイムアウト時、コミット関数はアプリケーションに戻り、トランザクションをコミット・コールに入ったときと同じ状態のままにしますが、レプリケートされた表をアプリケーションが更新できない場合を除きます。アプリケーションはコミットのみを再発行できます。トランザクションはロールバックできません。これがデフォルトです。

COMMIT: タイムアウト時、コミット関数はCOMMITを実行して、トランザクションをローカルに終了しようとします。同じトランザクション上でこれ以上の処理を行うことはできません。

この設定は、localActionパラメータを指定してttRepSyncSetプロシージャをコールすることで、特定のトランザクションに対して無効にすることができます。

MASTER FullStoreName

アプリケーションで特定の要素が更新されるデータベース。更新はMASTERデータベースによってSUBSCRIBERデータベースに送信されます。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

NO RETURN

RETURNサービスを使用しないように指定します。これがデフォルトです。

RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

PORT PortNumber

このデータベースのレプリケーション・エージェントが接続をリスニングするTCP/IPポート番号です。指定しない場合は、レプリケーション・エージェントによってポート番号が自動的に割り当てられます。

相互にレプリケートするすべてのTimesTenデータベースで、同じポート番号を使用する必要があります。

PROPAGATOR FullStoreName

レプリケートされた更新を受け取って他のデータベースに渡すデータベース。

RESUME RETURN Milliseconds

DISABLE RETURNによってRETURNサービスのブロッキングが無効になった場合、この属性によって、RETURNサービスのブロッキングを再度有効にするタイミングに関するポリシーを設定します。RETURNサービスのブロッキングは、障害が発生したサブスクライバが、Millisecondsで指定された時間よりも短い間隔でレプリケートされた更新を確認するとすぐに再度有効になります。

DISABLE RETURNが指定され、RESUME RETURNが指定されていない場合、データベースのレプリケーション・エージェントが再起動されるまでRETURNサービスはオフのままです。

RETURN RECEIPT [BY REQUEST]

RETURN RECEIPTサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションを受信するまでブロックされます。

RETURN RECEIPTにより、すべてのトランザクションにサービスが適用されます。RETURN RECEIPT BY REQUESTを指定した場合は、ttRepSyncSetプロシージャを使用して、選択したトランザクションに対してRETURN RECEIPTサービスを有効にできます。RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED

レプリケーションが無効になっている場合のRETURNサービスのオンまたはオフを設定します。

OFFは、レプリケーション無効時にRETURNサービスを無効する設定であり、RETURN RECEIPTサービスのデフォルトです。ONは、レプリケーション無効時にもRETURNサービスを有効のままにできる設定であり、RETURN TWOSAFEサービスのデフォルトです。

RETURN TWOSAFE[BY REQUEST]

RETURN TWOSAFEサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションをコミットするまでブロックされます。

RETURN TWOSAFEにより、すべてのトランザクションにサービスが適用されます。RETURN TWOSAFE BY REQUESTを指定した場合は、ttRepSyncSetプロシージャを使用して、選択したトランザクションに対してRETURN RECEIPTサービスを有効にできます。RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

RETURN WAIT TIME Seconds

RETURNサービスの応答を待機する秒数を指定します。デフォルト値は10秒です。値が0(ゼロ)の場合は、タイムアウトがないことを意味します。ttRepSyncSetプロシージャにreturnWaitパラメータを設定してアプリケーションからコールすることによって、このタイムアウト設定を上書きできます。

SET {MASTER | PROPAGATOR} FullStoreName

任意のデータベースを任意の要素のMASTERまたはPROPAGATORに設定します。FullStoreNameは、データベースのファイルの基本名にする必要があります。

SUBSCRIBER FullStoreName

MASTERデータベースから更新を受け取るデータベース。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

TABLE DEFINITION CHECKING {EXACT|RELAXED}

サブスクライバで実行される表定義チェックの種類を指定します。

  • EXACT: マスターおよびサブスクライバで表が一致している必要があります。

  • RELAXED: 表には同じキー定義、列の数および列のデータ型が必要です。

デフォルトはRELAXEDです。

ノート: TABLE DEFINITION CHECKING EXACTを使用している場合、データベースを移行するにはttMigrate -exactUpgradeを使用します。TABLE DEFINITION CHECKING RELAXEDを使用している場合、データベースを移行するにはttMigrate -relaxedUpgradeを使用します。

TIMEOUT Seconds

レプリケーション・エージェントがリモート・レプリケーション・エージェントからの応答を待機する最大時間(秒)。デフォルトは120秒です。

ノート: リモート・レプリケーション・エージェントからの応答の遅延の原因となる大規模なトランザクションの場合、エージェントは、トランザクションのサイズに基づいて、必要に応じてタイムアウトを次第に大きい値にスケーリングします。大規模なトランザクションに対してTIMEOUTを60秒以下に設定した場合、このスケーリングは行われず、エージェントは応答の待機をタイムアウトします。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』リモート・レプリケーション・エージェントからの応答タイムアウトの待機設定に関する項も参照してください。

ADD ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName

レプリケーション・スキームにNetworkOperationを追加します。各サブスクライバ・ストアへのすべてのアウトバウンド接続に対してマスター・ストアが使用するネットワーク・インタフェースを制御できます。

複数回指定できます。

FullStoreNameには、ON "host"を指定する必要があります。

DROP ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName

クラシック・レプリケーション・スキームからNetworkOperationを削除します。

複数回指定できます。

FullStoreNameには、ON "host"を指定する必要があります。

MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost

MasterHostおよびSubscriberHostは、マスターおよびサブスクライバ・ストアのネットワーク・インタフェースのIPアドレスです。IPV6のドット表記または正規形式で指定するか、あるいはコロン表記で指定します。

句は複数回指定できます。ADDおよびDROP ROUTE MASTERの両方に対して有効です。

PRIORITY Priority

1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。

NetworkOperation 句の構文で必須です。MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost句の後ろに記述します。

説明

  • ALTER ELEMENT DROP SUBSCRIBERは、特定のレプリケーション要素のサブスクライバを削除します。

  • レプリケーション要素の名前が、別のデータベースにすでに定義されているレプリケーション要素の名前と競合する場合は、ALTER ELEMENT SET NAMEを使用してレプリケーション要素の名前を変更できます。SET NAMEでは* IN FullStoreNameは使用できません。FullStoreNameは、データベースのファイルの基本名である必要があります。たとえば、データベースのファイル名がdata.ds0の場合、ファイルの基本名はdataになります。

  • ALTER ELEMENT SET MASTERを使用して、レプリケーション要素のマスター・データベースを変更できます。MASTER操作には、* IN FullStoreNameオプションを使用する必要があります。つまり、マスター・データベースは、そのレプリケーション要素すべての所有権を送信して、マスター・ロールを完全に放棄する必要があります。通常、このオプションは、(共通の)MASTERの障害の後に、SUBSCRIBERデータベースで要求されるALTER REPLICATION文で使用します。

  • マスター要素の所有権をサブスクライバに送信するには、次の手順を実行します。

    1. レプリケートされた各表に対してALTER REPLICATION DROP ELEMENTを実行し、レプリケートされた要素を手動で削除します。

    2. 新しく指定したMASTER/SUBSCRIBERロールを付けてALTER REPLICATION ADD ELEMENTを使用して、各表をレプリケーション・スキームに追加します。

  • ALTER REPLICATION ALTER ELEMENT SET MASTERでは、以前のマスターは自動的にはサブスクライバとしてスキームに保持されません。保持する必要がある場合は、ALTER REPLICATION ALTER ELEMENT ADD SUBSCRIBER文を実行します。

    ノート:

    ALTER ELEMENT DROP MASTERという文はありません。各レプリケーション要素のMASTERデータベースは1つのみである必要があり、現在指定されているMASTERはレプリケーション・スキームから削除できません。

  • NetworkOperation 句を使用する前に、レプリケーション・エージェントを停止してください。

  • 次のレプリケーション・スキームはALTER REPLICATION文で変更できません。

    • アクティブ・スタンバイ・ペア。かわりに、ALTER ACTIVE STANDBY PAIRを使用します。

    • クラスタウェア管理のアクティブ・スタンバイ・ペア。かわりに、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』スキーマの変更に関する項で説明されているタスクを実行します。

この例では、データベースwest上で更新してデータベースeastにレプリケートする追加の表westleadsのクラシック・レプリケーション・スキームを設定します。

ALTER REPLICATION r1
   ADD ELEMENT e3 TABLE westleads
     MASTER west ON "westcoast"
     SUBSCRIBER east ON "eastcoast";

この例では、表westleadsにサブスクライバ(backup)を追加します。

ALTER REPLICATION r1
   ALTER ELEMENT e3
     ADD SUBSCRIBER backup ON "backupserver";

この例では、表westleadsの要素名をe3からnewelementnameに変更します。

ALTER REPLICATION r1
   ALTER ELEMENT e3
     SET NAME newelementname;

この例では、現在のマスターwestのすべての要素について、newwestをマスターに指定します。

ALTER REPLICATION r1
   ALTER ELEMENT * IN west
     SET MASTER newwest;

この要素は、eastのポート番号を変更します。

ALTER REPLICATION r1
   ALTER STORE east ON "eastcoast" SET PORT 22251;

この例では、my.tab1表をmy.rep1レプリケーション・スキームのds1データベース要素に追加します。

ALTER REPLICATION my.rep1
  ALTER ELEMENT ds1 DATASTORE
     INCLUDE TABLE my.tab1;

この例では、ds1データベースをmy.rep1レプリケーション・スキームに追加します。データベースにmy.tab2表を含めます。

ALTER REPLICATION my.rep1
  ADD ELEMENT ds1 DATASTORE
     MASTER rep2
     SUBSCRIBER rep1, rep3
     INCLUDE TABLE my.tab2;

この例では、ds2データベースをレプリケーション・スキームに追加しますが、my.tab1表は除外されます。

ALTER REPLICATION my.rep1
  ADD ELEMENT ds2 DATASTORE
     MASTER rep2
     SUBSCRIBER rep1
     EXCLUDE TABLE my.tab1;

NetworkOperation句を追加します。

ALTER REPLICATION r
ADD ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2"
MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2"
    PRIORITY 1
MASTERIP "3.3.3.3" PRIORITY 2 SUBSCRIBERIP "4.4.4.4" PRIORITY 2;

NetworkOperation句を削除します。

ALTER REPLICATION r
DROP ROUTE MASTER repl ON "machine1" SUBSCRIBER rep2 ON "machine2"
MASTERIP "1.1.1.1" SUBSCRIBERIP "2.2.2.2"
MASTERIP "3.3.3.3" SUBSCRIBERIP "4.4.4.4";

関連項目

データベースから表を削除するには、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』クラシック・レプリケーション・スキーム内のレプリケートされた表の変更に関する項を参照してください。

ALTER SEQUENCE

この文は、TimesTen Scaleoutのみでサポートされています。

ALTER SEQUENCE文を使用して、順序のバッチ値を変更します。

必要な権限

順序の所有者に必要な権限はありません。

別のユーザーの順序に対するALTER ANY SEQUENCE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

ALTER SEQUENCE [Owner.]SequenceName BATCH BatchValue

パラメータ

パラメータ 説明

SEQUENCE [Owner.]SequenceName

変更する順序の名前。

BATCH BatchValue

TimesTen Scaleoutのみで有効です。グリッドの各要素に格納される一意の順序値の範囲を構成します。デフォルト値は1000万です。

説明

  • この文を使用して、TimesTen Scaleoutの順序のバッチ値を変更します。変更は、将来の順序番号に影響します。

  • この文では、CREATE SEQUENCE文でサポートされている他の値は変更できません。この場合は、DROP SEQUENCE文を使用してから、同じ名前の順序を新規作成します。たとえば、MINVALUEを変更する場合、順序を削除し、同じ名前で必要なMINVALUEを持つ順序を再度作成します。

詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』順序の使用方法に関する項を参照してください。

順序のバッチ値の変更:

ALTER SEQUENCE myseq BATCH 2000;
Sequence altered

ALTER SESSION

ALTER SESSION文は、セッション・パラメータを動的に変更します。これは、現在のセッションの同等の接続属性の設定を上書きします(適用可能な場合)。

必要な権限

なし

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。ただし、これらのパラメータはサポートされていません。

  • DDL_REPLICATION_ACTION

  • DDL_REPLICATION_LEVEL

  • REPLICATION_TRACK

SQL構文

ALTER SESSION SET
  {COMMIT_BUFFER_SIZE_MAX = n |
   DDL_REPLICATION_ACTION={'INCLUDE'|'EXCLUDE'} | 
   DDL_REPLICATION_LEVEL={1|2|3} |
   ISOLATION_LEVEL = {SERIALIZABLE | READ COMMITTED} |
   NLS_SORT = {BINARY| SortName} |
   NLS_LENGTH_SEMANTICS = {BYTE|CHAR} |
   NLS_NCHAR_CONV_EXCP = {TRUE|FALSE} |
   PLSQL_TIMEOUT = n |
   PLSQL_OPTIMIZE_LEVEL = {0|1|2|3}|
   PLSQL_CONN_MEM_LIMIT = n |
   PLSQL_CCFLAGS = 'name1:value1, name2:value2,..., nameN:valueN' |
   PLSQL_SESSION_CACHED_CURSORS = n |
   REPLICATION_TRACK = TrackNumber |
   } 

パラメータ

パラメータ 説明

COMMIT_BUFFER_SIZE_MAX= n

接続の実行中に、コミット・バッファの最大サイズを変更します。nは整数で表現され、コミット・バッファの最大サイズ(MB)を示します。

変更は次のトランザクションから有効になります。

ttConfiguration組込みプロシージャをコールして、現在構成されているコミット・バッファの最大サイズを確認します。0を指定すると、デフォルト・サイズでバッファが設定されます。デフォルト・サイズは128KBです。

コミット・バッファおよびトランザクションの再利用操作の詳細は、『Oracle TimesTen In-Memory Databaseオペレーションガイド』トランザクションの再利用操作に関する項、および『Oracle TimesTen In-Memory Databaseリファレンス』CommitBufferSizeMaxに関する項を参照してください。

ノート: 同等の接続属性はCommitBufferSizeMaxです。

DDL_REPLICATION_ACTION={'INCLUDE'|'EXCLUDE'}

表または順序のいずれかの作成時に表または順序をアクティブ・スタンバイ・ペアに含めるには、DDL_REPLICATION_ACTIONINCLUDEに設定します。表または順序のいずれかの作成時に表または順序をアクティブ・スタンバイ・ペアに含めない場合は、DDL_REPLICATION_ACTIONEXCLUDEに設定します。デフォルトはINCLUDEです。

EXCLUDEに設定した場合:

  • 表をレプリケーション・スキームに追加するには、後でALTER ACTIVE STANDBY PAIR ... INCLUDE TABLEをアクティブ・データベースで実行する必要があります。この文を実行すると表の内容は切り捨てられるため、すべての表がすべてのアクティブ・スタンバイ・データベースおよびサブスクライバで空である必要があります。

  • 順序をレプリケーション・スキームに追加するには、後でALTER ACTIVE STANDBY PAIR ... INCLUDE SEQUENCEをアクティブ・データベースで実行する必要があります。

この属性が有効なのは、DDL_REPLICATION_LEVELが2以上の場合のみです。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

ノート: 同等の接続属性はDDLReplicationActionです。

DDL_REPLICATION_LEVEL={1|2|3}

DDLがアクティブ・スタンバイ・ペアのすべてのデータベースにわたってレプリケートされるかどうかを指定します。値は次のいずれかです。

  • 1: デフォルト。ALTER TABLEを使用して、アクティブ・データベースのレプリケートされる表に対して列を追加または削除します。変更は、スタンバイ・データベースの表にレプリケートされます。

  • 2: アクティブ・データベースからスタンバイ・データベースへの、表、シノニムまたは索引の作成または削除のレプリケーションをサポートします。これには、グローバル一時表の作成または削除は含まれますが、CREATE TABLE AS SELECTは含まれません。この文は、空の表に索引が作成された場合にのみレプリケートされます。

  • 3: レベル2でサポートされているすべてのDDLのレプリケーション、ビューと順序(マテリアライズド・ビューは含まれません)の作成または削除のレプリケーションをサポートし、ttCacheUidPwdSet組込みプロシージャをコールすると、キャッシュ管理ユーザーIDおよびパスワードの設定を変更します。

    ノート: キャッシュ・グループを定義した後に、キャッシュ管理ユーザーIDを変更することはできませんが、キャッシュ管理パスワードは変更できます。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

ノート: 同等の接続属性はDDLReplicationLevelです。

ISOLATION_LEVEL = {SERIALIZABLE|READ COMMITTED}

分離レベルを設定します。変更は次のトランザクションから有効になります。

分離レベルの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』トランザクションの分離レベルに関する項を参照してください。

ノート: 同等の接続属性はIsolationです。

NLS_SORT={BINARY| SortName}

言語の比較に使用する照合の順序を示します。

大/小文字を区別しないソートの場合またはアクセントを区別しないソートの場合は、BINARYまたはSortName値に_CIまたは_AIを追加します。

NLS_SORTを指定しない場合、デフォルトはBINARYです。

SortNameでサポートされる値の完全なリストは、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』言語ソートに関する項を参照してください。

大/小文字を区別しないソートまたはアクセントを区別しないソートの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』大/小文字を区別しない言語ソートまたはアクセントを区別しない言語ソートに関する項を参照してください。

NLS_LENGTH_SEMANTICS ={BYTE|CHAR}

長さセマンティクス構成のデフォルトを設定します。BYTEはバイト長セマンティクスを示します。CHARは文字長セマンティクスを示します。デフォルトはBYTEです。

長さセマンティクスの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』長さセマンティクスおよびデータ記憶域に関する項を参照してください。

NLS_NCHAR_CONV_EXCP = {TRUE|FALSE}

NCHAR/NVARCHAR2データとCHAR/VARCHAR2データ間でキャラクタ・タイプの暗黙的または明示的な変換中にデータの損失があった場合に、エラーを報告するかどうかを指定します。TRUEを指定するとエラーが報告されます。FALSEを指定するとエラーは報告されません。デフォルトは、FALSEです。

PLSQL_TIMEOUT= n

PL/SQLプロシージャが自動的に終了されるまでの実行時間を制御します。nは時間(秒)を表します。0(時間制限なし)または正の整数を指定します。デフォルトは30です。

この値を変更すると、新しい値は、現在実行しているPL/SQLプログラム・ユニットおよび同じ接続でこの後実行される他のすべてのプログラム・ユニットに影響します。

タイムアウト値の設定の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』SQLおよびPL/SQLのタイムアウト値の選択に関する項を参照してください。

PLSQL_OPTIMIZE_LEVEL = {0|1|2|3}

PL/SQLライブラリ・ユニットのコンパイルに使用する最適化レベルを指定します。設定値が高いほど、コンパイラでPL/SQLライブラリ・ユニットを最適化するのに多くの処理が必要になります。可能な値は0、1、2または3です。デフォルトは2です。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』PLSQL_OPTIMIZE_LEVELに関する項を参照してください。

PLSQL_CONN_MEM_LIMIT = n

この接続でPL/SQLが使用できるプロセス・ヒープ・メモリーの最大量を指定します。nは整数(MB単位)です。デフォルトは100です。

詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』PLSQL_CONN_MEM_LIMITに関する項を参照してください。

PLSQL_CCFLAGS = 'name1:value1, name2:value2, ..., nameN:valueN'

PL/SQLユニットの条件付きコンパイルを制御する問合せディレクティブを指定し、確認する条件に応じて、PL/SQLプログラムの機能をカスタマイズできます。たとえば、デバッグ機能をアクティブ化するには、次のようにします。

PLSQL_CCFLAGS = 'DEBUG:TRUE'

PLSQL_SESSION_CACHED_CURSORS= n

キャッシュするセッション・カーソルの最大数を指定します。デフォルトは50です。値の範囲は1から65535です。

TimesTenのPLSQL_SESSION_CACHED_CURSORS設定の動作は、Oracle RDBMSのSESSION_CACHED_CURSORS設定と同じです。

REPLICATION_TRACK = TrackNumber

追跡ベース・パラレル・レプリケーションを管理している場合は、レプリケーション追跡に接続を割り当てることができます。接続によって発行されたすべてのトランザクションは、追跡が変更されないかぎり、この追跡に割り当てられます。

指定された番号が、存在しないレプリケーション・トラックXに対してである場合、トランザクションはXReplicationParallelismで割った余りとして計算されたトラック番号に割り当てられます。

先行する操作がすべて読取り操作だった場合を除き、トランザクションの途中でトラックを変更することはできません。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』自動パラレル・レプリケーション環境内のレプリケーション・トラックの指定に関する項を参照してください。

同等の接続属性はReplicationTrackです。

説明

  • ALTER SESSION文は、そのセッションで次に実行されるコマンドから作用します。ALTER SESSIONは暗黙的なコミットを実行しません。

  • クライアント・フェイルオーバーの場合、ALTER SESSION文が失敗した接続で発行された場合は、その設定は表示されず、新しい接続に継承されます。ALTER SESSION文を再発行して、そのパラメータの値を再指定する必要があります。クライアント・フェイルオーバーの詳細は、TimesTen Classicの場合は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』自動クライアント・フェイルオーバーの使用に関する項を参照してください。また、TimesTen Scaleoutの場合は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』クライアント接続のフェイルオーバーに関する項を参照してください。

  • 文字比較を含む演算では、言語を区別する照合順番がサポートされています。大/小文字を区別しないソートは、DISTINCT値の解釈に影響することがあります。

  • CHARNCHAR間の暗黙的および明示的な変換がサポートされています。

  • サポートされている文字セットで、SQL文字列関数を使用できます。たとえば、UPPERおよびLOWER関数では、ASCII以外のCHARおよびVARCHAR2文字とNCHARおよびNVARCHAR2文字がサポートされています。

  • 選択した文字セットによっては、CHARおよびVARCHAR2列のデータに対するメモリー消費に影響する可能性があります。

  • レプリケーション・スキームに含まれるすべてのデータベースの文字セットが一致している必要があります。

  • 既存の表をアクティブ・スタンバイ・ペアに追加するには、DDL_REPLICATION_LEVELを2以上に設定し、DDL_REPLICATION_ACTIONINCLUDEに設定します。または、DDL_REPLICATION_ACTIONEXCLUDEに設定されている場合は、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE文を使用できます。この場合、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE文を実行すると表の内容は切り捨てられるため、この文を実行する前に、表は空であり、すべてのデータベースに存在している必要があります。

  • 既存の順序またはビューをアクティブ・スタンバイ・ペアに追加するには、DDL_REPLICATION_LEVELを3に設定します。順序をレプリケーション・スキームに含めるには、DDL_REPLICATION_ACTIONINCLUDEに設定する必要があります。これは、マテリアライズド・ビューには適用されません。

  • オブジェクトは、受信側データベースがそのレベルのレプリケーションをサポートするTimesTenリリースであり、アクティブ・スタンバイ・ペアのレプリケーション・スキーム用に構成されている場合にのみレプリケートされます。たとえば、11.2.2.7.0より前のデータベース・リリースへの順序のレプリケーション(DDL_REPLICATION_LEVEL=3が必要)は、サポートされません。受信側データベースは、DDL_REPLICATION_LEVEL=2でサポートされているオブジェクトのレプリケーション用に、リリース11.2.1.8.0以上である必要があります。

ALTER SESSION文を使用してCOMMIT_BUFFER_SIZE_MAXを500MBに設定します。まず、ttConfigurationをコールして現在の接続設定を表示します。ALTER SESSION文を使用して、COMMIT_BUFFER_SIZE_MAXを500に変更します。ttConfigurationをコールして、新しい設定を表示します。

Command>  CALL ttConfiguration ('CommitBufferSizeMax');
< CommitBufferSizeMax, 0 >
1 row found.
Command> ALTER SESSION SET COMMIT_BUFFER_SIZE_MAX = 500;
 
Session altered.
 
Command> CALL ttConfiguration ('CommitBufferSizeMax');
< CommitBufferSizeMax, 500 >
1 row found.

ALTER SESSION文を使用して、PLSQL_TIMEOUTを60秒に変更します。2つ目のALTER SESSION文を使用して、PLSQL_OPTIMIZE_LEVELを3に変更します。次に、ttConfigurationをコールして新しい値を表示します。

Command> ALTER SESSION SET PLSQL_TIMEOUT = 60;
Session altered.
Command> ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL = 3;
Session altered.

Command> CALL TTCONFIGURATION ();
< CkptFrequency, 600 >
< CkptLogVolume, 0 >
< CkptRate, 0 >
...
< PLSQL_OPTIMIZE_LEVEL, 3 >
< PLSQL_TIMEOUT, 60 >
...
47 rows found.

この例では、PLSQL_TIMEOUTを20秒に設定します。無限にループするプログラムを実行してみます。20秒で実行が終了し、エラーが戻されます。

Command> ALTER SESSION SET PLSQL_TIMEOUT = 20;

Command> DECLARE v_timeout NUMBER;
         BEGIN
           LOOP
             v_timeout :=0;
             EXIT WHEN v_timeout < 0;
           END LOOP;
         END;
         /
 8509: PL/SQL execution terminated; PLSQL_TIMEOUT exceeded

次の例では、ALTER SESSION文を使用してNLS_SORT設定をBINARYからBINARY_CIに変更し、さらにBINARY_AIに変更しています。データベースおよび接続の文字セットはWE8ISO8859P1です。

Command> connect "dsn=cs;ConnectionCharacterSet=WE8ISO8859P1";
Connection successful: DSN=cs;UID=user;DataStore=/datastore/user/cs;
DatabaseCharacterSet=WE8ISO8859P1;
ConnectionCharacterSet=WE8ISO8859P1;PermSize=32;
(Default setting AutoCommit=1)
Command> -- Create the Table
Command> CREATE TABLE collatingdemo (letter VARCHAR2 (10));
Command> -- Insert values
Command> INSERT INTO collatingdemo VALUES ('a');
1 row inserted.
Command> INSERT INTO collatingdemo VALUES ('A');
1 row inserted.
Command> INSERT INTO collatingdemo VALUES ('Y');
1 row inserted.
Command> INSERT INTO collatingdemo VALUES ('ä');
1 row inserted.
Command> -- SELECT
Command> SELECT * FROM collatingdemo;
< a >
< A >
< Y >
< ä >
4 rows found.
Command> --SELECT with ORDER BY
Command> SELECT * FROM collatingdemo ORDER BY letter;
< A >
< Y >
< a >
< ä >
4 rows found.
Command>-- set NLS_SORT to BINARY_CI and SELECT
Command> ALTER SESSION SET NLS_SORT = BINARY_CI;
Command> SELECT * FROM collatingdemo ORDER BY letter;
< a >
< A >
< Y >
< Ä >
< ä >
4 rows found.
Command> -- Set NLS_SORT to BINARY_AI and SELECT
Command> ALTER SESSION SET NLS_SORT = BINARY_AI;
Command> SELECT * FROM collatingdemo ORDER BY letter;
< ä >
< a >
< A >
< Y >
4 rows found.

次の例では、コミット依存性を無効にした自動パラレル・レプリケーションを有効にします。ALTER SESSION文を使用して、現在の接続のレプリケーション・トラック数を5に変更します。レプリケーション・スキームのコミット依存性を無効にした自動パラレル・レプリケーションを有効にするには、ReplicationApplyOrderingを2に設定します。次に、REPLICATION_TRACKは常にReplicationParallelism以下の番号に設定します。たとえば、ReplicationParallelism接続属性を、REPLICATION_TRACKに設定された値である5よりも大きい6に設定できます。

Command> ALTER SESSION SET REPLICATION_TRACK = 5;
Session altered.

次の例では、変更スタンバイ・レプリケーション・ペアのアクティブ・データベースでDDL_REPLICATON_LEVEL2に設定し、DDLReplicationAction'INCLUDE'に設定して、列、表、シノニムおよび索引の追加および削除のレプリケーションを有効にします。

Command > ALTER SESSION SET DDL_REPLICATION_LEVEL=2;
Session altered.

Command > ALTER SESSION SET DDL_REPLICATION_ACTION='INCLUDE';
Session altered.

ノート:

DDL_REPLICATION_LEVELおよびDDL_REPLICATION_ACTIONの同等の接続属性は、それぞれDDLReplicationLevelおよびDDLReplicationActionです。

ALTER TABLE

ALTER TABLE文は、既存の表定義を変更します。

ALTER TABLE文は、TimesTen ScaleoutおよびTimesTen Classicでサポートされています。ただし、構文とセマンティクスでは違いがあります。わかりやすくするために、サポートされている構文、パラメータ、説明(セマンティクス)およびTimesTen ScaleoutとTimesTen Classicの例は、TimesTen Scaleoutでの使用方法とTimesTen Classicでの使用方法に分けられています。使用方法に繰返しがありますが、構文からパラメータへ進み、セマンティクスから各使用方法の例に進むことができるように、このような方法で示されています。

必要な権限セクションを確認してから、次を確認してください。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合はALTER ANY TABLEが必要です。

ALTER TABLE...ADD FOREIGN KEYの場合、変更される表の所有者に、外部キー句で参照される表のREFERENCES権限が必要です。

この項を確認した後、次を参照してください。

ALTER TABLEのSQL構文: TimesTen Scaleout

TimesTen Scaleoutでの分散キーの変更:

ALTER TABLE [Owner.]TableName DistributionClause

主キー制約を追加して、オプションでグローバル索引またはローカル索引を指定するには:

ノート: (CreateIndexStmt)は、TimesTenのCREATE INDEX文を表すために使用する句です。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
  PRIMARY KEY (ColumnName [,... ]) [(UsingIndexClause2)]

UsingIndexClause2::= USING INDEX {GLOBAL|LOCAL} [USE HASH INDEX PAGES=RowPages|CURRENT]|
USING INDEX (CreateIndexStmt)

ノート:

ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。

列に一意制約を追加して、オプションでグローバル索引またはローカル索引を指定するには:

ノート: (CreateIndexStmt)は、TimesTenのCREATE INDEX文を表すために使用する句です。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE Owner.]TableName
ADD UNIQUE (ColumnName)
[UsingIndexClause1]

UsingIndexClause1::= USING INDEX {GLOBAL | LOCAL}| USING INDEX (CreateIndexStmt)

1つの列の追加:

ALTER TABLE [Owner.]TableName 
  ADD [COLUMN] ColumnName ColumnDataType
    [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL]
  [COMPRESS (CompressColumns [,...])]

複数の列の追加:

ALTER TABLE [Owner.]TableName 
 ADD (ColumnName ColumnDataType 
     [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [,... ] )

NOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD [COLUMN] ColumnName ColumnDataType
    NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE]

複数のNOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD (ColumnName ColumnDataType
    NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [,...])

列の削除。

ALTER TABLE [Owner.]TableName 
  DROP {[COLUMN] ColumnName | (ColumnName [,... ] )}

外部キーおよびON DELETE CASCADE(オプション)の追加:

ALTER TABLE [Owner.]TableName 
ADD [CONSTRAINT ForeignKeyName] FOREIGN KEY
    (ColumnName [,...]) REFERENCES RefTableName
       [(ColumnName [,...])] [ON DELETE CASCADE]

外部キーの削除:

ALTER TABLE [Owner.]TableName 
DROP CONSTRAINT ForeignKeyName

ハッシュ索引のサイズ変更:

ALTER TABLE [Owner.]TableName
SET PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更:

ALTER TABLE [Owner.]TableName
USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をUSE RANGE INDEX句で範囲索引に変更するには、次のように実行します。

ALTER TABLE [Owner.]TableName
USE RANGE INDEX

列のデフォルト値の変更:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT DefaultVal)

列の一意制約を削除するには:

ALTER TABLE Owner.]TableName
DROP UNIQUE (ColumnName)

NULL値可能な列のデフォルト値をNULLに変更することによるデフォルト値の削除:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT NULL)

ALTER TABLE ADD CONSTRAINT PRIMARY KEYのパラメータ: TimesTen Scaleout

パラメータ 説明
ALTER TABLE [Owner.]TableName ALTER TABLE文の冒頭部分。表の名前は必須です。所有者はオプションです。
ADD CONSTRAINT ConstraintName PRIMARY KEY 主キー制約の追加によって表が変更されることを示す句。ConstraintNameは、制約の名前です。主キー制約は追加すると削除できなくなります。表を削除する必要があります。
(ColumnName [,…]) (ColumnName)は必須です。主キー制約に使用する列を指定します。
[UsingIndexClause2] UsingIndexClause2はオプションです。説明は、この表の残りの部分に示します。ALTER TABLEの定義には、2つのUSING INDEX句を指定できません。
USING INDEX {GLOBAL|LOCAL} [UsingIndexClause2]の一部: 指定することで、主キーにグローバル索引またはローカル索引を作成するかどうかを示します。
USE HASH INDEX PAGES = RowPages|CURRENT USING INDEX {GLOBAL|LOCAL}句の一部であり、オプションです。指定することで、主キーに一意のハッシュ索引を作成することを示します。指定しないと、一意の範囲索引が作成されます。グローバル索引とローカル索引の両方に使用できます。

PAGES句は必須です。表に想定されるページ数の値を指定できます。

RowPagesを指定すると、ページ数の値の計算にページの数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPages1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

USING INDEX (CreateIndexStmt) [UsingIndexClause2]句の一部。このUSING INDEX句が指定されている場合、(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE ADD UNIQUE CONSTRAINTのパラメータ: TimesTen Scaleout

パラメータ 説明
ALTER TABLE [Owner.]TableName ALTER TABLE文の冒頭部分。表の名前は必須です。所有者はオプションです。
ADD UNIQUE (ColumnName [,…]) 一意制約の追加によって表が変更されることを示す句。(ColumnName)は必須です。一意制約に使用する列を指定します。
[UsingIndexClause1] UsingIndexClause1はオプションです。説明は、この表の残りの部分に示します。ALTER TABLEの定義には、2つのUSING INDEX句を指定できません。この句を使用すると、PRIMARY KEYに対するグローバル索引またはローカル索引を定義できます
USING INDEX {GLOBAL|LOCAL} [UsingIndexClause1]句の一部。指定することで、一意制約にグローバル索引またはローカル索引を作成するかどうかを示します。
USING INDEX (CreateIndexStmt) [UsingIndexClause1]句の一部。このUSING INDEX句が指定されている場合、(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLEの追加パラメータ: TimesTen Scaleout

パラメータ 説明

[Owner.] TableName

変更する表を指定します。

DistributionClause

構文の詳細は、「CREATE TABLE」を参照してください。

UNIQUE

ColumnNameの各行の値が一意である必要があることを示します。

MODIFY

指定した列の属性を新しい値に変更します。

DEFAULT [DefaultVal |NULL]

列がデフォルト値(DefaultVal)を持つことを指定します。NULLを指定すると、列のデフォルト値が削除されます。デフォルト値にSYSDATEを指定した列を追加すると、既存の行の列の値のみが、列が追加された時点のシステム日付になります。デフォルト値がUSER関数の1つである場合、列の値はALTER TABLE文を実行したセッションのユーザーの値になります。現在、ROWIDデータ型のデフォルト値を割り当てることはできません。

列のデフォルト値を変更しても、既存の行は変更されません。

ノート: レプリケーション・スキームの一部である表にNOT NULL列を追加するには、DDL_REPLICATON_LEVELが3以上である必要があります。

ColumnName

ALTER TABLE文に含める列の名前。新しい列に、既存の列または別の新しい列と同じ名前を指定することはできません。NOT NULL列を追加する場合は、DEFAULT句を含める必要があります。

ColumnDataType

追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

NOT NULL [ENABLE]

列を追加する場合に、NOT NULLを指定できます。NOT NULLを指定する場合は、DEFAULT句を含める必要があります。任意で、NOT NULL句の後にENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

CONSTRAINT

外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。

DROP UNIQUE (ColumnName) 一意制約が削除されることを示します。ColumnNameは、制約の名前です。

ForeignKeyName

追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかをDROP FOREIGN KEY句で指定できます。

FOREIGN KEY

外部キーを追加することを指定します。

REFERENCES

外部キーが別の表を参照することを指定します。

RefTableName

外部キーが参照する表の名前です。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句はSET PAGES句と同じです。

USE RANGE INDEX

主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。

SET PAGES = RowPages | CURRENT

表の想定ページ数に基づいてハッシュ索引のサイズを変更します。CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Scaleout」を参照してください。

ALTER TABLE ADD PRIMARY KEYの説明: TimesTen Scaleout

ALTER TABLEの定義には、PRIMARY KEY句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
  • USING INDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USING INDEX {GLOBAL | LOCAL}句の後にオプションでUSE HASH INDEX句を指定できます。

  • USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ノート:

ALTER TABLEの定義では、USING INDEX {GLOBAL | LOCAL}USING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。

グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLE ADD UNIQUEの説明: TimesTen Scaleout

ALTER TABLEの定義には、UNIQUE句の後に追加の句を指定するオプションがあります。この句を使用すると、一意制約に対するグローバル索引またはローカル索引を指定できます。
  • USING INDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。

  • USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。一意制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください。

ノート:

ALTER TABLEの定義では、USING INDEX {GLOBAL | LOCAL}USING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。

グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。

ALTER TABLEの追加情報: TimesTen Scaleout

  • 表を変更してデフォルトを変更したり、列と制約を追加および削除できます。ただし、表が空でない場合は、分散スキームを変更できません。また、DISTRIBUTE BY REFERENCE句で指定された制約は削除できません。分散スキームの詳細は、「CREATE TABLE」を参照してください。詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』表の変更に関する項を参照してください。

  • ALTER TABLE文を使用して一時表を変更することはできません。

  • ALTER TABLE ADD [COLUMN] ColumnName文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。

  • マテリアライズド・ビューから参照されている列は削除できません。

  • 列の追加、列の削除、およびキャッシュ・グループ表の制約の追加にALTER TABLE文は使用できません。

  • 追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。

  • 表にALTERを実行して、デフォルト値を持つNOT NULL列を追加します。DEFAULT句は必須です。次の制限があります。

    • この列を主キー列として使用することはできません。具体的には、ALTER TABLE ADD ConstraintName PRIMARY KEY (ColumnName [,...])文では、その列を指定できないということです。

  • 新しい列に対してデフォルト値が指定されている場合を除き、追加されるすべての列の初期値はNULLです。

  • 表の列の合計数は1000以下です。また、表のパーティションの合計数は1000以下であり、そのうちの1つはTimesTenによって使用されます。

  • グローバル一時表でADD CONSTRAINT ... PRIMARY KEY句を指定しないでください。

  • ALTER TABLE ADD文の結果として、問合せ時に新しい各パーティションに対して追加の読取りが発生します。このため、変更された表のパフォーマンスがわずかに悪化することがあります。パフォーマンスを回復するには、表を削除して再作成するか、またはttMigrate create -c -relaxedUpgradeコマンドを使用してから、ttRestore -r -relaxedUpgradeコマンドを使用して表をリストアします。追加された列を削除しても、悪化したパフォーマンスは回復されず、パーティションの数も減りません。

  • ALTER TABLE DROP文を使用して既存の表から1つ以上の列を削除すると、削除された列は、表の現在のすべての行から削除されます。それ以降のSQL文では、削除した列は使用できなくなります。表の主キーに含まれている列は削除できません。また、表の外部キーに含まれている列も、すべての外部キーを削除しないかぎり削除できません。索引付けされた列は、列の索引をすべて削除しないかぎり削除できません。ALTER TABLEを使用して表の列をすべて削除することはできません。かわりにDROP TABLEを使用します。

  • 表から列が削除された場合、その表を参照するすべてのコマンドを再コンパイルする必要があります。削除された列が参照されると、再コンパイル時にエラーが発生することがあります。アプリケーションはそのコマンドを再度準備し、パラメータと結果列を再作成する必要があります。列が表に追加された場合、SELECT *文を含むコマンドは無効になります。これらのコマンドのみを再度準備する必要があります。その他のすべてのコマンドは、想定したとおりに動作します。

  • 列を削除しても、列の領域は解放されません。

  • UNIQUE制約を追加すると、(領域の増加および処理時間の増加という点で)オーバーヘッドが発生します。これは、UNIQUE制約を維持するための索引が作成されるためです。UNIQUE制約を維持するために使用している索引を、DROP INDEX文を使用して削除することはできません。

  • UNIQUE制約とそれに関連付けられている索引は、レプリケートされた表の一意索引として使用されている場合、削除できません。

  • アプリケーションで表の主キーに対して範囲問合せを実行する場合は、ALTER TABLE...USE RANGE INDEXを使用します。

  • アプリケーションで表の主キーに対して完全一致検索を実行する場合は、ALTER TABLE...USE HASH INDEXを使用します。

  • 表に主キーがない場合、USE HASH INDEX句またはUSE RANGE INDEX句を指定すると、エラーが生成されます。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

  • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。

    • deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADE: 第2のルールも適用されます。

  • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • ALTER TABLE ADD/DROP CONSTRAINT文には、次の制限があります。

    • 外部キーが削除されると、TimesTenでは外部キーに関連付けられている索引も削除されます。通常のDROP INDEX文を使用して外部キーに関連付けられている索引を削除しようとすると、エラーになります。

    • 外部キーは、ビューまたは一時表では追加または削除できません。

    • ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。

例: TimesTen Scaleoutのグローバル索引を使用した主キー制約の追加

次に示す例は、ALTER TABLE ADD PRIMARY KEYでグローバル索引を使用するための様々な構文の使用を示しています。

表を作成します。表を変更して、主キー制約を追加します。USING INDEX GLOBAL句を指定します。表を削除します。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) USING INDEX GLOBAL;
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  PK: global unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;

表を作成します。表を変更することで主キー制約を追加します。USING INDEX GLOBALUSE HASH INDEX PAGES句とともに指定します。表を削除します。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) 
           USING INDEX GLOBAL USE HASH INDEX PAGES =200;
Command> INDEXES mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  PK: global unique hash index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;

表を作成します。表を変更することで主キー制約を追加します。USING INDEX (CreateIndexStmt)句を指定します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) 
           USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myglobalix ON mytab1 (c,b) PAGES =200);
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYGLOBALIX: global unique hash index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;
この例では、USING INDEX GLOBAL|LOCAL句にはUSING INDEX (CreateIndexStmt)句を使用できないことを示しています。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD CONSTRAINT pk PRIMARY KEY (c,b) 
           USING INDEX GLOBAL USE HASH INDEX PAGES = 200 
           USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myglobalix ON mytab1 (c,b) PAGES =200);
 1001: Syntax error in SQL statement  before or at: "USING", character position: 102
...USING INDEX GLOBAL USE HASH INDEX PAGES = 200 USING INDEX (CREATE G...
                                                 ^^^^^
The command failed.

例: TimesTen Scaleoutのグローバル索引を使用した一意制約の追加

次に示す例は、ALTER TABLE ADD UNIQUE CONSTRAINTでグローバル索引を使用するための様々な構文の使用を示しています。

表を作成します。表を変更することで一意制約を追加します。表を削除します。表を再作成して、一意制約を追加し、USING INDEX GLOBAL句を指定します。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (a);
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  TTUNIQUE_6E6: unique range index on columns:
    A
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (a) USING INDEX GLOBAL;
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  $GUA8C5B4ECE6D8: global unique range index on columns:
    A
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab1;

表を作成します。一意制約を追加することで表を変更し、USING INDEX (CreateIndexStmt)句を使用してローカル一意索引を作成します。別の一意制約を追加することで表を再度変更します。USING INDEX (CreateIndexStmt)句を使用して、グローバル一意索引を作成します。

Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           a TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> ALTER TABLE mytab1 ADD UNIQUE (b) USING INDEX (CREATE UNIQUE INDEX myuniqueidxB ON mytab1 (b));
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYUNIQUEIDXB: unique range index on columns:
    B
  1 index found.

1 index found on 1 table.
Command> ALTER TABLE mytab1 ADD UNIQUE (c) USING INDEX (CREATE GLOBAL UNIQUE INDEX myuniqueidxC ON mytab1 (c));
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYUNIQUEIDXB: unique range index on columns:
    B
  MYUNIQUEIDXC: global unique range index on columns:
    C
  2 indexes found.

2 indexes found on 1 table.
Command> DROP TABLE mytab1;

ALTER TABLEのその他の例: TimesTen Scaleout

表6-6に、表の変更に関連付けられているルールを示します。サポートされている例を次に示します。

表6-6 ALTER TABLEルール

ALTER文 コメント
ALTER TABLE t1 ADD CONSTRAINT c1
 PRIMARY KEY (p);

表に主キー制約が追加されます。分散キーは変更されません。

CREATE TABLE t1 (c1 NUMBER, 
 c2 VARCHAR2 (10));

ALTER TABLE t1 
 DISTRIBUTE BY HASH (c1);

表が空の場合、操作は成功します。表が空でない場合、空でない表では分散キーを変更できないため、操作は失敗します。

ALTER TABLE t1 ADD CONSTRAINT c1
 FOREIGN KEY (f1)REFERENCES t2 (c2);

操作が成功します。t1表の分散はc1制約に関連していません。

CREATE TABLE t1...CONSTRAINT fk1...
 DISTRIBUTE BY REFERENCE(fk1);

ALTER TABLE t1 DROP CONSTRAINT(fk1);

操作が失敗します。表を分散するために外部キーが使用されます。

次に示す例は、「表6-6」の表に示した情報をサポートします。

ALTER TABLEを使用した主キー制約の追加

この例では、主キーまたは分散句なしでmytable表を作成します。表は、ハッシュによって非表示列に分散されます。次に、ALTER TABLE文を使用して主キー制約が追加されます。操作は成功しますが、分散キーは変更されません。

Command> CREATE TABLE mytable (col1 NUMBER NOT NULL, col2 VARCHAR2 (32));
Command> describe mytable;
 
Table SAMPLEUSER.MYTABLE:
  Columns:
    COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH
 
1 table found.
(primary key columns are indicated with *)

ここで、表を変更して主キーを追加します。操作が成功します。分散スキームおよび分散キーは変更されません。

Command> ALTER TABLE mytable ADD CONSTRAINT c1 PRIMARY KEY (col1);
Command> describe mytable;
 
Table SAMPLEUSER.MYTABLE:
  Columns:
   *COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH
 
1 table found.
(primary key columns are indicated with *)

一意列に分散した表への主キー制約の追加

この例では、mytab表を作成し、ハッシュによってデータをid2一意列に分散します。この例では、次に、id列に主キー制約を追加して、mytab表を変更します。ttIsql describeコマンドは、表がハッシュによってid2列に分散されたままであることを示します。

Command> CREATE TABLE mytab (id TT_INTEGER NOT NULL, id2 TT_INTEGER UNIQUE, 
           id3 TT_INTEGER) distribute by hash (id2);
Command> ALTER TABLE mytab ADD CONSTRAINT c1 PRIMARY KEY (id);                  Command> describe mytab;
 
Table SAMPLEUSER.MYTAB:
  Columns:
   *ID                              TT_INTEGER NOT NULL
    ID2                             TT_INTEGER UNIQUE
    ID3                             TT_INTEGER
  DISTRIBUTE BY HASH (ID2)
 
1 table found.
(primary key columns are indicated with *)

ALTER TABLEを使用した分散キーの変更

この例では、表が空の場合にのみ、ALTER TABLE文を使用して分散キーを変更できることを示します。

Command> CREATE TABLE mytable2 (col1 NUMBER NOT NULL, col2 VARCHAR2 (32))
         DISTRIBUTE BY HASH (col1,col2);
Command> describe mytable2;
 
Table SAMPLEUSER.MYTABLE2:
  Columns:
    COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH (COL1, COL2)
 
1 table found.
(primary key columns are indicated with *)

ALTER TABLE文を使用して、分散キーをcol1に変更します。表が空であるため、操作は成功します。

Command> ALTER TABLE mytable2 DISTRIBUTE BY HASH (col1);
Command> describe mytable2;
 
Table SAMPLEUSER.MYTABLE2:
  Columns:
    COL1                            NUMBER NOT NULL
    COL2                            VARCHAR2 (32) INLINE
  DISTRIBUTE BY HASH (COL1)
 
1 table found.
(primary key columns are indicated with *)

データの行を挿入し、分散キーを再度col1col2に変更することを試みます。表が空でないため、操作は失敗します。

Command> INSERT INTO mytable2 VALUES (10, 'test');
1 row inserted.
Command> commit;
Command> ALTER TABLE mytable2 DISTRIBUTE BY HASH (col1,col2);
 1069: Table not empty. Alter table distribution is only permitted on empty
tables.
The command failed.

分散キーの一部ではない外部キー制約の追加

この例では、まず、accounts表とaccounts2表を記述します。この例では、次に、accounts2表を変更して、外部キー制約を追加します。この制約はaccounts2表の分散に含まれていないため、操作は成功します。

Command> describe accounts;
 
Table SAMPLEUSER.ACCOUNTS:
  Columns:
   *ACCOUNT_ID                      NUMBER (10) NOT NULL
    PHONE                           VARCHAR2 (15) INLINE NOT NULL
    ACCOUNT_TYPE                    CHAR (1) NOT NULL
    STATUS                          NUMBER (2) NOT NULL
    CURRENT_BALANCE                 NUMBER (10,2) NOT NULL
    PREV_BALANCE                    NUMBER (10,2) NOT NULL
    DATE_CREATED                    DATE NOT NULL
    CUST_ID                         NUMBER (10) NOT NULL
  DISTRIBUTE BY REFERENCE (FK_CUSTOMER)
 
1 table found.
(primary key columns are indicated with *)

Command> describe accounts2;
 
Table SAMPLEUSER.ACCOUNTS2:
  Columns:
   *ACCOUNTS2_ID                    NUMBER (10) NOT NULL
    ACCOUNT_ORIG_ID                 NUMBER (10) NOT NULL
    STATUS                          NUMBER (2) NOT NULL
  DISTRIBUTE BY HASH (ACCOUNTS2_ID)
 
1 table found.
(primary key columns are indicated with *)

Command> ALTER TABLE accounts2 ADD CONSTRAINT accounts2_fk FOREIGN KEY 
           (account_orig_id) REFERENCES accounts (account_id);

ttIsql indexesコマンドを使用して、accounts2_fk制約が正常に作成されたことを示します。

Command> indexes accounts2;
 
Indexes on table SAMPLEUSER.ACCOUNTS2:
  ACCOUNTS2: unique range index on columns:
    ACCOUNTS2_ID
  ACCOUNTS2_FK: non-unique range index on columns:
    ACCOUNT_ORIG_ID
    (foreign key index references table SAMPLEUSER.ACCOUNTS(ACCOUNT_ID))
  2 indexes found.
 
2 indexes found on 1 table.

分散キーとして使用される外部キー制約の削除試行

この例では、fk_accounts制約の削除を試みます。制約が分散キーとして使用されているため、操作は失敗します。

Command> describe transactions;
 
Table SAMPLEUSER.TRANSACTIONS:
  Columns:
   *TRANSACTION_ID                  NUMBER (10) NOT NULL
   *ACCOUNT_ID                      NUMBER (10) NOT NULL
   *TRANSACTION_TS                  TIMESTAMP (6) NOT NULL
    DESCRIPTION                     VARCHAR2 (60) INLINE
    OPTYPE                          CHAR (1) NOT NULL
    AMOUNT                          NUMBER (6,2) NOT NULL
  DISTRIBUTE BY REFERENCE (FK_ACCOUNTS)
 
1 table found.
(primary key columns are indicated with *)

Command> ALTER TABLE transactions DROP CONSTRAINT fk_accounts;
 1072: Dropping a table's reference by distribution foreign key is not allowed.
The command failed.

ALTER TABLEのSQL構文: TimesTen Classic

1つの列の追加:

ALTER TABLE [Owner.]TableName 
  ADD [COLUMN] ColumnName ColumnDataType
    [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL]
  [COMPRESS (CompressColumns [,...])]

複数の列の追加:

ALTER TABLE [Owner.]TableName 
 ADD (ColumnName ColumnDataType 
      [DEFAULT DefaultVal] [[NOT] INLINE] [UNIQUE] [NULL] [,... ] )
  [COMPRESS (CompressColumns [,...])]

NOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD [COLUMN] ColumnName ColumnDataType
    NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE]
  [COMPRESS (CompressColumns [,...])]

複数のNOT NULL列の追加(注意: DEFAULT句が必要):

ALTER TABLE [Owner.]TableName
  ADD (ColumnName ColumnDataType
       NOT NULL [ENABLE] DEFAULT DefaultVal [[NOT] INLINE] [UNIQUE] [,...])
  [COMPRESS (CompressColumns [,...])]

CompressColumnsの構文は次のとおりです。

{ColumnDefinition | (ColumnDefinition [,...])} BY DICTIONARY 
   [MAXVALUES = CompressMax]

列の削除。

ALTER TABLE [Owner.]TableName 
  DROP {[COLUMN] ColumnName | (ColumnName [,... ] )}

ノート:

圧縮列グループの列を削除する場合は、圧縮列グループのすべての列を指定する必要があります。

範囲索引を使用した主キー制約の追加:

ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
  PRIMARY KEY (ColumnName [,... ])

ハッシュ索引を使用した主キー制約の追加:

ALTER TABLE [Owner.]TableName ADD CONSTRAINT ConstraintName
  PRIMARY KEY (ColumnName [,... ])
  USE HASH INDEX PAGES = RowPages | CURRENT

外部キーおよびON DELETE CASCADE(オプション)の追加:

ALTER TABLE [Owner.]TableName 
ADD [CONSTRAINT ForeignKeyName] FOREIGN KEY
    (ColumnName [,...]) REFERENCES RefTableName
       [(ColumnName [,...])] [ON DELETE CASCADE]

外部キーの削除:

ALTER TABLE [Owner.]TableName 
DROP CONSTRAINT ForeignKeyName

ノート:

ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除して再作成します。

ハッシュ索引のサイズ変更:

ALTER TABLE [Owner.]TableName
SET PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更:

ALTER TABLE [Owner.]TableName
USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をUSE RANGE INDEX句で範囲索引に変更するには、次のように実行します。

ALTER TABLE [Owner.]TableName
USE RANGE INDEX

列のデフォルト値の変更:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT DefaultVal)

列の一意制約の追加または削除:

ALTER TABLE Owner.]TableName
{ADD | DROP} UNIQUE (ColumnName)

NULL値可能な列のデフォルト値をNULLに変更することによるデフォルト値の削除:

ALTER TABLE [Owner.]TableName
MODIFY (ColumnName DEFAULT NULL)

LRUエージングの追加:

ALTER TABLE [Owner.]TableName
ADD AGING LRU [ON | OFF]

時間ベースのエージングの追加:

ALTER TABLE [Owner.]TableName
ADD AGING USE ColumnName LIFETIME num1
    {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}
     [CYCLE num2 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S] }]
    [ON | OFF]

エージング状態の変更:

ALTER TABLE [Owner.]TableName
SET AGING {ON | OFF}

エージングの削除:

ALTER TABLE [Owner.]TableName
DROP AGING

存続期間の変更(時間ベースのエージングの場合):

ALTER TABLE [Owner.]TableName
SET AGING LIFETIME num1 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}

サイクルの変更(時間ベースのエージングの場合):

ALTER TABLE [Owner.]TableName
SET AGING CYCLE num2 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]}

ALTER TABLEのパラメータ: TimesTen Classic

パラメータ 説明

[Owner.] TableName

変更する表を指定します。

UNIQUE

ColumnNameの各行の値が一意である必要があることを示します。

MODIFY

指定した列の属性を新しい値に変更します。

DEFAULT [DefaultVal |NULL]

列がデフォルト値(DefaultVal)を持つことを指定します。NULLを指定すると、列のデフォルト値が削除されます。デフォルト値にSYSDATEを指定した列を追加すると、既存の行の列の値のみが、列が追加された時点のシステム日付になります。デフォルト値がUSER関数の1つである場合、列の値はALTER TABLE文を実行したセッションのユーザーの値になります。現在、ROWIDデータ型のデフォルト値を割り当てることはできません。

列のデフォルト値を変更しても、既存の行は変更されません。

ノート: レプリケーション・スキームの一部である表にNOT NULL列を追加するには、DDL_REPLICATON_LEVELが3以上である必要があります。

ColumnName

ALTER TABLE文に含める列の名前。新しい列に、既存の列または別の新しい列と同じ名前を指定することはできません。NOT NULL列を追加する場合は、DEFAULT句を含める必要があります。

ColumnDataType

追加する列のデータ型です。追加のパラメータが必要なデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

NOT NULL [ENABLE]

列を追加する場合に、NOT NULLを指定できます。NOT NULLを指定する場合は、DEFAULT句を含める必要があります。任意で、NOT NULL句の後にENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

COMPRESS (CompressColumns [,...])

圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。

圧縮グループで複数列を定義する場合は、列をINLINEとして指定する必要があります。アウトライン列は、複数列圧縮グループに指定できません。

各圧縮列グループは、最大16列に制限されます。

圧縮列の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

BY DICTIONARY

各圧縮列グループの圧縮ディクショナリを定義します。

MAXVALUES = CompressMax

CompressMaxは、表の個別値の合計数であり、圧縮列グループ・ポインタ列のサイズを1、2または4バイトに設定し、ディクショナリ表のエントリの最大数のサイズを設定します。

ディクショナリ表の場合、NULLは1つの一意の値としてカウントされます。

CompressMaxは、1から232-1までの整数です。

MAXVALUES句を省略した場合の最大サイズのデフォルトは232-1であり、ポインタ列に4バイトが使用されます。値が232-1よりも大きい場合は、エラーがスローされます。

圧縮ディクショナリの最大サイズ指定の詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

ADD CONSTRAINT ConstraintName PRIMARY KEY (ColumnName

[,... ] ) [USE HASH INDEX PAGES = RowPages | CURRENT]

表に主キー制約を追加します。主キーの列はNOT NULLとして定義する必要があります。

主キー制約を適用するために使用する索引の名前としてConstraintNameを指定します。主キーに対して使用するNOT NULL列の名前としてColumnNameを指定します。

主キーに対してハッシュ索引を使用するには、USE HASH INDEX句を指定します。指定しない場合、主キー制約には範囲索引が使用されます。

CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。

ノート: ADD CONSTRAINTを使用して指定された主キー制約を追加する前に、ALTER TABLEを使用して主キー制約を削除できないことに注意してください。制約を削除するには、表を削除してから再作成する必要があります。

CONSTRAINT

外部キーを削除することを指定します。オプションで、追加された外部キーの名前をユーザーが指定するように指定します。

ForeignKeyName

追加または削除する外部キーの名前です。すべての外部キーは、ユーザーが名前を指定しなかった場合、デフォルトの名前が割り当てられます。ユーザーが指定した名前またはシステムの名前のいずれかをDROP FOREIGN KEY句で指定できます。

FOREIGN KEY

外部キーを追加することを指定します。

REFERENCES

外部キーが別の表を参照することを指定します。

RefTableName

外部キーが参照する表の名前です。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

USE HASH INDEX PAGES = RowPages | CURRENT

主キーで使用する索引をハッシュ索引に変更します。主キーですでにハッシュ索引を使用している場合、この句はSET PAGES句と同じです。

USE RANGE INDEX

主キーで使用する索引を範囲索引に変更します。主キーですでに範囲索引を使用している場合、この句は無視されます。

SET PAGES = RowPages | CURRENT

表の想定ページ数に基づいてハッシュ索引のサイズを変更します。CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

TimesTenでは、表に行がない場合は、PAGES=CURRENTを指定しないことをお薦めします。

推定した数が小さすぎると、パフォーマンスが悪化します。ハッシュ索引の詳細は、「列定義: TimesTen Classic」を参照してください。

ADD AGING LRU [ON | OFF]

エージング・ポリシーが定義されていない既存の表に、LRUエージングを追加します。

LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

LRU属性は、組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいはその両方)をコールすることで定義します。LRU属性はSQLレベルでは定義できません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttAgingLRUConfigに関する項およびttAgingTableLRUConfigに関する項と、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』表へのエージング・ポリシーの実装に関する項を参照してください。

ADD AGING USE ColumnName...[ON| OFF]

エージング・ポリシーが定義されていない既存の表に、時間ベースのエージングを追加します。

時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLTIMESTAMPデータ型またはDATEデータ型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列はNULLにはできません)。

TT_TIMESTAMPデータ型またはTT_DATEデータ型を使用してエージング列を定義できます。TT_DATEデータ型を選択する場合は、LIFETIME単位としてDAYSを指定する必要があります。

時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』表へのエージングの実装に関する項を参照してください。

LIFETIME Num1 {SECOND[S] | MINUTE[S] | HOUR[S] | DAY[S]

時間ベースのエージング・ポリシーを既存の表に追加する場合は、ADD AGING USE ColumnName句の後にLIFETIME句を指定します。LIFETIMEの設定を変更するには、SET AGING句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、秒、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。エージング列をTT_DATEデータ型を使用して定義する場合は、LIFETIME単位としてDAYSを指定する必要があります。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。

CYCLE Num2 {SECOND[S]| MINUTE[S]| HOUR[S]|DAY[S]}

時間ベースのエージング・ポリシーを既存の表に追加する場合は、LIFETIME句の後にオプションでCYCLE句を指定します。

CYCLEは、時間ベースのエージング属性です。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定した場合、エージング・スレッドは1秒ごとに起動します。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

CYCLE設定を変更するには、SET AGING句の後にCYCLE句を指定します。

SET AGING {ON|OFF}

エージング状態を変更します。エージング・ポリシーが事前に定義されている必要があります。ONにすると、自動エージングが有効になります。OFFにすると、自動エージングが無効になります。外部のスケジューラでエージングを制御するには、エージングを無効にしてttAgingScheduleNow組込みプロシージャを起動します。

DROP AGING

表からエージング・ポリシーを削除します。一度定義すると、変更することはできません。エージングを削除してから再定義してください。

SET AGING LIFETIME Num1 {SECOND[S]| MINUTE[S]|HOUR[S] |DAY[S]}

この句を使用して時間ベースのエージングの存続期間を変更します。

Num1には、正の整数を指定します。

エージング列をTT_DATEデータ型を使用して定義した場合は、LIFETIME単位としてDAYSを指定する必要があります。

SET AGING CYCLE Num2 {SECOND[S]| MINUTE[S]| HOUR[S]|DAY[S]}

この句を使用して時間ベースのエージングのサイクルを変更します。

Num2には、正の整数を指定します。

ALTER TABLEの説明: TimesTen Classic

  • ALTER TABLE文を使用して一時表を変更することはできません。

  • ALTER TABLE ADD [COLUMN] ColumnName文は、既存の表に1つ以上の新しい列を追加します。1つ以上の列を追加した場合、新しい列は、新しい1つのパーティション内の表のすべての既存の行の最後に追加されます。

  • ALTER TABLE ADDまたはDROP COLUMN文を使用して、レプリケートされた表に対して列を追加または削除できます。

    ALTER TABLEを使用して、TWOSAFE BY REQUESTトランザクションの一部であるレプリケートされた表を変更しないでください。

  • マテリアライズド・ビューから参照されている列は削除できません。

  • 列の追加、列の削除、およびキャッシュ・グループ表の制約の追加にALTER TABLE文は使用できません。

  • 追加される列の数に関係なく、1文につき1つのパーティションのみが表に追加されます。

  • 表にALTERを実行して、デフォルト値を持つNOT NULL列を追加します。DEFAULT句は必須です。次の制限があります。

    • この列を主キー列として使用することはできません。具体的には、ALTER TABLE ADD ConstraintName PRIMARY KEY (ColumnName [,...])文では、その列を指定できないということです。

    • この列を時間ベースのエージングに使用することはできません。具体的には、文ALTER TABLE ADD AGING USE ColumnNameに、この列を指定することはできません。

      ノート:

      レプリケーション・スキームの一部である表にNOT NULL列を追加するには、DDL_REPLICATON_LEVELが3以上である必要があります。
  • 新しい列に対してデフォルト値が指定されている場合を除き、追加されるすべての列の初期値はNULLです。

  • 表の列の合計数は1000以下です。また、表のパーティションの合計数は1000以下であり、そのうちの1つはTimesTenによって使用されます。

  • 主キー制約を通常の表またはディテール表やマテリアライズド・ビュー表に追加するには、ADD CONSTRAINT ... PRIMARY KEY句を使用します。すでに主キーを持つ表に対しては、この句を使用しないでください。

  • ADD CONSTRAINT... PRIMARY KEY句を使用して主キー制約を追加する際に、USE HASH INDEX句を指定しないと、主キー制約に対して範囲索引が使用されます。

  • 表がレプリケートされる際に、レプリケーション・エージェントがアクティブである場合は、ADD CONSTRAINT ... PRIMARY KEY句を使用できません。最初にレプリケーション・エージェントを停止します。

  • グローバル一時表でADD CONSTRAINT ... PRIMARY KEY句を指定しないでください。

  • 主キーを指定して定義されているキャッシュ・グループ表はCREATE CACHE GROUP文で定義する必要があるため、キャッシュ・グループ表ではADD CONSTRAINT ... PRIMARY KEY句を指定しないでください。

  • ALTER TABLE ADD文の結果として、問合せ時に新しい各パーティションに対して追加の読取りが発生します。このため、変更された表のパフォーマンスがわずかに悪化することがあります。パフォーマンスを回復するには、表を削除して再作成するか、またはttMigrate create -c -relaxedUpgradeコマンドを使用してから、ttRestore -r -relaxedUpgradeコマンドを使用して表をリストアします。追加された列を削除しても、悪化したパフォーマンスは回復されず、パーティションの数も減りません。

  • ALTER TABLE DROP文を使用して既存の表から1つ以上の列を削除すると、削除された列は、表の現在のすべての行から削除されます。それ以降のSQL文では、削除した列は使用できなくなります。表の主キーに含まれている列は削除できません。また、表の外部キーに含まれている列も、すべての外部キーを削除しないかぎり削除できません。索引付けされた列は、列の索引をすべて削除しないかぎり削除できません。ALTER TABLEを使用して表の列をすべて削除することはできません。かわりにDROP TABLEを使用します。

  • 表から列が削除された場合、その表を参照するすべてのコマンドを再コンパイルする必要があります。削除された列が参照されると、再コンパイル時にエラーが発生することがあります。アプリケーションはそのコマンドを再度準備し、パラメータと結果列を再作成する必要があります。列が表に追加された場合、SELECT *文を含むコマンドは無効になります。これらのコマンドのみを再度準備する必要があります。その他のすべてのコマンドは、想定したとおりに動作します。

  • 列を削除しても、列の領域は解放されません。

  • UNIQUE制約を追加すると、(領域の増加および処理時間の増加という点で)オーバーヘッドが発生します。これは、UNIQUE制約を維持するための索引が作成されるためです。UNIQUE制約を維持するために使用している索引を、DROP INDEX文を使用して削除することはできません。

  • UNIQUE制約とそれに関連付けられている索引は、レプリケートされた表の一意索引として使用されている場合、削除できません。

  • アプリケーションで表の主キーに対して範囲問合せを実行する場合は、ALTER TABLE...USE RANGE INDEXを使用します。

  • アプリケーションで表の主キーに対して完全一致検索を実行する場合は、ALTER TABLE...USE HASH INDEXを使用します。

  • 表に主キーがない場合、USE HASH INDEX句またはUSE RANGE INDEX句を指定すると、エラーが生成されます。

  • レプリケートされた表で外部キーの追加や削除を行う前に、レプリケーション・エージェントを停止してください。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

  • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。

    • deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADE: 第2のルールも適用されます。

  • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • レプリケーションを含むON DELETE CASCADE: 次の制限が適用されます。

    • ON DELETE CASCADEで指定された外部キーは、レプリケートされた表のマスターとサブスクライバの間で一致している必要があります。これは実行時に確認されます。エラーが発生すると、RECEIVERスレッドは処理を停止します。

    • カスケード削除のツリーに含まれる表をレプリケートする場合は、ツリーに含まれるすべての表をレプリケートする必要があります。この制限は、レプリケーション・スキームを作成したとき、またはレプリケーション表のいずれかにON DELETE CASCADE付きの外部キーを追加したときにチェックされます。エラーが検出されると、処理は中断します。外部キー制約を変更する前に、まずレプリケーション・スキームを削除することが必要になる場合があります。

  • ALTER TABLE ADD/DROP CONSTRAINT文には、次の制限があります。

    • 外部キーが削除されると、TimesTenでは外部キーに関連付けられている索引も削除されます。通常のDROP INDEX文を使用して外部キーに関連付けられている索引を削除しようとすると、エラーになります。

    • 外部キーは、キャッシュ・グループの表では追加または削除できません。

    • 外部キーは、ビューまたは一時表では追加または削除できません。

    • ALTER TABLEを使用して主キー制約を削除することはできません。制約を削除するには、表を削除してから再作成する必要があります。

  • 表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。

  • エージング・ポリシーは、エージング状態を変更するように定義する必要があります。

  • LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。

    • SELECT文の結果セットを構築するために使用された行。

    • INSERT ... SELECT文の結果セットを構築するために使用された行。

    • 更新または削除対象の行。

  • コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。

  • エージング状態がONOFFかにかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNowプロシージャをコールします。

  • 時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、NOT NULL列を追加または変更できないためです。

  • エージングの制限:

    • 時間ベースのエージングに使用されている列は削除できません。

    • 外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。

    • LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。ON DELETE CASCADEの設定は無視されます。

    • 時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。ON DELETE CASCADEは、設定の有無にかかわらず無視されます。

  • 表の列ベースの圧縮の制限:

    • 表の作成時に表の圧縮が有効化された場合は、ALTER TABLE文でのみ圧縮列グループを追加できます。非圧縮列は、圧縮が有効な表を含め、任意の表に追加できます。表への圧縮列グループの追加の詳細は、表の列ベースの圧縮(TimesTen Classic)を参照してください。

    • 圧縮列グループの列は変更できません。

    • ALTER TABLEコマンドを使用して圧縮列グループ内のすべての列を削除でき、圧縮列グループ内の列を削除するときは、圧縮列グループ内のすべての列を削除に対して指定する必要があります。

    • 既存の非圧縮列を変更して圧縮するためにALTER TABLEは使用できません。たとえば:

      Command> create table mytab (a varchar2 (30), b int, c int) compress ((a,b)
                 by dictionary);
      Command> alter table mytab add (d int) compress (c by dictionary);
      2246: Cannot change compression clause for already defined column C 
      The command failed.

TimesTenでALTER TABLEを使用する場合のパーティションの理解

表を作成すると、初期パーティションが作成されます。表にALTERを実行して列を追加すると、セカンダリ・パーティションが作成されます。各ALTER TABLE文に対して、1つのセカンダリ・パーティションが作成されます。セカンダリ・パーティション内の列については、その列に主キー制約を作成したり、その列を時間ベースのエージングに使用することはできません。

ttMigrate -r -relaxedUpgradeを使用すると、複数のパーティションをまとめることができます。これは、初期パーティションと1つ以上のセカンダリ・パーティションが、初期パーティションと呼ばれる単一のパーティションにまとめられることを意味します。複数のパーティションをまとめると、表にALTERを実行して列に主キー制約を追加したり、その列を時間ベースのエージングに使用することができます。これは、列がセカンダリ・パーティションにはなく、現在は初期パーティションに存在するためです。

データベースがレプリケーションに関係し、複数のパーティションをまとめる必要がある場合は、(CREATE REPLICATION文の) StoreAttribute TABLE DEFINITION CHECKING RELAXEDを使用する必要があります。マスターとサブスクライバの両方で、あるいはマスターまたはサブスクライバで-duplicateを使用して、ttMigrate -r -relaxedUpgradeを実行します。

ttSchemaを使用して、列のパーティション番号を表示します。ttSchemaによって、セカンダリ・パーティション番号1はパーティション1として、セカンダリ・パーティション番号2はパーティション2として、以降同様に表示されます。

例として、2つの列を持つ表MyTabを作成します。この表にALTERを使用して、Col3Col4の2つの列を、NOT NULL DEFAULT句を指定して追加します。

Command> CREATE TABLE MyTab (Col1 NUMBER, Col2 VARCHAR2 (30));
Command> ALTER TABLE MyTab ADD (Col3 NUMBER NOT NULL DEFAULT 10, Col4 TIMESTAMP
            NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');

ttSchemaを使用して、Col3およびCol4がセカンダリ・パーティション1に含まれていることを確認します。

ttschema -DSN sampledb_1122
-- Database is in Oracle type mode
create table TESTUSER.MYTAB (
        COL1 NUMBER,
        COL2 VARCHAR2(30 BYTE) INLINE,
        COL3 NUMBER NOT NULL DEFAULT 10,
        COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');
-- column COL3 partition 1
-- column COL4 partition 1

Col3に主キー制約を、Col4に時間ベースのエージングを追加してみます。初期パーティションに含まれていない列には、主キー制約も、時間ベースのエージングも追加できないため、エラーが表示されます。

Command> ALTER TABLE MyTab ADD CONSTRAINT PriKey PRIMARY KEY (Col3);
 2419: All columns in a primary key constraint must be in the initial partition;
column COL3 was added by ALTER TABLE
The command failed.

Command> ALTER TABLE MyTab ADD AGING USE Col4 LIFETIME 3 DAYS;
 3023: Aging column must be in the initial partition; column COL4 was added by
ALTER TABLE
The command failed.

ttMigrateを、-relaxedUpgradeオプションとともに使用して、パーティションをまとめます。その後ttSchemaを使用して、パーティションがまとめられて、セカンダリ・パーティション1には列がないことを確認します。

ttMigrate -c dsn=sampledb_1122 test.migrate
 
Saving user PUBLIC
User successfully saved.
 
Saving table TESTUSER.MYTAB
  Saving rows...
  0/0 rows saved.
Table successfully saved.

ttDestroy sampledb_1122

ttMigrate -r -relaxedUpgrade
 dsn=sampledb_1122 test.migrate
 
Restoring table TESTUSER.MYTAB
  Restoring rows...
  0/0 rows restored.
Table successfully restored.

ttSchema DSN=sampledb_1122
-- Database is in Oracle type mode
create table TESTUSER.MYTAB (
        COL1 NUMBER,
        COL2 VARCHAR2(30 BYTE) INLINE,
        COL3 NUMBER NOT NULL DEFAULT 10,
        COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00');

この段階で、Col3に主キー制約を追加し、Col4に時間ベースのエージングを追加します。ttMigrateの結果としてCol3およびCol4は初期パーティションに含まれているため、成功します。ttSchemaを使用して結果を確認します。

Command> ALTER TABLE MyTab ADD CONSTRAINT PriKey PRIMARY KEY (Col3);
Command> ALTER TABLE MyTab ADD AGING USE Col4 LIFETIME 3 DAYS;

ttschema sampledb_1122
-- Database is in Oracle type mode
create table TESTUSER.MYTAB (
        COL1 NUMBER,
        COL2 VARCHAR2(30 BYTE) INLINE,
        COL3 NUMBER NOT NULL DEFAULT 10,
        COL4 TIMESTAMP(6) NOT NULL DEFAULT TIMESTAMP '2012-09-03 12:00:00')
    AGING USE COL4 LIFETIME 3 days CYCLE 5 minutes ON;
 
    alter table TESTUSER.MYTAB add constraint PRIKEY primary key (COL3);

ALTER TABLEの例: TimesTen Classic

returnrate列をparts表に追加します。

ALTER TABLE parts ADD COLUMN returnrate DOUBLE;

numsssign列とprevdept列をcontractor表に追加します。

ALTER TABLE contractor
  ADD ( numassign INTEGER, prevdept CHAR(30) );

employee表のaddr1列とaddr2列を削除します。

ALTER TABLE employee DROP ( addr1, addr2 );

booksUNIQUEのtitle列を削除します。

ALTER TABLE books DROP UNIQUE (title);

デフォルト値5を使用してx1列をt1表に追加します。

ALTER TABLE t1 ADD (x1 INT DEFAULT 5);

列のデフォルト値x1を2に変更します。

ALTER TABLE t1 MODIFY (x1 DEFAULT 2);

主キー制約c1を追加するようにprimarykeytest表を変更します。ttIsql INDEXESコマンドを使用して、主キー制約c1が作成され、範囲索引が使用されていることを表示します。

Command> CREATE TABLE primarykeytest (col1 TT_INTEGER NOT NULL);
Command> ALTER TABLE primarykeytest ADD CONSTRAINT c1 
         PRIMARY KEY (col1);
Command> INDEXES primarykeytest;

Indexes on table SAMPLEUSER.PRIMARYKEYTEST:
  C1: unique range index on columns:
    COL1
  1 index found.

1 index found on 1 table.

ハッシュ索引を使用して主キー制約c2を追加するようにprikeyhash表を変更します。ttIsql INDEXESコマンドを使用して、主キー制約c2が作成され、ハッシュ索引が使用されていることを表示します。

Command> CREATE TABLE prikeyhash (col1 NUMBER (3,2) NOT NULL);
Command> ALTER TABLE prikeyhash ADD CONSTRAINT c2
           PRIMARY KEY (col1) USE HASH INDEX PAGES = 20;
Command> INDEXES prikeyhash;

Indexes on table SAMPLEUSER.PRIKEYHASH:
  C2: unique hash index on columns:
    COL1
  1 index found.

1 table found.

すでに主キーを使用して定義されている表に主キー制約を追加してみます。次のエラーが表示されます。

Command> CREATE TABLE oneprikey (col1 VARCHAR2 (30) NOT NULL, 
         col2 TT_BIGINT NOT NULL, col3 CHAR (15) NOT NULL, 
         PRIMARY KEY (col1,col2));
Command> ALTER TABLE oneprikey ADD CONSTRAINT c2 
         PRIMARY KEY (col1,col2);
 2235: Table can have only one primary key
The command failed.

NOT NULLとして定義されていない列に主キー制約を追加してみます。次のエラーが表示されます。

Command> CREATE TABLE prikeynull (col1 CHAR (30));
Command> ALTER TABLE prikeynull ADD CONSTRAINT c3 
         PRIMARY KEY (col1);
 2236: Nullable column cannot be part of a primary key
The command failed.

この例では、範囲索引およびハッシュ索引の使用方法を示しています。col1を主キーとしてpkey表を作成します。デフォルトで範囲索引が作成されます。次に、col1の索引をハッシュ索引に変更するよう、この表をALTER文で変更します。再度、索引を範囲索引に戻すよう、この表をALTER文で変更します。

Command> CREATE TABLE pkey (col1 TT_INTEGER PRIMARY KEY, col2 VARCHAR2 (20));
Command> INDEXES pkey;
Indexes on table SAMPLEUSER.PKEY:
   PKEY: unique range index on columns:
    COL1
 1 index found.
1 index found on 1 table.

ハッシュ索引を使用するようにpkey表を変更します。

Command> ALTER TABLE pkey USE HASH INDEX PAGES = CURRENT;
Command> INDEXES pkey;
Indexes on table SAMPLEUSER.PKEY:
  PKEY: unique hash index on columns:
    COL1
  1 index found.
1 table found.

USE RANGE INDEX句で、範囲索引を使用するようにpkey表を変更します。

Command> ALTER TABLE pkey USE RANGE INDEX;
Command> INDEXES pkey;
Indexes on table SAMPLEUSER.PKEY:
  PKEY: unique range index on columns:
    COL1
  1 index found.
1 table found.

この例では、主キーを使用しないで列に範囲索引またはハッシュ索引を定義するように表を変更しようとしたときに、エラーが生成されます。

Command> CREATE TABLE myindex (Ccl1 CHAR (20));
Command> ALTER TABLE myindex USE RANGE INDEX;
 2810: The table has no primary key so cannot change its index type
The command failed.
Command> ALTER TABLE myindex USE HASH INDEX PAGES = CURRENT;
 2810: The table has no primary key so cannot change its index type
The command failed.

これらの例では、エージングにおいて、時間の単位がどのように機能するかを示しています。この例では、存続期間は3 Daysです。

  • (SYSDATE - ColumnValue) <= 3の場合、行はエージ・アウトされません。

  • (SYSDATE - ColumnValue) > 3の場合、行はエージ・アウトの対象となります。

  • (SYSDATE - ColumnValue) = 3 Days, 22 Hoursの場合、存続期間がDaysで指定されているため、行はエージ・アウトされません。存続期間が72 Hoursと指定されていた場合は、行はエージ・アウトされます。

この例では、LRUエージングを追加して表を変更します。表には事前に設定されたエージング・ポリシーはありません。エージング状態は、デフォルトでONになっています。

ALTER TABLE agingdemo3 ADD AGING LRU;
Command> DESCRIBE agingdemo3;
Table USER.AGINGDEMO3:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
  Aging lru on
1 table found.
(primary key columns are indicated with *)

この例では、時間ベースのエージングを追加して表を変更します。表には事前に設定されたエージング・ポリシーはありません。agingcolumn列はエージングに使用します。LIFETIMEは2日です。CYCLEは30分です。

ALTER TABLE agingdemo4
       ADD AGING USE agingcolumn LIFETIME 2 DAYS CYCLE 30 MINUTES;
Command> DESCRIBE agingdemo4;
Table USER.AGINGDEMO4:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on

この例では、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE agingdemo5
       (agingid NUMBER NOT NULL PRIMARY KEY
       ,name VARCHAR2 (20)
       ,agingcolumn TIMESTAMP NOT NULL
       )
       AGING USE agingcolumn LIFETIME 3 DAYS OFF;
ALTER TABLE agingdemo5
      ADD AGING LRU;
 2980: Cannot add aging policy to a table with an existing aging policy. Have to
 drop the old aging first
The command failed.

表のエージングを削除し、LRUエージングを使用して再定義します。

ALTER TABLE agingdemo5
      DROP AGING;
ALTER TABLE agingdemo5
       ADD AGING LRU;
Command> DESCRIBE agingdemo5;
Table USER.AGINGDEMO5:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging lru on
1 table found.
(primary key columns are indicated with *)

この例では、ALTER文で表のエージング状態をOFFに設定します。表には時間ベースのエージング・ポリシーが定義されています。エージング状態をOFFに設定すると、エージングは自動的には行われません。これは、外部のスケジューラを使用してエージング処理を制御する必要がある場合に有効です。エージング状態をOFFに設定し、ttAgingScheduleNowプロシージャをコールしてエージング処理を開始します。

Command> DESCRIBE agingdemo4;
Table USER.AGINGDEMO4:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes on

ALTER TABLE AgingDemo4
       SET AGING OFF;

DESCRIBE agingdemo4を実行すると、エージング・ポリシーが定義されてエージング状態がOFFに設定されることに注意してください。

Command> DESCRIBE agingdemo4;
Table USER.AGINGDEMO4:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 2 days cycle 30 minutes off
1 table found.
(primary key columns are indicated with *)

ttAgingScheduleNowをコールして、外部スケジューラでエージングを起動します。

Command> CALL ttAgingScheduleNow ('agingdemo4');

表にエージング列を追加し、その列を時間ベースのエージングに使用するように変更してみます。エラーが生成されます。

Command> DESCRIBE x;
Table USER1.X:
  Columns:
   *ID                              TT_INTEGER NOT NULL
1 table found.
(primary key columns are indicated with *)
Command> ALTER TABLE x ADD COLUMN t TIMESTAMP;
Command> ALTER TABLE x ADD AGING USE t LIFETIME 2 DAYS;
 2993: Aging column cannot be nullable
The command failed.

時間ベースのエージングを使用して定義された表のLIFETIME句を変更してみます。エージング列はTT_DATEデータ型を使用して定義されています。LIFETIME単位がDAYSで表されていないため、エラーが生成されます。

Command> CREATE TABLE aging1 (col1 TT_DATE NOT NULL) AGING USE 
         col1 LIFETIME 2 DAYS;
Command> ALTER TABLE aging1 SET AGING LIFETIME 2 HOURS;
 2977: Only DAY lifetime unit is allowed with a TT_DATE column
The command failed.

employees表を変更して、州のフルネームを含む新しい圧縮列stateを追加します。employees表には、job_idおよびmanager_idで構成された圧縮列グループがすでにあることに注意してください。

Command> ALTER TABLE employees 
         ADD COLUMN state VARCHAR2(20) 
         COMPRESS (state BY DICTIONARY);

Command> DESCRIBE employees; 
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
    STATE                           VARCHAR2 (20) INLINE
  COMPRESS ( ( JOB_ID, MANAGER_ID ) BY DICTIONARY,
             STATE BY DICTIONARY )
 
1 table found.
(primary key columns are indicated with *)

次の例では、圧縮列stateemployees表から削除します。

Command> ALTER TABLE employees
 DROP state;
Command> DESCRIBE employees; 
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
 COMPRESS ( ( JOB_ID, MANAGER_ID ) BY DICTIONARY )
 
1 table found.
(primary key columns are indicated with *)

関連項目

ALTER USER

ALTER USER文を使用すると、ユーザーのパスワードを変更できます。また、ユーザーのプロファイルを変更することも、ユーザーのアカウントをロックまたはロック解除することも、ユーザーのパスワードを有効期限切れにすることもできます。こうした操作は、ADMIN権限を持つユーザーが実行できます。

また、この文を使用すると、ユーザーを内部から外部に変更することも、外部から内部に変更することもできます。

必要な権限

ユーザー自身のパスワードの変更に必要な権限はありません。

その他のすべての操作には、ADMIN権限が必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

これは、ALTER USER...IDENTIFIED BYの構文です。少なくともIDENTIFIED BY句、PROFILE句、ACCOUNT句またはPASSWORD EXPIRE句のいずれかを必ず指定します。

ALTER USER user [IDENTIFIED BY {password | "password"}]
  [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}] [PASSWORD EXPIRE]

これは、ALTER USER...IDENTIFIED EXTERNALLYの構文です。少なくともIDENTIFIED EXTERNALLY句、PROFILE句またはACCOUNT句のいずれかを必ず指定します。

ALTER USER user [IDENTIFIED EXTERNALLY]
  [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}]

パラメータ

パラメータ 説明

user

変更するユーザーの名前。

IDENTIFIED BY password|"password"

内部ユーザーと、その内部ユーザーのパスワードを指定します。

指定できるパスワードは、ユーザーに割り当てられたプロファイルによって異なります。具体的には、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの値によって、パスワードの複雑さが決まります。この値がTT_VERIFY_FUNCTIONTT_STRONG_VERIFY_FUNCTIONまたはTT_STIG_VERIFY_FUNCTIONの場合、パスワードは特定のパスワード検証要件を満たしている必要があります。たとえば、この値がTT_VERIFY_FUNCTIONの場合は、パスワードにデータベースの名前を含めることはできません。詳細は、「パスワード複雑度チェッカの検証について」を参照してください。

IDENTIFIED EXTERNALLY

ユーザーが外部ユーザーであることを指定します。

PROFILE profile

PROFILE句を使用して、ユーザーに割り当てるプロファイルの名前を指定します(profileで指定)。このプロファイルによって、ユーザーのパスワード・パラメータの制限が設定されます。各パスワード・パラメータの詳細は、「CREATE PROFILE」を参照してください。外部ユーザーに対してPROFILE句を指定できますが、パスワード・パラメータは外部ユーザーに影響しません。

ACCOUNT [LOCK|UNLOCK]

ACCOUNT LOCKは、ユーザーのアカウントをロックして、データベースへの接続を禁止する場合に指定します。ACCOUNT UNLOCKは、ユーザーのアカウントのロックを解除して、データベースに接続できるようにする場合に指定します。デフォルトは、ACCOUNT UNLOCKです。

PASSWORD EXPIRE

PASSWORD EXPIREは、ユーザーのパスワードを期限切れにする場合に指定します。この設定により、ADMIN権限を持つユーザーは、データベースに接続する前にパスワードを変更するように強制されます。この句は、外部で識別されるユーザー(IDENTIFIED EXTERNALLY句で示される)には無効です。

説明

  • データベース・ユーザーには、内部ユーザーまたは外部ユーザーを指定できます。

    • 内部ユーザーは、TimesTenデータベース用に定義されるユーザーです。

    • 外部ユーザーは、オペレーティング・システムで定義されています。外部ユーザーにTimesTenパスワードを割り当てることはできません。

  • パスワードの要件:
    • 30文字を超えることはできません。
    • 大文字と小文字が区別されます。
    • 先頭に文字を使用する必要があります。パスワードを二重引用符で囲まないかぎり、パスワードの先頭を数字または特殊文字にすることはできません。
    • 特殊文字を使用する場合は、パスワードを二重引用符で囲む必要があります。例外は、#@の特殊文字です。#または@の特殊文字を含むパスワードは、二重引用符で囲む必要がありません。
    • セミコロン(;)や二重引用符(")を含めることはできません。
  • PROFILE句は、ユーザーのプロファイルを変更する場合に使用します。詳細は、「CREATE PROFILE」を参照してください。

  • ACCOUNT LOCKまたはACCOUNT UNLOCKは、ユーザー・アカウントのロック設定を変更する場合に使用します。

  • PASSWORD EXPIRE句は、データベースに接続する前に、ユーザーのパスワードを期限切れにして、パスワードの変更を強制するために使用します。

  • 接続がTLSで暗号化されている場合は、クライアント/サーバー接続を使用してユーザーを変更できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TimesTen Client/ServerのTransport Layer Securityに関する項を参照してください。

  • レプリケーションが構成されている場合、この文はレプリケートされます。

ユーザー変更時のパスワード検証の説明

この例では、myprofile_strongpwプロファイルを作成して、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータにTT_VERIFY_FUNCTIONの値を指定します。その後で、sampleuser_pwchangeユーザーを作成し、このユーザーにmyprofile_strongpwプロファイルを割り当てます。指定したパスワードはTT_STRONG_VERIFY_FUNCTION関数の要件を満たしていて、ユーザーが作成されます。TT_STRONG_VERIFY_FUNCTION関数の詳細は、「TT_STRONG_VERIFY_FUNCTION」を参照してください。

Command> CREATE PROFILE myprofile_strongpw LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;

Profile created.

Command> CREATE USER sampleuser_pwchange 
           IDENTIFIED BY "5&AbbN*60" PROFILE myprofile_strongpw;

User created.

次に、myprofile_strongpwプロファイルを変更することで、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの値をTT_STIG_VERIFY_FUNCTIONに変更します。ALTER USER文を使用して、sampleuser_pwchangeユーザーのパスワードを期限切れにします。sampleuser_pwchangeユーザーとしてデータベースに接続してみます。この接続は、パスワードの有効期限が切れているために失敗します。

Command> ALTER PROFILE myprofile_strongpw LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STIG_VERIFY_FUNCTION;

Profile altered.

Command> ALTER USER sampleuser_pwchange PASSWORD EXPIRE;

User altered.

Command> GRANT CONNECT TO sampleuser_pwchange;
Command> connect adding "UID=sampleuser_pwchange;PWD=5&AbbN*60" as sampleuser;
15180: the password has expired
The command failed.

ALTER USER文を使用して、sampleuser_pwchangeユーザーのパスワードを変更します。このパスワードはTT_STIG_VERIFY_FUNCTION関数の要件を満たしているため、ALTER USER文は成功します。sampleuser_pwchangeユーザーとしてデータベースに接続してみます。その接続に成功します。TT_STIG_VERIFY_FUNCTION関数の詳細は、「TT_STIG_VERIFY_FUNCTION」を参照してください。

access1: Command> ALTER USER sampleuser_pwchange 
           IDENTIFIED BY "bd@<!BCvvKASn67";

User altered.

Command> connect adding "UID=sampleuser_pwchange;PWD=bd@<!BCvvKASn67" 
           as sampleuser;
Connection successful: DSN=access1;UID=sampleuser_pwchange;
DataStore=/scratch/sampleuser/mydatabase1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

ユーザーのプロファイルの変更

この例では、user1ユーザーを作成して、user1ユーザーにprofile1プロファイルを割り当てます。その次に、ALTER USER文を使用して、user1ユーザーのプロファイルをprofile2に変更します。

Command> CREATE USER user1 IDENTIFIED BY user1 PROFILE profile1;
 
User created.
 
Command> ALTER USER user1 PROFILE profile2;
 
User altered.

dba_usersシステム・ビューを問い合せて、user1プロファイルがprofile2に変更されたことを確認します。

Command> SELECT profile FROM dba_users WHERE username = 'USER1';
< PROFILE2 >
1 row found.

ユーザーのアカウントのロックとロック解除

この例では、user2ユーザーを作成します。その次に、ALTER USER文を使用して、user2ユーザーのアカウントをロックしてからロックを解除します。

Command> CREATE USER user2 IDENTIFIED BY user2 PROFILE profile1;
 
User created.
 
Command> ALTER USER user2 ACCOUNT LOCK;
 
User altered.
 

user2CONNECT権限を付与します。

Command> GRANT CONNECT TO user2;

user2として、データベースに接続してみます。user2アカウントはロックされているため、接続に失敗します。

Command> connect adding "UID=user2;PWD=user2" as user2;
15179: the account is locked
The command failed.

インスタンス管理者としてデータベースに再接続し、ALTER USER文を使用してuser2アカウントのロックを解除します。

none: Command> use database1
database1: Command> ALTER USER user2 ACCOUNT UNLOCK;
 
User altered.
 

user2ユーザーとして、データベースに接続してみます。接続が成功します。

database1: Command> connect adding "UID=user2;PWD=user2" as user2;
Connection successful: DSN=database1;UID=user3;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

ユーザーのパスワードの有効期限

この例では、ALTER USER文を使用して、user2ユーザーのアカウントを変更し、パスワードを期限切れにします。ADMIN権限を持つユーザーは、user2がデータベースに接続する前に、user2のパスワードを変更しておく必要があります。

Command> ALTER USER user2 PASSWORD EXPIRE;
 
User altered.
 

user2として、データベースに接続してみます。user2ユーザーがデータベースに接続する前に、user2のパスワードを変更しておく必要があります。

Command>  connect adding "UID=user2;PWD=user2" as user2;
15180: the password has expired
The command failed.

インスタンス管理者としてデータベースに再接続し、ALTER USER文を使用してuser2のパスワードを変更します。

none: Command> use database1
database1: Command>  ALTER USER user2 IDENTIFIED BY newuser2password;
 
User altered.
 

user2ユーザーとして、データベースに接続してみます。接続が成功します。

database1: Command> connect adding "UID=user2;PWD=newuser2password" as user2;
Connection successful: DSN=database1;UID=user4;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

ユーザーの外部から内部への変更と内部から外部への変更

この例では、ALTER USER文を使用して、user2内部ユーザーを外部ユーザーに変更してから、内部ユーザーに戻します。

Command> ALTER USER user2 IDENTIFIED EXTERNALLY;
 
User altered.

ALTER USER文を使用して、user2外部ユーザーを内部ユーザーに戻します。

Command> ALTER USER user2 IDENTIFIED BY user2_password_change;
 
User altered.

CALL

CALL文を使用して、TimesTen組込みプロシージャを実行したり、スタンドアロンまたはSQLのパッケージに含まれるPL/SQLプロシージャまたはファンクションを実行します。

必要な権限

各TimesTen組込みプロシージャの実行に必要な権限は、『Oracle TimesTen In-Memory Databaseリファレンス』組込みプロシージャに関する項に示された各プロシージャの説明を参照してください。

CALL文を使用して、スタンドアロンまたはパッケージに含まれる独自のPL/SQLプロシージャまたはファンクションをコールする所有者には、必要な権限はありません。その他のすべてのユーザーには、プロシージャまたはファンクション、またはこれらが定義されているパッケージに対するEXECUTE権限が必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

TimesTen組込みプロシージャをコールする場合:

CALL TimesTenBuiltIn [( arguments )]

スタンドアロンまたはパッケージに含まれるPL/SQLプロシージャまたはファンクションをコールする場合、名前でコールするか、式の結果としてコールできます。

PL/SQLプロシージャをコールする場合:

CALL [Owner.][Package.]ProcedureName [( arguments )]

パラメータを返すPL/SQLファンクションをコールする場合は、次のいずれかが適切です。

CALL [Owner.][Package.]FunctionName [( arguments )] INTO :return_param

ノート:

ユーザー独自のPL/SQLプロシージャまたはファンクションは、同じ名前のTimesTen組込みプロシージャよりも優先されます。

パラメータ

パラメータ 説明

TimesTenBuiltIn

TimesTen組込みプロシージャの名前。TimesTen組込みプロシージャの完全なリストは、『Oracle TimesTen In-Memory Databaseリファレンス』組込みプロシージャに関する項を参照してください。

[Owner.]ProcedureName

PL/SQLプロシージャの名前。オプションで、プロシージャの所有者を指定できます。

[Owner.]FunctionName

PL/SQLファンクションの名前。オプションで、ファンクションの所有者を指定できます。

arguments

PL/SQLプロシージャまたはファンクションの0個以上の引数を指定します。

INTO

ルーチンがファンクションである場合は、INTO句が必要です。

return_param

ファンクションの戻り値を格納するホスト変数を指定します。

説明

TimesTenでCALL文を使用してPL/SQLプロシージャまたは関数を実行する方法の詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』プロシージャおよび関数の実行に関する項『Oracle TimesTen In-Memory Database C開発者ガイド』CALLを使用したプロシージャおよび関数の実行に関する項または『Oracle TimesTen In-Memory Database Java開発者ガイド』CALLを使用したプロシージャおよび関数の実行に関する項を参照してください。

次に、mytestファンクションの定義を示します。

create or replace function mytest return number is
begin
  return 1;
end;
/

次に示すように、CALL文でmytestファンクションを実行します。

Command> variable n number;
Command> call mytest() into :n;
Command> print n;
N                    : 1

次の例では、入力として従業員IDが指定された従業員の給与を戻すファンクションを作成し、ファンクションをコールして、戻された結果を表示します。

Command> CREATE OR REPLACE FUNCTION get_sal
          (p_id employees.employee_id%TYPE) RETURN NUMBER IS
            v_sal employees.salary%TYPE := 0;
         BEGIN
           SELECT salary INTO v_sal FROM employees
             WHERE employee_id = p_id;
           RETURN v_sal;
         END get_sal;
         /
 
Function created.
 
Command> variable n number;
Command> call get_sal(100) into :n;
Command> print n;
N                    : 24000

COMMIT

COMMIT文は、現在のトランザクションを終了し、そのトランザクション内で実行されたすべての変更を永続的な変更とします。

必要な権限

なし

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

COMMIT [WORK]

パラメータ

COMMIT文では次のオプションのキーワードを使用できます。

パラメータ 説明

[WORK]

SQL標準に準拠するためにサポートされているオプションの句。COMMITCOMMIT WORKは同等です。

説明

  • トランザクションのコミット前:

    • トランザクション中に行った変更はすべて表示できますが、他のユーザーがそれらの変更を表示することはできません。トランザクションをコミットすると、コミット後に実行される他のユーザーの文に変更が表示されるようになります。

    • ROLLBACK文を使用して、トランザクション中に行った変更をロールバック(UNDO)できます。

  • この文によって、トランザクションのロックが解除されます。

  • パススルーの場合も、Oracle Databaseトランザクションはコミットされます。

  • コミットによってすべてのオープン・カーソルがクローズされます。

HRスキーマのregions表に行を挿入し、トランザクションをコミットします。最初にautocommitを0(ゼロ)に設定します。

Command> SET AUTOCOMMIT 0;
Command> INSERT INTO regions VALUES (5,'Australia');
1 row inserted.
Command> COMMIT;
Command> SELECT * FROM regions;
< 1, Europe >
< 2, Americas >
< 3, Asia >
< 4, Middle East and Africa >
< 5, Australia >
5 rows found.

関連項目

ROLLBACK

CREATE ACTIVE STANDBY PAIR

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

この文は、アクティブ・スタンバイ・ペアを作成します。アクティブ・マスター・データベースとスタンバイ・マスター・データベースが含まれており、1つ以上の読取り専用サブスクライバが含まれる場合もあります。アクティブ・マスター・データベースはスタンバイ・マスター・データベースへ更新をレプリケートし、スタンバイ・マスター・データベースはサブスクライバへ更新を伝播します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

CREATE ACTIVE STANDBY PAIR
  FullStoreName, FullStoreName [ReturnServiceAttribute]
    [SUBSCRIBER FullStoreName [,...]]
    [STORE FullStoreName [StoreAttribute [...]]]
    [NetworkOperation [...] ]
    [{ INCLUDE | EXCLUDE }{TABLE [[Owner.]TableName [,...]]|
         CACHE GROUP [[Owner.]CacheGroupName [,...]]|
         SEQUENCE [[Owner.]SequenceName [,...]]} [,...]]

ReturnServiceAttributeの構文を次に示します。

{ RETURN RECEIPT [BY REQUEST] |
  RETURN TWOSAFE [BY REQUEST] |
  NO RETURN }

StoreAttributeの構文を次に示します。

  DISABLE RETURN {SUBSCRIBER | ALL} NumFailures 
  RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED 
  DURABLE COMMIT {ON | OFF}
  RESUME RETURN Milliseconds 
  LOCAL COMMIT ACTION {NO ACTION | COMMIT} 
  RETURN WAIT TIME Seconds 
  COMPRESS TRAFFIC {ON | OFF}
  PORT PortNumber 
  TIMEOUT Seconds 
  FAILTHRESHOLD Value 
  TABLE DEFINITION CHECKING {RELAXED|EXACT}

NetworkOperationの構文は、次のとおりです。

ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName
  { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost }
      PRIORITY Priority } [...]

パラメータ

パラメータ 説明

FullStoreName

次のいずれかとして指定されたデータベースです。

  • SELF

  • データベース・ファイル名の接頭辞

たとえば、データベースのパスがdirectory/subdirectory/data.ds0の場合、使用するデータベース名はdataになります。

この名前は、DSNの記述のDataStore属性で指定されるデータベース・ファイル名で、オプションでホストIDを次の書式で指定できます。

DataStoreName [ON Host]

Hostは、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』ネットワークの構成に関する項で説明されているように、IPアドレスまたは1つ以上のIPアドレスに割り当てられたリテラル・ホスト名です。ホスト名に特殊文字が含まれている場合は、二重引用符で囲む必要があります。たとえば、"MyHost-500"のようになります。

RETURN RECEIPT [BY REQUEST]

RETURN RECEIPTサービスを有効にし、これによって、アクティブ・マスター・データベースに対してトランザクションをコミットするアプリケーションは、スタンバイ・マスター・データベースがトランザクションを受信するまでブロックされます。

RETURN RECEIPTを指定すると、すべてのトランザクションにサービスが適用されます。RETURN RECEIPT BY REQUESTを指定した場合は、ttRepSyncSetプロシージャを使用して、選択したトランザクションに対してRETURN RECEIPTサービスを有効にできます。RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

RETURN TWOSAFE[BY REQUEST]

RETURN TWOSAFEサービスを有効にし、これによって、アクティブ・マスター・データベースに対してトランザクションをコミットするアプリケーションは、スタンバイ・マスター・データベースでトランザクションがコミットされるまでブロックされます。

RETURN TWOSAFEを指定すると、すべてのトランザクションにサービスが適用されます。RETURN TWOSAFE BY REQUESTを指定した場合は、ttRepSyncSetプロシージャを使用して、選択したトランザクションに対してRETURN RECEIPTサービスを有効にできます。

RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

DISABLE RETURN {SUBSCRIBER | ALL} NumFailures

NumFailuresで指定されているタイムアウト回数を経過した後、RETURNサービスのブロッキングを無効にするようにRETURNサービス障害ポリシーを設定します。

SUBSCRIBERを指定することは、ALLを指定することと同じです。両方の設定でスタンバイ・マスター・データベースが参照されます。

この障害ポリシーは、RETURN RECEIPTまたはRETURN TWOSAFEサービスのいずれかで指定できます。

RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED

レプリケーションが無効になっている場合のRETURNサービスのオンまたはオフを設定します。

OFFは、レプリケーション無効時にRETURNサービスを無効する設定であり、RETURN RECEIPTサービスのデフォルトです。ONは、レプリケーション無効時にもRETURNサービスを有効のままにできる設定であり、RETURN TWOSAFEサービスのデフォルトです。

『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの失敗/リカバリ・ポリシーの策定に関する項を参照してください。

RESUME RETURN Milliseconds

DISABLE RETURNによってRETURNサービスのブロッキングが無効になった場合、この属性で、RETURNサービスを再度有効にするタイミングに関するポリシーを設定します。

NO RETURN

RETURNサービスを使用しないように指定します。これがデフォルトです。

RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

RETURN WAIT TIME Seconds

RETURNサービスの応答を待機する秒数を指定します。値が0(ゼロ)の場合は、待機しないことを意味します。デフォルト値は10秒です。

このタイムアウト設定は、アプリケーションからttRepSyncSet組込みプロシージャのreturnWaitパラメータを使用して上書きできます。

SUBSCRIBER FullStoreName [,...]]

マスター・データベースから更新を受け取るデータベース。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

STORE FullStoreName [StoreAttribute [...]]

指定されたデータベースの属性を定義します。属性には、PORTTIMEOUTおよびFAILTHRESHOLDがあります。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベース・ファイル名です。

TABLE DEFINITION CHECKING {EXACT|RELAXED}

StoreAttribute句。

サブスクライバで実行される表定義チェックの種類を指定します。

  • EXACT: マスターおよびサブスクライバで表が一致している必要があります。

  • RELAXED: 表には同じキー定義、列の数および列のデータ型が必要です。

デフォルトはRELAXEDです。

ノート: TABLE DEFINITION CHECKING EXACTを使用している場合、データベースを移行するにはttMigrate -exactUpgradeを使用します。TABLE DEFINITION CHECKING RELAXEDを使用している場合、データベースを移行するにはttMigrate -relaxedUpgradeを使用します。

{INCLUDE | EXCLUDE}

{TABLE [[Owner.]TableName[,...]]|

CACHE GROUP

[[Owner.]CacheGroupName

[,...]]|

SEQUENCE

[[Owner.]SequenceName

[,...]]}

[,...]

デフォルトでは、アクティブ・スタンバイ・ペアはデータベース全体をレプリケートします。

INCLUDEを指定すると、指定された表、順序またはキャッシュ・グループのみがレプリケーション・スキームに含まれます。INCLUDE句は、オブジェクト型(表、順序またはキャッシュ・グループ)ごとに1つ使用します。

EXCLUDEを指定すると、表、順序またはキャッシュ・グループがレプリケーション・スキームから除外されます。EXCLUDE句は、オブジェクト型(表、キャッシュ・グループまたは順序)ごとに1つ使用します。

EXCLUDE句はAWTキャッシュ・グループに対して使用しないでください。

COMPRESS TRAFFIC {ON | OFF}

レプリケートされた通信量を圧縮して、ネットワークの帯域幅の量を削減します。ONは、STOREで定義されたデータベースに対してレプリケートされた通信量をすべて圧縮するように指定します。OFF(デフォルト)は、通信量を圧縮しないように指定します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケートされた通信量の圧縮に関する項を参照してください。

DURABLE COMMIT {ON | OFF}

DurableCommits一般接続属性設定を上書きします。DURABLE COMMIT ONは、レプリケーション・エージェントが実行中か停止しているかに関係なく、永続コミットを有効にします。また、ttRepStateSave組込みプロシージャでスタンバイ・データベースがfailedとしてマークされている場合も、永続コミットが有効になります。

FAILTHRESHOLD Value

サブスクライバ・データベースのために累積できるログ・ファイルの数。この値を超えると、サブスクライバはFailedの状態に設定されます。0を指定すると、この上限は設定されません。これがデフォルトです。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』トランザクション・ログ障害しきい値の設定に関する項を参照してください。

LOCAL COMMIT ACTION {NO ACTION | COMMIT}

タイムアウト・イベントのRETURN TWOSAFEトランザクションで実行されるデフォルトのアクションを指定します。

ノート: この属性は、RETURN TWOSAFEまたはRETURN TWOSAFE BY REQUEST属性がSUBSCRIBER句で設定されている場合にのみ有効です。

NO ACTION: タイムアウト時、コミット関数はアプリケーションに戻り、トランザクションをコミット・コールに入ったときと同じ状態のままにしますが、レプリケートされた表をアプリケーションが更新できない場合を除きます。アプリケーションはコミットのみを再発行できます。トランザクションはロールバックできません。これがデフォルトです。

COMMIT: タイムアウト時、コミット関数はCOMMITを実行して、トランザクションをローカルに終了しようとします。同じトランザクション上でこれ以上の処理を行うことはできません。

この設定は、ttRepSyncSetプロシージャのlocalActionパラメータをコールすることで、特定のトランザクションに対して無効にすることができます。

MASTER FullStoreName

アプリケーションで特定の要素が更新されるデータベース。更新はMASTERデータベースによってSUBSCRIBERデータベースに送信されます。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベースである必要があります。

PORT PortNumber

データベースのレプリケーション・エージェントが接続をリスニングするTCP/IPポート番号です。指定しない場合は、レプリケーション・エージェントによってポート番号が自動的に割り当てられます。

アクティブ・スタンバイ・ペアでは、スタンバイ・マスター・データベースは、アクティブ・マスター・データベースからの更新をリスニングします。読取り専用サブスクライバは、スタンバイ・マスター・データベースからの更新をリスニングします。

ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName

NetworkOperation句を表します。指定されている場合、各サブスクライバ・ストアへのすべてのアウトバウンド接続にマスター・ストアが使用するネットワーク・インタフェースを制御できます。ROUTE句のコンテキストでは、次のルートを定義できます。

  • フェイルオーバーが発生したときのアクティブ・データベースからスタンバイ・データベースおよびスタンバイ・データベースからアクティブ・データベースへのルート

  • 読取り専用サブスクライバからアクティブおよびスタンバイ・データベースへのルート

アクティブ・スタンバイ・ペアを使用する場合、読取り専用サブスクライバがないアクティブ・スタンバイ・ペアに対してROUTEを少なくとも2回指定する必要があります。次に、アクティブ・スタンバイ・ペアの各読取り専用サブスクライバに対してROUTEを2回多く指定する必要があります。

FullStoreNameには、ON "host"を指定する必要があります。

MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost

MasterHostおよびSubscriberHostは、マスターおよびサブスクライバ・ストアのネットワーク・インタフェースのIPアドレスです。IPV6のドット表記または正規形式で指定するか、あるいはコロン表記で指定します。

句は複数回指定できます。

PRIORITY Priority

1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。

NetworkOperation 句の構文で必須です。MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost句の後ろに記述します。

TIMEOUT Seconds

レプリケーション・エージェントがリモート・レプリケーション・エージェントからの応答を待機する最大時間(秒)。デフォルトは120秒です。

アクティブ・スタンバイ・ペアでは、アクティブ・マスター・データベースは、スタンバイ・マスター・データベースにメッセージを送信します。スタンバイ・マスター・データベースは、読取り専用サブスクライバにメッセージを送信します。

ノート: リモート・レプリケーション・エージェントからの応答の遅延の原因となる大規模なトランザクションの場合、エージェントは、トランザクションのサイズに基づいて、タイムアウトをスケーリングします。TIMEOUTを60秒以下に設定した場合、このスケーリングは無効になります。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』リモート・レプリケーション・エージェントからの応答タイムアウトの待機設定に関する項も参照してください。

説明

  • アクティブ・スタンバイ・ペアを作成した後、データベースの1つをアクティブ・データベースにします。そのためには、ttRepStateSet ('ACTIVE')をコールします。次に、ttRepAdminを使用して、アクティブ・データベースをセカンダリ・データベースに複製します。処理が完了すると、セカンダリ・データベースがスタンバイ・データベースになります。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』キャッシュ・グループのないアクティブ・スタンバイ・ペアの設定に関する項を参照してください。

  • SUBSCRIBER句には、1つ以上の読取り専用サブスクライバ・データベースを指定します。最大127のサブスクライバ・データベースを指定できます。

  • アクティブ・マスター・データベースとスタンバイ・マスター・データベースの間のレプリケーションは、RETURN TWOSAFERETURN RECEIPTまたは非同期のいずれかに設定できます。RETURN TWOSAFEに設定すると、トランザクションは失われません。

  • 指定された表、順序およびキャッシュ・グループをレプリケーションから除外する場合、または指定された表、順序およびキャッシュ・グループのみを含めて他は除外する場合は、INCLUDEおよびEXCLUDE句を使用します。

  • アクティブ・スタンバイ・ペアにRETURN TWOSAFE属性があり、キャッシュ・グループをレプリケートしている場合、次のような状態のときにトランザクションが失敗する可能性があります。

    • レプリケートされるトランザクションにALTER TABLE文またはALTER CACHE GROUP文が含まれている。

    • トランザクションに、レプリケートされた表、レプリケートされたキャッシュ・グループまたはASYNCHRONOUS WRITETHROUGHキャッシュ・グループに対するINSERTUPDATEまたはDELETE文が含まれている。

  • アクティブ・スタンバイ・ペアを使用して読取り専用キャッシュ・グループおよびASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループをレプリケートできます。アクティブ・スタンバイ・ペアを使用してSYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループまたはユーザー管理キャッシュ・グループをレプリケートすることはできません。

  • EXCLUDE句はAWTキャッシュ・グループに対して使用できません。

  • TimesTenでOracle Clusterwareを使用する場合は、CREATE ACTIVE STANDBY PAIR文は実行できません。

この例では、マスター・データベースがrep1およびrep2であるアクティブ・スタンバイ・ペアを作成します。サブスクライバrep3が1つあります。レプリケーションのタイプはRETURN RECEIPTです。また、この文では、PORTおよびTIMEOUT属性をマスター・データベースに対して設定します。

CREATE ACTIVE STANDBY PAIR rep1, rep2 RETURN RECEIPT
  SUBSCRIBER rep3
  STORE rep1 PORT 21000 TIMEOUT 30
  STORE rep2 PORT 22000 TIMEOUT 30;

NetworkOperation句を指定してネットワーク・インタフェースを制御します。

CREATE ACTIVE STANDBY PAIR rep1,rep2
ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2"
MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2" PRIORITY 1;
ROUTE MASTER rep2 ON "machine2" SUBSCRIBER rep1 ON "machine1"
MASTERIP "2.2.2.2" PRIORITY 1 SUBSCRIBERIP "1.1.1.1" PRIORITY 1;

CREATE CACHE GROUP

CREATE CACHE GROUP文は、次の処理を実行します。

  • キャッシュ・グループで定義される表を作成します。

  • キャッシュ・グループに関連付けられたすべての新しい情報を、適切なシステム表にロードします。

キャッシュ・グループとは、Oracle Databaseの表からデータをキャッシュする表のセットのことで、外部キーを介して関連付けられます。ルート表は1つで、この表は他の表を参照しません。キャッシュ・グループに含まれる他のすべてのキャッシュ表は、キャッシュ・グループ内の表を1つのみ参照します。つまり、外部キーのリレーションシップによってツリーが形成されます。

キャッシュ表は、次の条件を満たす行の集合です。

  • Oracle Database表の垂直パーティションの行のサブセットで構成されている。

  • Oracle Database表と同じ名前でTimesTen表に格納されている。

データベースに2つ以上のキャッシュ・グループがある場合、キャッシュ・グループは別々のOracle Database(およびTimesTen)表に対応している必要があります。

キャッシュ・グループ・インスタンスは、ルート表の1つの行と、ルート表の行に直接的または間接的に関連付けられている子表のすべての行を参照します。

キャッシュ・グループは、システム管理またはユーザー管理のいずれかになります。

システム管理キャッシュ・グループは、TimesTenによって完全に管理され、プロパティは固定されています。システム管理キャッシュ・グループには、次のタイプがあります。

  • 読取り専用キャッシュ・グループはOracle Databaseで更新され、Oracle Databaseからキャッシュに更新が伝播されます。

  • ASYNCHRONOUS WRITETHROUGH(AWT)キャッシュ・グループはキャッシュで更新され、Oracle Databaseに更新が伝播されます。トランザクションはOracle Databaseでのコミットを待機せずに、キャッシュ上で続行します。

  • SYNCHRONOUS WRITETHROUGH(SWT)キャッシュ・グループはキャッシュで更新され、Oracle Databaseに更新が伝播されます。トランザクションは、Oracle Databaseでコミットが発生したことを通知した後、キャッシュ上でコミットされます。

ローディングやアンローディングなど、システム管理のキャッシュ・グループはTimesTenによって管理されるため、これらのキャッシュ・グループの定義では、次のような特定の文や句は使用できません。

  • AWTおよびSWTキャッシュ・グループ定義でのWHERE

  • キャッシュ表定義でのREADONLYPROPAGATEおよびNOT PROPAGATE

  • AWTおよびSWTキャッシュ・グループ定義でのAUTOREFRESH

FLUSH CACHE GROUPおよびREFRESH CACHE GROUP操作は、AWTおよびSWTキャッシュ・グループでは使用できません。

AWTキャッシュ・グループを作成する前に、レプリケーション・エージェントを停止する必要があります。

ユーザー管理キャッシュ・グループは、アプリケーションまたはユーザーによって管理される必要があります。ユーザー管理キャッシュ・グループのPROPAGATEは、同期型です。表レベルのREADONLYキーワードは、ユーザー管理キャッシュ・グループでのみ使用できます。

さらに、TimesTenおよびOracle Databaseの両方ですべてのWHERE句を解析できる必要があります。

キャッシュ・グループは、明示的または動的にロードできます。

明示的にロードされるキャッシュ・グループでは、LOAD CACHE GROUPまたはREFRESH CACHE GROUP文を使用してOracle Database表からTimesTenキャッシュ表に手動で新しいキャッシュ・インスタンスをロードするか、または自動リフレッシュ操作を使用して自動でロードします。

動的キャッシュ・グループでは、LOAD CACHE GROUPを使用してTimesTenキャッシュ表に手動で新しいキャッシュ・インスタンスをロードするか、または動的ロード操作を使用して要求時にロードできます。動的ロード操作では、いずれかのキャッシュ表でSELECTUPDATEDELETE、またはINSERT文が発行され、データがキャッシュ表に存在しないもののキャッシュされたOracle Database表には存在すると、キャッシュされたOracle Database表からTimesTenキャッシュ表にデータが自動的にロードされます。動的キャッシュ・グループでの手動リフレッシュ操作または自動リフレッシュ操作では、既存のキャッシュ・インスタンスの更新または削除はできますが、新しいキャッシュ・インスタンスのロードはできません。

どのキャッシュ・グループ・タイプ(読取り専用、ASYNCHRONOUS WRITETHROUGH、SYNCHRONOUS WRITETHROUGH、ユーザー管理)でも、明示的にロードされるキャッシュ・グループとして定義できます。

AUTOREFRESHキャッシュ・グループ属性とPROPAGATEキャッシュ表属性の両方を持つユーザー管理キャッシュ・グループを除いて、どのキャッシュ・グループ・タイプでも動的キャッシュ・グループとして定義できます。

LRUエージングがデフォルトで定義されているため、動的キャッシュ・グループのデータはエージ・アウトされます。組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいは両方)を使用して、LRUエージングの領域使用しきい値を上書きします。また、動的キャッシュ・グループに時間ベースのエージングを定義して、LRUエージングを上書きすることもできます。

静的および動的キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループおよびキャッシュ表に関する項を参照してください。

必要な権限

CREATE CACHE GROUPまたはCREATE ANY CACHE GROUPおよびCREATE TABLE(キャッシュ・グループ内のすべての表が現在のユーザーによって所有されている場合)またはCREATE ANY TABLE(キャッシュ・グループ内の1つ以上の表が現在のユーザーによって所有されていない場合)。

TimesTen Scaleoutでの使用

増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループがサポートされています。

SQL構文: TimesTen Scaleout

TimesTen Scaleoutの静的読取り専用キャッシュ・グループの場合:
CREATE READONLY CACHE GROUP [Owner.]GroupName
 [AUTOREFRESH 
    [MODE INCREMENTAL]
    [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S]}]
    [STATE {ON|OFF|PAUSED}]
  ]
  FROM
    [Owner.]TableName (ColumnDefinition[,...][,PRIMARY KEY(ColumnName[,...])])
  [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
  [ParentDistributionClause]
    [WHERE ExternalSearchCondition]
  [,[Owner.]TableName (ColumnDefinition[,...]
    [,PRIMARY KEY(ColumnName[,...])]
    [,FOREIGN KEY(ColumnName[,...])
        REFERENCES RefTableName (ColumnName [,...])[ON DELETE CASCADE]])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [ChildDistributionClause]
   [WHERE ExternalSearchCondition]
 [,...]
 ]

The syntax for the distribution clause for a parent:
ParentDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] | DUPLICATE

The syntax for the distribution clause for a child:
ChildDistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] |
 DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)] | DUPLICATE

SQL構文: TimesTen Classic

読取り専用キャッシュ・グループの場合:

CREATE [DYNAMIC] [HYBRID] READONLY CACHE GROUP [Owner.]GroupName
 [AUTOREFRESH
  [MODE {INCREMENTAL | FULL}]
  [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S] }]
  [STATE {ON|OFF|PAUSED}]
 ]
 FROM
  [Owner.]TableName (
    {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
    [,FOREIGN KEY(ColumnName [,...])
            REFERENCES RefTableName (ColumnName [,...])]
                    [ON DELETE CASCADE])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
         USE ColumnName
         LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
         [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
        }[ON|OFF]
 ]
 [WHERE ExternalSearchCondition]
} [,...]

非同期ライトスルー・キャッシュ・グループの場合:

CREATE [DYNAMIC] [ASYNCHRONOUS] WRITETHROUGH CACHE GROUP   [Owner.]GroupName
  FROM
   {[Owner.]TableName (
     {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
     [FOREIGN KEY(ColumnName [,...])
          REFERENCES RefTableName (ColumnName [,...])]
      [ON DELETE CASCADE])
 UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
     USE ColumnName
          LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
         [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
     }[ON|OFF]
 ]
} [,...]

同期ライトスルー・キャッシュ・グループの場合:

CREATE [DYNAMIC] SYNCHRONOUS WRITETHROUGH
CACHE GROUP [Owner.]GroupName
 FROM 
   {[Owner.]TableName (
     {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
     [FOREIGN KEY(ColumnName [,...])
            REFERENCES RefTableName (ColumnName [,...])]
   [ON DELETE CASCADE])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
     USE ColumnName
         LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
         [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
     }[ON|OFF]
 ]
} [,...]

ユーザー管理キャッシュ・グループの場合:

CREATE [DYNAMIC][USERMANAGED] CACHE GROUP [Owner.]GroupName
 [AUTOREFRESH
   [MODE {INCREMENTAL | FULL}]
   [INTERVAL IntervalValue {MINUTE[S] | SECOND[S] | MILLISECOND[S] }]
   [STATE {ON|OFF|PAUSED}]
 ]
  FROM 
   {[Owner.]TableName (
    {ColumnDefinition[,...]}
    [,PRIMARY KEY(ColumnName[,...])]
    [FOREIGN KEY(ColumnName[,...])
          REFERENCES RefTableName (ColumnName [,...])]
    [ON DELETE CASCADE]
    [,{READONLY | PROPAGATE | NOT PROPAGATE}])
 [UNIQUE HASH ON (HashColumnName[,...]) PAGES=PrimaryPages]
 [AGING {LRU|
         USE ColumnName
             LIFETIME Num1 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}
             [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
        }[ON|OFF]
 ]
 [WHERE ExternalSearchCondition]
} [,...]

パラメータ

キャッシュ・グループ定義のFROMキーワードより前のパラメータは次のとおりです。

パラメータ 説明

[Owner.]GroupName

新しいキャッシュ・グループに割り当てられる所有者および名前です。

DYNAMIC

TimesTen Classicのみでサポートされています。

指定すると、動的キャッシュ・グループが作成されます。

HYBRID

TimesTen Classicのみでサポートされています。

指定すると、Oracleデータベースにルート表が存在しない動的な読取り専用キャッシュ・グループになります。

AUTOREFRESH

AUTOREFRESHパラメータは、Oracle Databaseからキャッシュ・グループに自動的に変更を伝播します。

MODE [INCREMENTAL | FULL]

自動リフレッシュ時に更新されるキャッシュ内の行を指定します。INCREMENTAL句が指定された場合、TimesTenは前回の伝播以降にOracle Databaseに加えられた変更のみをリフレッシュします。FULL句が指定された場合、TimesTenは自動リフレッシュのたびにキャッシュ内のすべての行を更新します。デフォルトの自動リフレッシュ・モードはINCREMENTALです。

TimesTen Scaleoutでは、MODE INCREMENTALがサポートされています。

INTERVAL IntervalValue

自動リフレッシュを行う時間隔を分、秒またはミリ秒の単位で指定します。IntervalValueには、自動リフレッシュを実行する頻度を分、秒またはミリ秒の単位の整数値で指定します。IntervalValueのデフォルト値は5分です。自動リフレッシュ間隔を0ミリ秒に設定すると、連続的な自動リフレッシュが可能になり、最後の自動リフレッシュ・サイクルが終了した直後に次の自動リフレッシュ・サイクルがスケジュールされます。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』キャッシュ・グループの自動リフレッシュに関する項を参照してください。

指定した時間隔でAUTOREFRESHを完了できない場合は、実行時に警告が生成され、現在の処理が終了するまで次回のAUTOREFRESHを待機します。待機キューが10に達すると、サポート・ログに通知メッセージが生成されます。

STATE [ON | OFF | PAUSED]

キャッシュ・グループの作成時に自動リフレッシュをONOFFまたはPAUSEDのいずれにするかを設定します。この設定は、ALTER CACHE GROUP文を使用して後で変更できます。デフォルトでは、AUTOREFRESHの状態はPAUSEDです。

FROM

キャッシュ・グループに1つ以上の表定義を指定します。

FROMキーワード以降のすべての記述は、キャッシュ・グループがキャッシュするOracle Database表の定義で構成されています。各表定義の構文は、CREATE TABLE文と同様です。ただし、キャッシュ・グループ表には、主キー制約が必要です。

表定義には次のパラメータがあります。

パラメータ 説明

[Owner.]TableName

新しい表に割り当てる所有者および名前です。 所有者名を指定しない場合は、新しい表の所有者名としてログイン名が使用されます。

ColumnDefinition

表の個々の列の名前、データ型およびNULL値可能かどうかを指定します。各表には、列が少なくとも1つ必要です。

PRIMARY KEY (ColumnName[,...])

表に主キーを指定します。キャッシュ・グループには、主キー制約が必要です。ColumnNameは、作成される表の主キー列の名前です。主キーには最大16列を指定できます。1つの指定内でUNIQUEとともに指定することはできません。

FOREIGN KEY (ColumnName[,...])

表に外部キーを指定します。ColumnNameは、作成される表の外部キー列の名前です。

REFERENCES RefTableName (ColumnName[,...])

外部キーを関連付ける表を指定します。RefTableNameは参照される表の名前で、ColumnNameはその表の参照される列の名前です。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

READONLY

キャッシュされた表に対する変更の禁止を指定します。

PROPAGATE|NOT PROPAGATE

TimesTen Classicのみでサポートされています。

キャッシュされた表への変更が、コミット時に自動的に対応するOracle Database表に伝播されるかどうかを指定します。

UNIQUE HASH ON (HashColumnName)

この表にハッシュ索引を作成することを指定します。HashColumnNameには、この表のハッシュ・キーに含める列を指定します。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

ハッシュ索引の詳細は、「CREATE TABLE」を参照してください。

WHERE ExternalSearchCondition

Oracle Databaseでキャッシュ・グループに対して評価されるWHERE句。このWHERE句は、キャッシュ・グループに対するすべてのLOADREFRESH処理に追加されます。他の表を直接参照することはできません。TimesTenとOracle Databaseの両方で解析されます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』WHERE句の使用に関する項を参照してください。

ParentDistributionClause

TimesTen Scaleoutの場合は、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループ内の親表に対する分散句です。次の分散スキームが親表でサポートされています。

  • DISTRIBUTE BY HASH [(ColumnName [,...])]

  • DUPLICATE

ChildDistributionClause

TimesTen Scaleoutの場合は、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループ内の子表に対する分散句です。次の分散スキームが子表でサポートされています。

  • DISTRIBUTE BY HASH [(ColumnName [,...])]

  • DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)]

  • DUPLICATE

AGING LRU [ON | OFF]

TimesTen Classicのみでサポートされています。

指定する場合、ルート表にLRUエージング・ポリシーを定義します。LRUエージング・ポリシーはキャッシュ・グループのすべての表に適用します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

動的キャッシュ・グループでは、LRUエージングはデフォルトでONになります。ただし、時間ベースのエージングを指定したり、LRUエージングを構文レベルでOFFに設定することができます。

キャッシュ・グループが動的でないかぎり、自動リフレッシュ属性が指定されたキャッシュ・グループにはLRUエージングを指定できません。

LRU属性は、組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいはその両方)をコールすることで定義します。LRU属性はSQLレベルでは定義できません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttAgingLRUConfigに関する項およびttAgingTableLRUConfigに関する項と、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』表へのエージング・ポリシーの実装に関する項を参照してください。

AGING USE ColumnName...[ON|OFF]

TimesTen Classicのみでサポートされています。

指定する場合、ルート表に時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーはキャッシュ・グループのすべての表に適用します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLTIMESTAMPデータ型またはDATEデータ型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(秒、分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列はNULLにはできません)。

時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』TimesTen Classicのキャッシュ・グループへのエージングの実装に関する項を参照してください。

LIFETIME Num1 {SECOND[S]|MINUTE[S]|HOUR[S]DAY[S]}

TimesTen Classicのみでサポートされています。

LIFETIMEは時間ベースのエージング属性で、必須の句です。

AGING USE ColumnName句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、秒、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。

[CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S]|DAY[S]}]

TimesTen Classicのみでサポートされています。

CYCLEは時間ベースのエージング属性で、オプションです。LIFETIME句の後にCYCLE句を指定します。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定した場合、エージング・スレッドは1秒ごとに起動します。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

TimesTen Scaleoutのキャッシュ・グループ

TimesTen Scaleoutは、増分自動リフレッシュを使用した静的読取り専用キャッシュ・グループがサポートしています。分散スキームは、親表と1つ以上の子表に指定できます。分散スキームでは、データベースの要素間にデータを分散する方法を指定します。

分散スキームは、DISTRIBUTE BY句によって示されます。
  • 単一表キャッシュ・グループの場合、デフォルトの分散スキームはHASHです。
  • DISTRIBUTE BY句で列を指定しない場合は、主キー列が分散スキームのキー列として使用されます。
  • 複数表キャッシュ・グループの場合は、親表にHASHまたはDUPLICATEの分散スキームを指定できます。DUPLICATE分散スキームを定義する場合は、子表にHASHまたはDUPLICATEのみを指定できます。
  • 複数表キャッシュ・グループの場合は、HASHが親表のデフォルト分散スキームになり、すべての子表はREFERENCE分散スキームにデフォルト設定されます。親表にDUPLICATEを指定して、子表に分散スキームを指定しない場合、子表のデフォルト分散スキームはDUPLICATEになります。
  • 子表の外部キーと親表の主キーが同じ場合、子表には最適化としてHASH分散スキームが使用されます。
  • 子表は参照によって分散することをお薦めします。

分散スキームの詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』TimesTen ScaleoutにおけるTimesTen Cacheの分散スキームに関する項を参照してください。

次のものはサポートされません。
  • 完全自動リフレッシュ・モード
  • エージング
  • マテリアライズド・ビュー
  • グローバル索引

TimesTen Scaleoutの静的読取り専用キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』TimesTen Scaleoutのキャッシュ・グループの使用に関する項を参照してください。

TimesTen Classicのキャッシュ・グループ

動的ハイブリッド読取り専用キャッシュ・グループ

動的ハイブリッド読取り専用キャッシュ・グループとは、Oracleデータベースにルート表が存在しない動的な読取り専用キャッシュ・グループのことです。ルート表は、キャッシュ・グループ定義から自動的にTimesTenデータベースに作成されます。キャッシュ・グループ定義には、このルート表がOracleデータベースに存在するかのような記述が含まれています。

説明および制限:
  • ルート表は、Oracleデータベースに存在していないことが必要です。
  • TimesTenデータベース内のルート表には、主キーが必要です。
  • ルート表には、主キーの列のみを含めることができます。主キーは、少なくとも1つの子表から参照される必要があります。
  • 動的ロードのトリガーには、SELECT文のFROM句で導出表を使用できます。SELECT問合せでは、同じハイブリッド・キャッシュ・グループの複数の表を指定することもできます。
  • TimesTenデータベース内のルート表に対してSELECT問合せを発行した場合は、このSELECT操作が動的ロードをトリガーすることはありません。
  • このタイプのキャッシュ・グループには、時間ベースのエージングを指定できません。LRUエージングは、デフォルトで有効になっています。
  • キャッシュ・グループ定義では、WHERE句はサポートされません。
  • LOAD CACHE GROUP文を使用して、手動でキャッシュ・グループをロードすることはできません。
  • UNLOAD CACHE GROUP ...WITH ID文はサポートされません。

動的ハイブリッド読取り専用キャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』ハイブリッド・キャッシュ・グループに関する項を参照してください。

キャッシュ・グループの説明

  • 2つのキャッシュ・グループで所有者名とグループ名を同じにすることはできません。所有者名を指定しない場合、スキーマは新しいキャッシュ・グループの所有者名になります。

  • キャッシュ表名およびキャッシュ・グループ名のどちらにも、#を含めることはできません。

  • WHERE句に動的パラメータを指定することはできません。

  • Oracle Databaseの一時表はキャッシュできません。

  • 各表は、Oracle Databaseの表と対応している必要があります。

  • Oracle Databaseでは、親子関係を定義して、子表の外部キー列にNULL値を挿入できます。子表の該当行は、NULL親を参照していることになります。この状態で、キャッシュ・グループを作成して、Oracle Database表の親子関係をキャッシュできます。ただし、Oracle Database表からキャッシュ・グループにデータをロードする場合は、外部キー列にNULL値を持つ行はロードされません。TimesTenでは、キャッシュする表で、外部キーがNULL親を表す親子関係が定義された場合は、キャッシュ・グループを作成しないことをお薦めします。

  • 小文字のデリミタ付き識別子を使用してキャッシュ表に名前を付けることはできません。TimesTenの表の名前は大文字と小文字が区別されず、大文字として格納されます。キャッシュ表の名前はOracle Database表の名前と同じである必要があります。TimesTenの大文字の表名は、大文字と小文字が混在するOracle Databaseの表の名前と一致しません。解決方法として、Oracle Databaseの表のシノニムを作成し、そのシノニムをキャッシュ・グループの表名として使用します。この解決方法は、読取り専用キャッシュ・グループまたはAUTOREFRESHパラメータが設定されたキャッシュ・グループには適用できません。

  • キャッシュ表の各列の名前およびデータ型は、Oracle Databaseの表の各列と一致する必要があります。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』Oracle DatabaseとTimesTenデータ型の間のマッピングに関する項を参照してください。また、WHERE句内で列名を参照する場合は、各列名を所有者と表名で完全に修飾する必要があります。

  • WHERE句は、キャッシュ・グループ表のみ直接参照できます。キャッシュ・グループ外の表は、副問合せでのみ参照できます。

  • 一般的には、CREATE CACHE GROUPLOAD CACHE GROUPUNLOAD CACHE GROUPREFRESH CACHE GROUPまたはFLUSH CACHE GROUP文のWHERE句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。

  • デフォルトでは、キャッシュ・グループ表で主キーを使用するために範囲索引が作成されます。主キーに対してハッシュ索引を指定する場合は、UNIQUE HASH句を使用します。

    • アプリケーションでキャッシュ・グループ表の主キーに対して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、そのキャッシュ・グループ表に対して範囲索引を選択してください。

    • ただし、主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。UNIQUE HASH句の詳細は、「CREATE TABLE」を参照してください。

    • 表の主キーで使用する索引を変更するには、ALTER TABLEを使用します。

  • PROPAGATE属性が指定されたキャッシュ・グループ表と、SWTキャッシュ・グループおよびAWTキャッシュ・グループの表の場合、ON DELETE CASCADEで指定する外部キーは、Oracle Database表のON DELETE CASCADEで指定されている外部キーの適切なサブセットであることが必要です。

  • CREATE CACHE GROUP文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。

AUTOREFRESHパラメータは、Oracle DatabaseからTimesTenキャッシュ・グループに自動的に変更を伝播します。静的なキャッシュ・グループの場合、削除、更新および挿入がOracle Databaseからキャッシュ・グループに自動的に伝播されます。動的キャッシュ・グループの場合、削除と更新のみが伝播されます。指定されたOracle Database表への挿入は動的キャッシュ・グループには伝播されません。これらは、アプリケーションで参照されたときに、動的にTimesTen Cacheにロードされます。また、アプリケーションで明示的にロードすることもできます。

キャッシュ・グループで自動リフレッシュを使用するには、キャッシュ・グループを作成する際にAUTOREFRESHを指定する必要があります。MODESTATEおよびINTERVAL AUTOREFRESHの設定は、ALTER CACHE GROUP文を使用することによって、キャッシュ・グループが作成された後で変更できます。キャッシュ・グループをAUTOREFRESHまたはPROPAGATEに指定した後は、これらの属性を変更することはできません。読取り専用キャッシュ・グループを作成する場合は、自動リフレッシュ句を指定する必要はありません。読取り専用キャッシュ・グループは、デフォルトで増分自動リフレッシュに設定されます。

TimesTenでは、FULLまたはINCREMENTAL AUTOREFRESHがサポートされています。FULLモードでは、キャッシュ全体が定期的にアンロードされてから再ロードされます。INCREMENTALモードでは、Oracle Databaseにトリガーがインストールされて変更の追跡が行われ、特定のOracle表で変更された行のみが定期的に更新されます。自動リフレッシュの状態がPAUSEDになっている場合を除き、最初の増分リフレッシュは常に完全リフレッシュになります。デフォルトのモードはINCREMENTALです。

FULL AUTOREFRESHは、Oracle Database表でほとんどの行が変更されている場合に効果的です。変更が少ない場合は、INCREMENTAL AUTOREFRESHがより有効です。

TimesTenは、AUTOREFRESHを指定した文を含むトランザクションがコミットされたときに、自動リフレッシュ操作をスケジュールします。自動リフレッシュをスケジュールする文は、次のとおりです。

自動リフレッシュの頻度は、指定した時間隔によって決まります。

AUTOREFRESHSTATEには、ONOFFまたはPAUSEDが指定できます。デフォルトでは、自動リフレッシュの状態はPAUSEDです。

NOT PROPAGATE属性とAUTOREFRESH属性を同時に使用することはできません。

キャッシュ・グループでのエージング:

  • 時間ベースのエージングでは、スライド期間を指定できます。『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』TimesTen Classicのスライド・ウィンドウの構成に関する項を参照してください。

  • 表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。

  • エージング・ポリシーは、エージング状態を変更するように定義する必要があります。

  • 1つのシステムでLRUエージングと時間ベースのエージングの両方を組み合せて使用できます。LRUエージングのみを使用する場合、エージング・スレッドはデータベース全体に指定されたサイクルに基づいて起動します。一方、時間ベースのエージングのみを使用する場合、エージング・スレッドは最適な頻度に基づいて起動します。この頻度は、データベースに対するCYCLE句で指定された値によって決定されます。LRUエージングと時間ベースのエージングの両方を使用する場合は、両方のタイプを組み合せて考慮した上でスレッドが起動します。

  • エージング状態がONOFFかにかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNowプロシージャをコールします。

  • LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。

    • SELECT文の結果セットを構築するために使用された行。

    • INSERT...SELECT文の結果セットを構築するために使用された行。

    • 更新または削除対象の行。

  • コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。

  • 使用

    LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。ON DELETE CASCADEの設定は無視されます。

  • 時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。ON DELETE CASCADEは、設定の有無にかかわらず無視されます。

  • ルート表にLRUエージング・ポリシーまたは時間ベースのエージング・ポリシーを指定します。ポリシーはキャッシュ・グループのすべての表に適用します。

  • 時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、NOT NULL列を追加または変更できないためです。

  • キャッシュ・グループのエージングを定義する場合の制限:

    • 動的キャッシュ・グループでないかぎり、LRUエージングは自動リフレッシュ属性が設定されたキャッシュ・グループではサポートされません。

    • キャッシュ・エージェントがアクティブの間は、読取り専用キャッシュ・グループまたはAUTOREFRESH属性を持つキャッシュ・グループに対するエージング・ポリシーの追加、変更または削除はできません。まず、キャッシュ・エージェントを停止してください。

    • 時間ベースのエージングに使用されている列は削除できません。

例: TimesTen Classic

次に示す例は、TimesTen Classicに固有です。TimesTen Scaleoutのキャッシュ・グループの詳細と使用例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』TimesTen Scaleoutのキャッシュ・グループの使用に関する項を参照してください。

読取り専用キャッシュ・グループを作成します。

CREATE READONLY CACHE GROUP customerorders
AUTOREFRESH INTERVAL 10 MINUTES
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       region CHAR(10),
       PRIMARY KEY(custid)),
ordertab (orderid INT NOT NULL,
       custid INT NOT NULL,
       PRIMARY KEY (orderid),
       FOREIGN KEY (custid) REFERENCES customer(custid));

ASYNCHRONOUS WRITETHROUGHキャッシュ・グループを作成します。

CREATE ASYNCHRONOUS WRITETHROUGH CACHE GROUP cstomers
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       PRIMARY KEY(custid));

SYNCHRONOUS WRITETHROUGHキャッシュ・グループを作成します。

CREATE SYNCHRONOUS WRITETHROUGH CACHE GROUP customers
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       PRIMARY KEY(custid));

ユーザー管理キャッシュ・グループを作成します。

CREATE USERMANAGED CACHE GROUP updateanywherecustomers
AUTOREFRESH
       MODE INCREMENTAL
       INTERVAL 30 SECONDS
       STATE ON
FROM
customer (custid INT NOT NULL,
       name CHAR(100) NOT NULL,
       addr CHAR(100),
       zip INT,
       PRIMARY KEY(custid),
       PROPAGATE);

時間ベースのエージングが指定されたキャッシュ・グループを作成します。エージング用の列として、agetimestampを指定します。LIFETIMEは2時間、CYCLEは30分を指定します。エージング状態は指定しないため、デフォルト設定(ON)が使用されます。

CREATE READONLY CACHE GROUP agingcachegroup
AUTOREFRESH
       MODE INCREMENTAL
       INTERVAL 5 MINUTES
       STATE PAUSED
FROM
customer (customerid NUMBER NOT NULL,
       agetimestamp TIMESTAMP NOT NULL,
       PRIMARY KEY (customerid))
       AGING USE agetimestamp LIFETIME 2 HOURS CYCLE 30 MINUTES;

Command> DESCRIBE customer;
Table USER.CUSTOMER:
  Columns:
   *CUSTOMERID                      NUMBER NOT NULL
    AGETIMESTAMP                    TIMESTAMP (6) NOT NULL
  AGING USE AgeTimestamp LIFETIME 2 HOURS CYCLE 30 MINUTES ON
1 table found.
(primary key columns are indicated with *)

Oracle Databaseで大文字と小文字が混在するデリミタ付き識別子の表名にシノニムを使用すると、大文字と小文字が混在する表名をTimesTenでキャッシュできます。まず、大文字と小文字が混在するOracle Database表名のキャッシュを試みます。"Could not find 'NameofTable' in Oracle"というエラーが表示されます。

Command> AUTOCOMMIT 0;
Command> PASSTHROUGH 3;
Command> CREATE TABLE "MixedCase" (col1 NUMBER PRIMARY KEY NOT NULL);
Command> INSERT INTO "MixedCase" VALUES (1);
1 row inserted.
Command> COMMIT;
Command> CREATE CACHE GROUP MixedCase1 from "MixedCase" 
        (col1 NUMBER PRIMARY KEY NOT NULL);
 5140: Could not find SAMPLEUSER.MIXEDCASE in Oracle.  May not have privileges.
The command failed.

ここで、PassThrough属性を使用して、シノニム"MIXEDCASE"をOracle Databaseに作成し、そのシノニムを表名として使用します。

Command> AUTOCOMMIT 0;
Command> PASSTHROUGH 3;
Command> CREATE SYNONYM "MIXEDCASE" FOR "MixedCase";
Command> COMMIT;
Command> CREATE CACHE GROUP MixedCase2 FROM "MIXEDCASE" 
         (col1 NUMBER PRIMARY KEY NOT NULL);
Warning  5147: Cache group contains synonyms
Command> COMMIT;

読取り専用キャッシュ・グループまたはAUTOREFRESH属性を持つキャッシュ・グループでシノニムの名前を使用してみます。次のエラーが表示されます。

Command> AUTOCOMMIT 0;
Command> PASSTHROUGH 3;
Command> CREATE SYNONYM "MIXEDCASE_AUTO" FOR "MixedCase";
Command> COMMIT;
Command> CREATE READONLY CACHE GROUP MixedCase3 AUTOREFRESH MODE
         INCREMENTAL INTERVAL 10 MINUTES FROM "MIXEDCASE_AUTO" 
         (Col1 NUMBER PRIMARY KEY NOT NULL);
 5142: Autorefresh is not allowed on cache groups with Oracle synonyms
The command failed.

CREATE FUNCTION

CREATE FUNCTION文は、スタンドアロンのストアド・ファンクションを作成します。

必要な権限

CREATE PROCEDURE(所有者の場合)またはCREATE ANY PROCEDURE(非所有者の場合)。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE [OR REPLACE] FUNCTION [Owner.]FunctionName 
     [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])]
     RETURN DataType 
     [InvokerRightsClause][AccessibleByClause][DETERMINISTIC]
     {IS|AS} PlsqlFunctionBody

InvokerRightsClause::=
AUTHID {CURRENT_USER|DEFINER}

AccessibleByClause::=
ACCESSIBLE BY (accessor[,...])

accessor::= 
[UnitKind][Owner.]UnitName

InvokerRightsClauseAccessibleByClauseまたはDETERMINISTICは任意の順序で指定できます。

パラメータ

パラメータ 説明

OR REPLACE

ファンクションがすでに存在する場合に再作成するには、OR REPLACEを指定します。この句を使用して、削除および再作成せずに既存のファンクションの定義を変更します。ファンクションを再作成すると、そのファンクションはTimesTenで再コンパイルされます。

FunctionName

ファンクションの名前。

arguments

引数またはパラメータの名前。ファンクションに0以上のパラメータを指定できます。パラメータを指定する場合は、パラメータのデータ型を指定する必要があります。データ型はPL/SQLデータ型である必要があります。

IN|OUT|IN OUT

パラメータのモード。

INは読取り専用パラメータです。パラメータの値をファンクションに渡すことはできますが、ファンクションはパラメータの値をファンクション外に渡したり、コール側PL/SQLブロックに戻したりすることはできません。パラメータの値は変更できません。

OUTは書込み専用パラメータです。値をファンクションからコール側PL/SQLブロックに戻すには、OUTパラメータを使用します。パラメータに値を割り当てることができます。

IN OUTは読取り/書込みパラメータです。値をファンクションに渡し、コール側プログラムに戻すことができます(元の変更されていない値またはファンクション内で設定された新しい値)。

INがデフォルトです。

NOCOPY

可能なかぎり迅速にパラメータを渡すようにTimesTenに指示するには、NOCOPYを指定します。レコード、索引付き表、OUTまたはIN OUTパラメータへのVARRAYなどの大きな値を渡す場合に、パフォーマンスを向上できます。INパラメータでは、常にNOCOPYが渡されます。

DEFAULT expr

パラメータのデフォルト値を指定するには、この句を使用します。キーワードDEFAULTのかわりに:=を指定できます。

RETURN DataType

必須の句。ファンクションは値を戻す必要があります。ファンクションの戻り値のデータ型を指定する必要があります。

データ型の長さ、精度またはスケールは指定しないでください。

データ型はPL/SQLデータ型です。

InvokerRightsClause

PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。AUTHIDの設定は、実行時にPL/SQLプロシージャまたはファンクションによって発行されるSQL文の名前解決および権限チェックに次のように影響を与えます。

  • DEFINERを指定すると、SQLの名前解決および権限チェックは、プロシージャまたはファンクションの所有者(定義者、つまりプロシージャまたはファンクションがあるスキーマの所有者)が実行しているものとして実行されます。DEFINERがデフォルトです。

  • CURRENT_USERを指定すると、SQLの名前解決および権限チェックは、現在のユーザー(実行者)が実行しているものとして実行されます。

詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』定義者権限および実行者権限(AUTHID句)に関する項を参照してください。

AccessibleByClause

この句は、ファンクションを直接呼び出せる1つ以上のアクセッサ(PL/SQLユニット)を指定する場合に使用します。ファンクションにアクセスできるアクセッサのリストは、ホワイトリストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにファンクションへのアクセスを制限できます。

AccessibleByClauseは、CREATE FUNCTION文で1回のみ指定できます。

構文: ACCESSIBLE BY (accessor [,...])

accessor

AccessibleByClauseで使用されます。アクセッサは、ファンクションを呼び出せるPL/SQLユニットです。

アクセッサは、AccessibleByClause句で複数回指定できます。

構文: [UnitKind][Owner.]UnitName

UnitKind

accessor句(AccessibleByClause句の一部)で使用されます。ファンクションを呼び出せるPL/SQLユニットの種類を指定します。

  • UnitKindはオプションですが、指定する場合の有効なオプションは次のとおりです。
  • FUNCTION

  • PROCEDURE

  • PACKAGE

[Owner.]UnitName

accessor句(AccessibleByClause句の一部)で使用されます。ファンクションを呼び出せるPL/SQLユニットの名前を指定します。UnitKindを指定する場合、UnitNameをこの種類のユニットの名前にする必要があります。たとえば、UnitKindPROCEDUREを指定する場合、UnitNameはプロシージャ名である必要があります。UnitNameは必須です。

Ownerは必要に応じて指定できます。Ownerを指定する場合、UnitNameがその所有者のスキーマ内に常駐する必要があります。Ownerを指定しない場合、UnitNameは関数を含むスキーマ内にある必要があります。

DETERMINISTIC

パラメータに同じ値を指定して関数をコールした場合に常に同じ結果値を返すように指定するには、DETERMINISTICを指定します。

IS|AS

ISまたはASを指定して、ファンクションの本体を宣言します。

plsql_function_spec

ファンクションの本体を指定します。

説明

  • AccessibleByClause:

    • コンパイラはACCESSIBLE BY句の構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。

    • ファンクションを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このファンクションにACCESSIBLE BY句がない場合、呼出しは成功します。ファンクションにACCESSIBLE BY句がある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。

  • ファンクションを作成または置き換えた場合、ファンクションに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。

  • レプリケーション環境で、CREATE FUNCTION文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。

  • 次の句はTimesTenではサポートされません。

    • parallel_enable_clause

      句を指定できますが、無効になります。

    • call_spec

    • AS EXTERNAL

AccessibleByClauseの使用

この例では、ProtectedFunction関数を作成します。ACCESSIBLE BY句は、ファンクションの呼出しをCallingProc1プロシージャおよびCallingProc2プロシージャに制限するために使用されます。CallingProc1ではPL/SQLユニットのタイプは指定されず、CallingProc2では、PL/SQLユニットのタイプは(PROCEDURE)と指定されることに注意してください。

Command> CREATE OR REPLACE FUNCTION ProtectedFunction (a IN NUMBER)
           RETURN NUMBER
         ACCESSIBLE BY (CallingProc1, PROCEDURE CallingProc2)
         AS
         BEGIN
           RETURN a * 1;
         END;
         /
         
Function created.

CallingProc1プロシージャとCallingProc2プロシージャを作成します。

Command> CREATE OR REPLACE PROCEDURE CallingProc1 AS
           a NUMBER:=1;
         BEGIN
           a:=ProtectedFunction(a);
           DBMS_OUTPUT.PUT_LINE ('Calling Procedure: '|| a);
         END;
         /
         
Procedure created.

Command> CREATE OR REPLACE PROCEDURE CallingProc2
         AS
           a NUMBER:=2;
         BEGIN
           a:=ProtectedFunction(a);
           DBMS_OUTPUT.PUT_LINE ('Calling Procedure: '|| a);
         END;
         /
         
Procedure created.

プロシージャをコールします。CallingProc1およびCallingProc2はホワイト・リストにあり、実行は成功します。

Command> SET SERVEROUTPUT ON
Command> exec CallingProc1;
Calling Procedure: 1
 
PL/SQL procedure successfully completed.
 
Command> exec CallingProc2;
Calling Procedure: 2
 
PL/SQL procedure successfully completed.

PL/SQLファンクションを作成するための構文を示します

1つの入力パラメータを指定してファンクションget_salを作成します。NUMBER型としてsalaryを戻します。

Command> CREATE OR REPLACE FUNCTION get_sal
           (p_id employees.employee_id%TYPE) RETURN NUMBER IS
           v_sal employees.salary%TYPE := 0;
         BEGIN
           SELECT salary INTO v_sal FROM employees
             WHERE employee_id = p_id;
           RETURN v_sal;
         END get_sal;
         /
 
Function created.

CREATE INDEX

CREATE INDEX文は、表またはマテリアライズド・ビューの1つ以上の列に索引を作成します。

必要な権限

グローバル索引(TimesTen Scaleoutでサポート)およびローカル索引(TimesTen ScaleoutTimesTen Classicでサポート)の場合:
  • 所有者の場合、権限は不要です。
  • 所有者でない場合は、システム権限のCREATE ANY INDEXまたはオブジェクト権限のINDEXが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。グローバル索引またはローカル索引を作成できます。

SQL構文

次に、範囲索引を作成する構文を示します。GLOBALキーワード、オプションのINCLUDE句およびオプションのIndexDistributionClause句を使用して、グローバル索引を作成します。グローバル索引は、TimesTen Scaleoutでのみサポートされます。

CREATE [GLOBAL][UNIQUE] INDEX [Owner.]IndexName ON
[Owner.]TableName (ColumnName [ASC | DESC][,... ])
[INCLUDE (ColumnName[,…])] 
[IndexDistributionClause]

次に、ハッシュ索引を作成する構文を示します。GLOBALキーワードを使用して、グローバル索引を作成します。オプションのINCLUDE句およびオプションのIndexDistributionClause句は、グローバル索引にのみ使用できます。グローバル索引は、TimesTen Scaleoutでのみサポートされます。

CREATE [GLOBAL][UNIQUE] HASH INDEX [Owner.]IndexName ON
[Owner.]TableName (ColumnName [ASC | DESC][,... ] ) 
[INCLUDE (ColumnName [,…])]
[ PAGES = RowPages | CURRENT ]
[IndexDistributionClause]

IndexDistributionClauseの構文は、グローバル索引(TimesTen Scaleoutでサポート)にのみ使用できます。

IndexDistributionClause::=
DISTRIBUTE BY HASH [(ColumnName [,…])]

パラメータ

パラメータ 説明

GLOBAL

GLOBALキーワードは、TimesTen Scaleoutのみでサポートされます。

TimesTen Scaleout:
  • GLOBALを指定して、グローバル索引を作成します。グローバル索引は、表内のすべての行をハッシュ分散スキームにマップします。グローバル索引を作成すると、TimesTen Scaleoutは、ローカル索引と索引キー列へのハッシュ分散スキームを使用したマテリアライズド・ビューを作成します。
  • GLOBALを指定しない場合、各データベース要素にローカル索引が作成されます。このデータベース要素の索引は、データベース要素の表の行にマップされます。

UNIQUE

範囲索引およびハッシュ索引の両方にUNIQUEを指定します。UNIQUEを指定すると、索引キーの列値の各組合せが出現するのは、その表で1つの行のみです。

HASH

ハッシュ索引を作成する場合は、HASHを指定します。一意のハッシュ索引を作成する場合は、HASHとともにUNIQUEを指定します。

[Owner.] IndexName

新しい索引に割り当てる名前。表の2つの索引に同じ名前を付けることはできません。所有者を指定する場合、表の所有者と同じ名前を指定する必要があります。

[Owner.] TableName

索引を作成する表またはマテリアライズド・ビューを指定します。

ColumnName

索引キーとして使用する列の名前。主索引キーから補助索引キーの順に、最大32列を指定できます。

[ASC|DESC]

索引の順序を昇順(デフォルト)または降順で指定します。現在、TimesTenでは、この句は無視されます。

INCLUDE (ColumnName [,…])

INCLUDE句はTimesTen Scaleoutでのみサポートされ、グローバル索引を定義する場合にのみ使用できます。INCLUDE句を使用して、索引以外の列を索引定義に追加します。これらの索引以外の列は、実表へのアクセスなしに、一部の問合せを満たすために使用できます。これは、そのような列が問合せ(等価条件と範囲条件の両方)で頻繁にアクセスされる場合に、特に役立ちます。

PAGES = {RowPages | CURRENT}

PAGES句は、表の想定ページ数に基づいてハッシュ索引のサイズを設定します。ハッシュ索引を定義するときにPAGES句を指定しない場合、デフォルトはCURRENTになります。

CURRENTを指定すると、表内の現在の行数を使用してページ・カウント値が計算されます。RowPagesを指定する場合は、ページ数が使用されます。RowPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

RowPagesの値は、0を含まない正の定数である必要があります。

表に行がない場合は、PAGES=CURRENTを指定しないでください。これは、行が表に追加される際に、ハッシュ索引が最適に動作しないためです。

IndexDistributionClause :: = DISTRIBUTE BY HASH [( ColumnName [,…])]

DISTRIBUTE BY HASH句は、グローバル索引を定義する場合にのみ指定できます。この句はオプションです。

この句を指定しない場合は、グローバル索引定義で定義された列が分散キーを形成します。

この句を指定する場合は、ColumnName句をオプションで指定できます。
  • 指定する場合は、分散キーに1つ以上の列を指定する必要があります。これらの列には、グローバル索引定義で指定された1つ以上の列が含まれている必要があります。

  • 指定しないと、グローバル索引定義で定義された列で分散キーが形成されます。

    ノート:

    グローバル索引の分散キーは、表の分散キーと同じにできません。

TimesTen Scaleoutの索引

TimesTen Scaleoutは、グローバルおよびローカル索引をサポートします。
  • グローバル索引: 表内のすべての行をハッシュ分散スキームにマップします。グローバル索引を作成すると、TimesTen Scaleoutは、ローカル索引と索引キー列へのハッシュ分散スキームを使用したマテリアライズド・ビューを作成します。マテリアライズド・ビューで作成されるローカル索引は、問合せのパフォーマンスをさらに最適化します。
  • ローカル索引: 各データベース要素に作成されます。データベース要素の索引は、データベース要素の表の行にマップされます。表に分散キー列を含まない索引列に対する問合せでは、すべてのレプリカ・セットの要素と通信する必要があります。

TimesTen Scaleoutでの索引の使用の詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』索引の理解に関する項を参照してください。

TimesTen Scaleoutでのグローバルまたはローカル索引の選択

グローバルとローカル索引のいずれを使用するかを決定する場合は、次の点を考慮してください。
  • グローバル索引を使用する対象を次に示します。

    • 一意の列: グローバル一意索引は、一意制約チェックをより効率的に実行することにより、問合せの実行を最適化します。TimesTen Scaleoutは、一意性の検証のために、すべてのレプリカ・セットにアクセスするのではなく分散キー列を使用します。ただし、分散キーが索引キーのサブセットの場合は、ローカル索引を作成します。
    • 表の分散キーにすべての列を含まない等式述語を持つ問合せ。
    • 主キー列を持つ問合せで頻繁に結合される列のグループ。
    • 問合せで頻繁に使用される索引以外の列: INCLUDE句を使用してグローバル索引を定義し、これらの索引以外の列を含めます。このような場合、問合せを満たすために表にアクセスする必要はありません。
    • 索引キーが表の分散キーの接頭辞である索引。
  • ローカル索引を使用する対象を次に示します。
    • 一意でない列: 索引キーが一意でない列のみで構成されている場合は、ローカルの一意でない索引を作成します。
    • 表の分散キーと同じ列を含む索引キー。
    • 表の分散キーが索引キーの接頭辞である状況。
    • 表の分散キーにすべての列が含まれる等式述語を持つ問合せ。

詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』索引の理解に関する項を参照してください。

グローバル索引の説明

グローバル索引の使用
  • グローバル索引を作成するには、GLOBALキーワードを指定する必要があります。索引は、デフォルトではローカルです。
  • デフォルトでは、グローバル索引はハッシュによって分散されます。また、ハッシュによってのみ分散できます。ローカル索引は分散されません。
  • グローバル索引を作成すると、TimesTen Scaleoutは、内部的に独自のマテリアライズド・ビューと、そのマテリアライズド・ビューに独自のローカル索引を作成します。
  • グローバル索引によって、結合を使用した問合せ実行の効率が向上します。ただし、内部マテリアライズド・ビュー(グローバル索引の定義時に作成されるビュー)のメンテナンスのためにDML操作は遅くなります。
  • グリッドに新しい要素が追加されると、その新しい要素にスキーマがレプリケートされます。さらに、行が再分散され、索引が再構築されます。これには、グローバル索引が含まれます。同様に、要素がグリッドから削除されたときにも、行が再分散され、索引が再作成されます。
表の分散スキーム:
  • グローバル索引は、ハッシュによって分散された表と参照によって分散された表に定義できます。親表と子(第1レベルの参照)表のグローバル索引がサポートされます。ただし、孫表または第1レベルの参照表以外の表には、グローバル索引を定義できません。
  • 重複によって分散された表には、グローバル索引を定義できません。

グローバル索引の制限事項:

  • 分散キーの列リストには、ROWID疑似列またはROWID型の列を含めることができません。
  • グローバル一時表ではサポートされません。
  • 読取り専用キャッシュ・グループではサポートされません。
  • マテリアライズド・ビューではサポートされません。

グローバル索引の構文およびセマンティック・ルール

グローバル索引を作成するには、GLOBALキーワードを指定する必要があります。GLOBALキーワードを指定しないと、ローカル索引が作成されます。グローバル索引は、索引キー列のハッシュによって分散されます。

GLOBALキーワードを指定した場合は、グローバル索引に固有の次の句を必要に応じて指定できます。
  • INCLUDE句: 索引に非キー列を含めることができるオプションの句。そのような列が索引を使用する問合せで頻繁にアクセスされる場合は、パフォーマンスが向上する可能性があります。
  • IndexDistributionClause: ハッシュ分散に使用する列を指定できるオプションの句。この句を指定しない場合は、索引列が分散キーを形成します。索引の分散キーは、表の分散キーと同じにすることはできません。

  • 例:

    グローバル範囲索引:

    Command> CREATE GLOBAL INDEX globalindex1 ON mytab (a) INCLUDE (b,c) DISTRIBUTE BY HASH (a);
    Command> indexes mytab;
    
    Indexes on table SAMPLEUSER.MYTAB:
      MYTAB: unique range index on columns:
        C
        B
      GLOBALINDEX1: global non-unique range index on columns:
        A
        Included columns:
          B
          C
      2 indexes found.
    
    2 indexes found on 1 table.
    Command> drop table mytab;

    グローバル・ハッシュ索引:

    Command> CREATE TABLE mytab (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
               a TT_INTEGER NOT NULL, PRIMARY KEY (c,b)) DISTRIBUTE BY HASH (a,b);
    Command> CREATE GLOBAL HASH INDEX globalhashindex1 ON mytab(a) INCLUDE (b,c) PAGES=200 DISTRIBUTE BY HASH (a);
    Command> indexes MYTAB;
    
    Indexes on table SAMPLEUSER.MYTAB:
      MYTAB: unique range index on columns:
        C
        B
      GLOBALHASHINDEX1: global non-unique hash index on columns:
        A
        Included columns:
          B
          C
      2 indexes found.
    
    2 indexes found on 1 table.
    

その他の例は、「例: TimesTen Scaleout」を参照してください。

TimesTen Scaleoutの索引についての一般的な説明

  • TimesTenでは、一意でない範囲索引がデフォルトで作成されます。一意の範囲索引を作成するには、CREATE UNIQUE INDEXを指定します。

  • 一意でないハッシュ索引を作成する場合は、CREATE HASH INDEXを指定します。一意のハッシュ索引を作成するには、 CREATE UNIQUE HASH INDEXを指定します。

  • UNIQUEを指定した場合、索引付けされた列の既存の行の値はすべて一意である必要があります。

  • 新しい索引は、DROP INDEX文を使用して索引を削除するか、その索引に関連付けられた表を削除しないかぎり自動的にメンテナンスされます。

  • 準備された文が新しく索引付けされた表を参照している場合、その文を次回に実行する際に自動的に再度準備されます。これにより、文は新しい索引を活用することができます。

  • 他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表に索引を作成することはできません。

  • 言語比較を使用する場合は、言語索引を作成できます。言語索引ではソート・キー値が使用され、ソート・キー値用の記憶域が必要です。1つの索引に指定できるNLS_SORTの値は、一意の値を1つのみです。言語索引および言語比較の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』言語索引の使用に関する項を参照してください。

  • 冗長な索引を作成すると、TimesTenにより警告またはエラーが生成されます。ttRedundantIndexCheckをコールして、表に対する冗長な索引のリストを表示します。

  • ハッシュ索引のサイズまたは型を変更するには、ハッシュ索引を削除して新しい索引を作成します。

  • ハッシュ索引は、固定サイズで作成され、表の存続中は変化しません。ハッシュ索引のサイズを変更するには、索引を削除して再作成します。ハッシュ索引のページが十分でない場合は、ハッシュの衝突が発生して索引の検索が遅くなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。

    ハッシュ索引のサイズが適性に設定されていることを確認するには、SET PAGES句のRowPagesパラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

  • 索引に指定できる最大列数は32です。

問合せ処理での索引の使用

適正な索引は問合せのパフォーマンス向上につながります。索引の使用が有益な問合せと有益でない問合せがあります。また、問合せでの索引の選択も重要です。

範囲索引は、索引列の値のほとんどが一意の場合に、範囲検索および完全一致の処理に適しています。たとえば、範囲索引が列(C1,C2)に定義されている場合、次の種類の述語の処理に索引を使用できます。ConstantOrParamは定数値または動的パラメータを指し、rangeは演算子>、<、>=または<=:を指します。

  • C1 = ConstantOrParam AND C2 = ConstantOrParam

  • C1 = ConstantOrParam AND C2 range ConstantOrParam

  • C1 = ConstantOrParam

  • C1 range ConstantOrParam

範囲索引は、等式述語および範囲述語の処理、ソート処理やグループ化処理に効果的です。範囲索引は、一意の値が多数ある索引列に使用します。範囲索引で指定する列の順序は関連しています。範囲索引を使用する問合せの述語内の式の順序は関連していません。問合せ処理時は、表で複数の範囲索引を定義している場合でも、表の各スキャンで範囲索引が1つだけ使用されます。

ハッシュ索引は等式述語の処理に効果的です。最適なパフォーマンスのためには、ハッシュ索引のサイズを適正にする必要があります。PAGESパラメータを使用してハッシュ索引のサイズを指定します。指定したPAGESの値が小さすぎると、多数のハッシュ衝突が発生し、ハッシュ索引にアクセスする文のパフォーマンスが低下します。ハッシュ索引で指定された列の順序は関連せず、範囲索引を使用する問合せの述語内の式の順序は関連しません。ハッシュ索引または範囲索引のいずれかを使用して特定の等式述語を処理する場合は、ハッシュ索引による検索は範囲索引のスキャンより高速なため、ハッシュ索引が使用されます。

文レベルまたはトランザクション・レベルのオプティマイザ・ヒントを設定することで、オプティマイザが使用する索引を変更できることがあります。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。トランザクション・レベルのオプティマイザ・ヒントの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttOptSetFlagttOptSetOrderまたはttOptUseIndexに関する項を参照してください。

例: TimesTen Scaleout

次の例は、グローバル索引を作成するための構文の要件を示しています。グローバル索引を作成するには、GLOBALキーワードを指定する必要があります。

グローバル索引の構文の説明

この例では、グローバル索引でサポートされる構文を説明します。

3つの列(c,b,a)を含む表を作成して、これらの列の2つ(c,b)に主キーを定義します。列(a,b)のハッシュによって表を分散します。

(c,b)に、グローバル一意範囲索引を作成します。
Command> CREATE TABLE mytab1 (c TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, a TT_INTEGER NOT NULL, 
PRIMARY KEY (c,b)) DISTRIBUTE BY HASH (a,b);
Command> CREATE GLOBAL UNIQUE INDEX mygix1 ON mytab1 (c,b);
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYGIX1: global unique range index on columns:
    C
    B
  MYTAB1: unique range index on columns:
    C
    B
  2 indexes found.

2 indexes found on 1 table.
2番目のグローバル範囲索引を作成して、INCLUDE句を指定します。

Command> CREATE GLOBAL INDEX mygix2 ON MYTAB1(b) include (a);
Command> indexes mytab1

Indexes on table SAMPLEUSER.MYTAB1:
  MYGIX1: global unique range index on columns:
    C
    B
  MYTAB1: unique range index on columns:
    C
    B
  MYGIX2: global non-unique range index on columns:
    B
    Included columns:
      A
  3 indexes found.

3 indexes found on 1 table.
2番目の索引を削除してから再作成します。列bのハッシュで索引を分散します。
Command> DROP INDEX mygix2;
Command> CREATE GLOBAL INDEX mygix2 ON MYTAB1(b) INCLUDE (a) DISTRIBUTE BY HASH(b);
Command> INDEXES mytab1

Indexes on table SAMPLEUSER.MYTAB1:
  MYGIX1: global unique range index on columns:
    C
    B
  MYTAB1: unique range index on columns:
    C
    B
  MYGIX2: global non-unique range index on columns:
    B
    Included columns:
      A
  3 indexes found.

3 indexes found on 1 table.

グローバル・ハッシュ索引を作成します。

Command> CREATE GLOBAL HASH INDEX mygix3 ON mytab1(a) PAGES =200;
Command> indexes mytab1;

Indexes on table SAMPLEUSER.MYTAB1:
  MYGIX1: global unique range index on columns:
    C
    B
  MYTAB1: unique range index on columns:
    C
    B
  MYGIX3: global non-unique hash index on columns:
    A
  MYGIX2: global non-unique range index on columns:
    B
    Included columns:
      A
  4 indexes found.

4 indexes found on 1 table.

グローバル索引の分散キーと同一の表の分散キー

この例では、分散キーが表の分散キーと同一のグローバル索引は作成できないことを示します。この例では、mytab1表は、列(a,b)のハッシュで分散されます。列(a,b)を分散キーとして使用してグローバル索引を作成しようとすると、エラーが発生します。

Command> CREATE TABLE mytab1 (a TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL,
           c TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> CREATE GLOBAL INDEX gix1 ON mytab1(a,b,c) DISTRIBUTE BY HASH (a,b);
 2253: Distribution key for global index cannot be same as that of the table or
 other global index. Consider creating a local index.
The command failed.

グローバル索引によって作成される独自のマテリアライズド・ビューと独自のローカル索引

この例では、グローバル索引を作成するときに、TimesTen Scaleoutによって独自の内部マテリアライズド・ビューと独自のローカル索引が作成されることを示します。列(a,b)のハッシュで分散されるmytab2表を作成します。列(b,a)のハッシュで分散される、一意でないグローバル範囲索引を作成します。ttIsql indexesコマンドを実行して、内部マテリアライズド・ビューにgix2グローバル索引と内部ローカル索引が作成されたことを確認します。その後で、ttIsql viewsコマンドを実行して、グローバル索引の作成の結果として内部マテリアライズド・ビューも作成作成されていることを確認します。ttIsql describeコマンドを実行して、内部マテリアライズド・ビューを確認します。内部マテリアライズド・ビューまたは内部ローカル索引は、明示的に削除することはできません。

Command> CREATE TABLE mytab2 (a TT_INTEGER NOT NULL, b TT_INTEGER NOT NULL, 
           c TT_INTEGER NOT NULL) DISTRIBUTE BY HASH (a,b);
Command> CREATE GLOBAL INDEX gix2 ON mytab2(a,b,c) DISTRIBUTE BY HASH (b,a);
Command> indexes;

Indexes on materialized view SAMPLEUSER.$GV9B55D3955D52:
  $GVI9B55D3955D52: non-unique range index on columns:
    A
    B
    C
  1 index found.

Indexes on table SAMPLEUSER.MYTAB2:
  GIX2: global non-unique range index on columns:
    A
    B
    C
  1 index found.

2 indexes found on 2 tables.
Command> views;
  SAMPLEUSER.$GV9B55D3955D52
1 view found.
Command> describe SAMPLEUSER.$GV9B55D3955D52;

Materialized view SAMPLEUSER.$GV9B55D3955D52:
  Global index: GIX2 (table: MYTAB2)
  Columns:
    A                               TT_INTEGER NOT NULL
    B                               TT_INTEGER NOT NULL
    C                               TT_INTEGER NOT NULL
  DISTRIBUTE BY HASH (B, A)

1 view found.

例: TimesTen Classic

表を作成し、col2に一意のハッシュ索引を作成します。PAGES句は指定しないでください。PAGESを指定しない場合、ハッシュ表のサイズに現在の表のページ数が使用されます。INDEXESを使用して、索引が作成されたことを確認します。表に行を挿入し、SHOWPLANを1に設定し、オプティマイザがハッシュ索引を使用していることを確認します。

Command> CREATE TABLE tab (col1 NUMBER PRIMARY KEY NOT NULL, col2 VARCHAR2 (30));
Command> CREATE UNIQUE HASH INDEX hash1 ON tab (col2);
Command> INDEXES;
 
Indexes on table TESTUSER.TAB:
  HASH1: unique hash index on columns:
    COL2
  TAB: unique range index on columns:
    COL1
  2 indexes found.
 
2 indexes found on 1 table.
Command> INSERT INTO tab VALUES (10, 'ABC');
Command> SHOWPLAN 1;
Command> SELECT * FROM tab where col2 = 'ABC';
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkHashScan
  TBLNAME:             TAB
  IXNAME:              HASH1
  INDEXED CONDITION:   TAB.COL2 = 'ABC'
  NOT INDEXED:         <NULL>
 
< 10, ABC >
1 row found.

表を作成し、col1に一意でないハッシュ索引を作成します。PAGES = CURRENTを使用して現在の表のページ数を使用してハッシュ索引のサイズを指定します。INDEXESを使用して、一意でないハッシュ索引が作成されることを確認します。

Command> CREATE TABLE tab2 (col1 NUMBER);
Command> CREATE HASH INDEX hash_index ON tab2 (col1) PAGES = CURRENT;
Command> INDEXES;
 
Indexes on table TESTUSER.TAB2:
  HASH_INDEX: non-unique hash index on columns:
    COL1
  1 index found.
 
1 index found on 1 table.

表を作成し、col3に一意のハッシュ索引を作成します。PAGES = 100を使用して、ハッシュ索引のサイズにページ数100を指定します。INDEXESを使用して、一意のハッシュ索引が作成されることを確認します。

Command> CREATE TABLE tab3 (col1 NUMBER, col2 NUMBER, col3 TT_INTEGER);
Command> CREATE UNIQUE HASH INDEX unique_hash1 on tab3 (col3) PAGES = 100;
Command> INDEXES;
 
Indexes on table TESTUSER.TAB3:
  UNIQUE_HASH1: unique hash index on columns:
    COL3
  1 index found.
 
1 index found on 1 table.

HRスキーマのregions表により、region_idに一意の索引が作成されます。regions表に対してttIsql INDEXESコマンドを発行します。一意の範囲索引regionsが表示されます。

Command> INDEXES REGIONS;

Indexes on table SAMPLEUSER.REGIONS:
  REGIONS: unique range index on columns:
    REGION_ID
    (referenced by foreign key index COUNTR_REG_FK on table SAMPLEUSER.COUNTRIES)
  1 index found.

1 index found on 1 table.

regions表に一意の索引iを作成し、region_id列に索引を作成してみます。警告メッセージが表示されます。

Command> CREATE UNIQUE INDEX i ON regions (region_id);
Warning  2232: New index I is identical to existing index REGIONS; 
consider dropping index I

ttRedundantIndexCheckをコールして、この索引に対する警告メッセージを表示します。

Command> CALL ttRedundantIndexCheck ('regions');
< Index SAMPLEUSER.REGIONS.I is identical to index SAMPLEUSER.REGIONS.REGIONS;
consider dropping index SAMPLEUSER.REGIONS.I >
1 row found.

redundancyを作成し、列co11およびcol2を定義します。col1およびcol2に2つのユーザー索引を作成します。2つ目の索引r2を作成しようとするとエラー・メッセージが表示されます。索引r1は作成されます。索引r2は作成されません。

Command> CREATE TABLE redundancy (col1 CHAR (30), col2 VARCHAR2 (30));
Command> CREATE INDEX r1 ON redundancy (col1, col2);
Command> CREATE INDEX r2 ON redundancy (col1, col2);
 2231: New index R2 would be identical to existing index R1
The command failed.

redundancy表に対してttIsqlコマンドのINDEXESを発行し、索引r1のみが作成されていることを表示します。

Command> INDEXES redundancy;

Indexes on table SAMPLEUSER.REDUNDANCY:
  R1: non-unique range index on columns:
    COL1
    COL2
  1 index found.

1 index found on 1 table.

この一意索引によって、部品の番号はすべて一意になります。

CREATE UNIQUE INDEX purchasing.partnumindex
ON purchasing.parts (partnumber);

employees1表に、german_indexという名前の言語索引を作成します。2つ以上の言語ソートが必要な場合は、2つ目の言語索引を作成します。

Command> CREATE TABLE employees1 (id CHARACTER (21),
id2 character (21));
Command> CREATE INDEX german_index ON employees1
           (NLSSORT(id, 'NLS_SORT=GERMAN'));
Command> CREATE INDEX german_index2 ON employees1
           (NLSSORT(id2, 'nls_sort=german_ci'));
Command> indexes employees1;
Indexes on table SAMPLEUSER.EMPLOYEES1:
  GERMAN_INDEX: non-unique range index on columns:
    NLSSORT(ID,'NLS_SORT=GERMAN')
  GERMAN_INDEX2: non-unique range index on columns:
    NLSSORT(ID2,'nls_sort=german_ci')
  2 indexes found.
1 table found.

関連項目

DROP INDEX

CREATE MATERIALIZED VIEW

CREATE MATERIALIZED VIEW文は、SelectQuery句で指定された表に対するビューを作成します。ビューを作成するために使用された元の表は、ディテール表と呼ばれます。ビューは、ディテール表の変更に関して、同期でリフレッシュされます。

必要な権限

文を実行するユーザーには、CREATE MATERIALIZED VIEW(所有者の場合)またはCREATE ANY MATERIALIZED VIEW (非所有者の場合)権限が必要です。

マテリアライズド・ビューの所有者に必要なものを次に示します。
  • ディテール表のSELECT権限。
  • CREATE TABLE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。DISTRIBUTE BY HASH句を指定し、分散キーを定義する必要があります。DISTRIBUTE BY REFERENCE句およびDUPLICATE句はサポートされていません。

SQL構文: TimesTen Scaleout

CREATE MATERIALIZED VIEW [Owner.]ViewName
DISTRIBUTE BY HASH (ColumnName [,...])
AS SelectQuery
[PRIMARY KEY (ColumnName [,...])] 
[UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages]

SQL構文: TimesTen Classic

CREATE MATERIALIZED VIEW [Owner.]ViewName
AS SelectQuery
[PRIMARY KEY (ColumnName [,...])] 
[UNIQUE HASH ON (HashColumnName [,...]) PAGES = PrimaryPages]

パラメータ

パラメータ 説明

[Owner.]ViewName

新しいビューに割り当てる名前。

DISTRIBUTE BY HASH (ColumnName [,...])

TimesTen Scaleoutのみです。DISTRIBUTE BY HASH句を指定する必要があり、(主キーを指定した場合でも)分散キーに対して1つ以上の列を指定する必要があります。

ハッシュによってディテール表を分散する必要があります。

DISTRIBUTE BY REFERENCE句またはDUPLICATE句はサポートされていません。

この句は、AS SelectQuery句の前に指定する必要があります。

SelectQuery

ビューで使用される、ディテール表の列を選択します。

ColumnName

作成されるビューの主キー列の名前を指定します。主キーには最大32列を指定できます。ビュー表の結果列の名前は、一意である必要があります。表または所有者の要素を列名の定義に含めることはできません。

UNIQUE HASH ON

表のハッシュ索引。一意のハッシュ索引のみが作成されます。このパラメータは、等価条件に使用します。UNIQUE HASH ONを指定するには、主キーの定義が必要です。

HashColumnName

ビューに定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

ハッシュ索引の詳細は、「CREATE TABLE」を参照してください。

CREATE MATERIALIZED VIEWの説明および制限事項: TimesTen Scaleout

説明および制限を次に示します。

  • マテリアライズド・ビューを使用すると問合せの実行時間が改善することが期待される場合、SQLオプティマイザは、ベース表に対する問合せをリライトして使用可能なマテリアライズド・ビューを使用することがあります。

  • DISTRIBUTE BY HASH句を指定する必要があり、これは、分散キーを使用して指定する必要があります(主キーを指定し、主キーを分散キーとして使用する場合であっても)。

  • AS SelectQuery句の前にDISTRIBUTE BY HASH句を指定する必要があります。

  • DISTRIBUTE BY HASH句のみ指定できます。DISTRIBUTE BY REFERENCE句およびDUPLICATE句はサポートされていません。

  • SelectQueryは単一表SELECT文に制限する必要があります。

  • SelectQueryではGROUP BYまたはWHERE句を指定できません。

  • SelectQueryではSQL関数を使用できません。

  • SelectQueryでは式を使用できません。

  • マテリアライズド・ビューのディテール表ではカスケード削除句を含む外部キーは使用できません。

  • 分散キー列は、SelectQueryの投影リストに含まれている必要があります。

  • DDLはリライトされません。たとえば、ディテール表に一意の索引を作成した場合、(一意列に分散されている)マテリアライズド・ビューに対応する索引は作成されません。

説明: TimesTen ScaleoutおよびTimesTen Classic

問合せの定義について、次の制限事項および要件があります。

  • SELECT構文のリストの各式には、一意の名前が必要です。

  • 非マテリアライズド・ビューを使用してマテリアライズド・ビューを定義しないでください。

  • マテリアライズド・ビュー問合せの選択リストの列にCLOBBLOB、またはNCLOBデータ型を定義しないでください。

  • ディテール表はキャッシュ・グループに属すことができず、ディテール表は圧縮を使用できません。

  • SELECT FOR UPDATE.は使用しないでください。

  • システム表またはシステム・ビューを参照しないでください。

  • マテリアライズド・ビューでネストされた定義を使用しないでください。

  • 動的パラメータを使用しないでください。

  • ROWNUMを使用しないでください。

  • 分析関数を使用しないでください。

  • GROUPING SETSROLLUP、またはCUBEを使用しないでください。

  • SYSDATEファンクションを使用しないでください。

  • SYSTEM_USERファンクション、USERファンクション、CURRENT_USERファンクション、またはSESSION_USERファンクションを使用しないでください。

  • NEXTVALまたはCURRVALを使用しないでください。

  • OUTER JOINは使用できますが、選択リストは、外部結合に指定した各内部表に1つ以上のNULL値可能でない列を投影する必要があります。

  • WITH subquery句は使用しないでください。

次の制限事項(問合せの定義を除く)があります。

  • マテリアライズド・ビューの列の集計がある、ハッシュ・ベースの主キーを使用しないでください。

  • マテリアライズド・ビューは、TimesTenレプリケーションを使用して直接レプリケートできません。ディテール表はレプリケートできます。レプリケートの両側で同じマテリアライズド・ビューを定義する必要があります。TimesTenでは、該当するマテリアライズド・ビューが自動的に更新されます。

  • 参照元または参照先の表がマテリアライズド・ビューの場合は、外部キーを定義できません。

問合せの定義に関する次の制限事項および要件があります。

  • ビューの定義には、選択リストのGROUP BYリストのすべての列が含まれる必要があります。

  • 集約ビューには、選択リストのCOUNT (*)またはCOUNT(NULL値不可の列)が含まれる必要があります。

  • 導出表またはJOIN表を使用しないでください。

  • SELECT DISTINCTファンクションまたは集計DISTINCTファンクションを使用しないでください。

  • 集合演算子UNIONINTERSECTまたはMINUSを使用しないでください。

  • NULL値可能な式のSUMを使用しないでください。

  • 単純な列のみをGROUP BY列として使用してください。

  • GROUP BY列は自己結合表に属することができません。

  • 次の句を使用しないでください。

    • HAVING

    • ORDER BY

    • DISTINCT

    • FIRST

    • JOIN

  • TT_HASHファンクションを使用しないでください。

  • SUMおよびCOUNTを使用できますが、SUMおよびCOUNTを含む式は使用しないでください。SUM/COUNTとして処理されるAVGを使用しないでください。

  • 選択リストでMINファンクションまたはMAXファンクションを指定しないでください。

  • 結合の場合

    • 結合述語にORを使用できません。

    • デカルト積の結合(結合述語のない結合)を指定しないでください。

    • 外部結合では、各内部表を1つ以上の表に外部結合します。

その他の考慮事項は、次のとおりです。

  • マテリアライズド・ビューは読取り専用であり、直接更新できません。マテリアライズド・ビューの更新は、関連付けられたディテール表が変更された場合にのみ実行されます。このため、マテリアライズド・ビューに対してDELETEUPDATEまたはINSERT文を実行することはできません。

  • デフォルトでは、マテリアライズド・ビューで主キーを使用するために範囲索引が作成されます。かわりにUNIQUE HASH句を使用して、主キーに対してハッシュ索引を指定できます。

    • アプリケーションでマテリアライズド・ビューの主キーに対して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、マテリアライズド・ビューに対して範囲索引を選択してください。

    • 主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。UNIQUE HASH句の詳細は、「CREATE TABLE」を参照してください。

  • 主キーで使用する索引の変更、またはハッシュ索引のサイズ変更を行うには、ALTER TABLEを使用できます。

  • ALTER TABLE文でマテリアライズド・ビューの列の追加または削除を行うことはできません。マテリアライズド・ビューの構造を変更するには、ビューを削除してから再度作成します。

  • マテリアライズド・ビューの索引は、CREATE INDEX SQL文を使用して作成できます。

マテリアライズド・ビューの所有者には、ディテール表に対するSELECT権限が必要です。SELECT権限は、SELECT ANY TABLEおよびADMINシステム権限によって暗黙的に指定されます。ディテール表に対するSELECT権限またはそれ以上のレベルのシステム権限がマテリアライズド・ビューの所有者から削除されると、マテリアライズド・ビューは無効になります。

無効なマテリアライズド・ビューから選択すると、エラーを伴って失敗します。無効なマテリアライズド・ビューのディテール表を更新しても、そのマテリアライズド・ビューは更新されません。

無効なマテリアライズド・ビューを識別するには、ttIsql describeコマンドを使用し、SYS.DBA_OBJECTSSYS.ALL_OBJECTSまたはSYS.USER_OBJECTSシステム表のSTATUS列を調べます。『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』を参照してください。

削除された権限が回復されると、マテリアライズド・ビューを削除して再作成することで、無効なマテリアライズド・ビューを再度有効にすることができます。

詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』マテリアライズド・ビューのオブジェクト権限に関する項を参照してください。

CREATE MATERIALIZED VIEWの例: TimesTen Scaleout

構文の例:

Command> CREATE MATERIALIZED VIEW mv
             DISTRIBUTE BY HASH (phone)
             AS SELECT phone FROM accounts;
1010 rows materialized.

例: TimesTen Classic

customer表とbookorder表の列からマテリアライズド・ビューを作成します。

CREATE MATERIALIZED VIEW custorder AS
  SELECT custno, custname, ordno, book
  FROM customer, bookorder
  WHERE customer.custno=bookorder.custno;

t1表のx1およびy1列からマテリアライズド・ビューを作成します。

CREATE MATERIALIZED VIEW v1 AS SELECT x1, y1 FROM t1
  PRIMARY KEY (x1) UNIQUE HASH ON (x1) PAGES=100;

t1表とt2表のx1およびy1列の外部結合からマテリアライズド・ビューを作成します。

CREATE MATERIALIZED VIEW v2 AS SELECT x1, y1 FROM t1, t2
  WHERE x1=x2(+);

次の例では、表employeesから選択された列employee_idおよびemailに基づいて、マテリアライズド・ビューempmatview2を作成します。マテリアライズド・ビューの作成後、マテリアライズド・ビューempmatview2の列mvemp_idに索引を作成します。

CREATE MATERIALIZED VIEW empmatview2
   AS SELECT employee_id mvemp_id, email mvemail 
         FROM employees;
107 rows materialized. 

CREATE INDEX empmvindex ON empmatview2 (mvemp_id);

CREATE PACKAGE

CREATE PACKAGE文は、データベースに一緒に格納される、関連するプロシージャやファンクション、その他のプログラム・オブジェクトをカプセル化したコレクションである、スタンドアロン・パッケージの仕様部を作成します。パッケージ仕様でこれらのオブジェクトを宣言します。パッケージ本体でこれらのオブジェクトを定義します。

必要な権限

CREATE PROCEDURE(所有者の場合)またはCREATE ANY PROCEDURE(非所有者の場合)。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE [OR REPLACE] PACKAGE [Owner.]PackageName
      [InvokerRightsClause] [AccessibleByClause]
      {IS|AS}
      PlsqlPackageSpec

InvokerRightsClause::=
AUTHID {CURRENT_USER | DEFINER}

AccessibleByClause::=
ACCESSIBLE BY (accessor[,...])

accessor::= 
[UnitKind][Owner.]UnitName

InvokerRightsClauseまたはAccessibleByClauseは任意の順序で指定できます。

パラメータ

パラメータ 説明

OR REPLACE

パッケージ仕様がすでに存在する場合に再作成するには、OR REPLACEを指定します。この句を使用して、パッケージを削除および再作成せずに既存のパッケージの仕様を変更します。パッケージ仕様を変更すると、そのパッケージ仕様はTimesTenで再コンパイルされます。

PackageName

パッケージの名前。

InvokerRightsClause

PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。AUTHIDの設定は、実行時にPL/SQLプロシージャまたはファンクションによって発行されるSQL文の名前解決および権限チェックに次のように影響を与えます。

  • DEFINERを指定すると、SQLの名前解決および権限チェックは、プロシージャまたはファンクションの所有者(定義者、つまりプロシージャまたはファンクションがあるスキーマの所有者)が実行しているものとして実行されます。DEFINERがデフォルトです。

  • CURRENT_USERを指定すると、SQLの名前解決および権限チェックは、現在のユーザー(実行者)が実行しているものとして実行されます。

詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』定義者権限および実行者権限(AUTHID句)に関する項を参照してください。

AccessibleByClause

この句は、パッケージを直接呼び出せる1つ以上のアクセッサ(PL/SQL単位)を指定する場合に使用します。パッケージにアクセスできるアクセッサのリストは、ホワイトリストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにパッケージへのアクセスを制限できます。

AccessibleByClauseは、CREATE PACKAGE文で1回のみ指定できます。

構文: ACCESSIBLE BY (accessor [,...])

accessor

AccessibleByClauseで使用されます。アクセッサは、パッケージを呼び出せるPL/SQLユニットです。

アクセッサは、AccessibleByClause句で複数回指定できます。

構文: [UnitKind][Owner.]UnitName

UnitKind

accessor句(AccessibleByClause句の一部)で使用されます。パッケージを呼び出せるPL/SQLユニットの種類を指定します。

  • UnitKindはオプションですが、指定する場合の有効なオプションは次のとおりです。
  • FUNCTION

  • PROCEDURE

  • PACKAGE

[Owner.]UnitName

accessor句(AccessibleByClause句の一部)で使用されます。パッケージを呼び出せるPL/SQLユニットの名前を指定します。UnitKindを指定する場合、UnitNameをこの種類のユニットの名前にする必要があります。たとえば、UnitKindPROCEDUREを指定する場合、UnitNameはプロシージャ名である必要があります。UnitNameは必須です。

Ownerは必要に応じて指定できます。Ownerを指定する場合、UnitNameがその所有者のスキーマ内に常駐する必要があります。Ownerを指定しない場合、UnitNameはパッケージを含むスキーマ内にある必要があります。

IS|AS

ISまたはASを指定して、ファンクションの本体を宣言します。

PlsqlPackageSpec

パッケージ仕様を指定します。型定義、カーソル宣言、変数宣言、定数宣言、例外宣言およびPL/SQLサブプログラム宣言を含めることができます。

説明

  • AccessibleByClause:

    • AccessibleByClauseは、トップレベルのパッケージ定義で有効です。パッケージ内の個々のプロシージャまたはファンクションにAccessibleByClauseを指定することはできません。また、CREATE PACKAGE BODY文でAccessibleByClauseは指定できません。

    • この句は、ヘルパー・パッケージへのアクセスを制限するために使用できます。たとえば、PL/SQLパッケージに特定の機能のAPIが定義されており、その機能が一連のヘルパー・プロシージャおよびファンクションを使用して実装されているとします。パッケージに定義されているAPIプロシージャやファンクションをコールできるようにのみアプリケーションを制限し、ヘルパー・プロシージャやファンクションを直接コールできないようにする必要があります。そのために、ACCESSIBLE BY句を使用できます。

    • コンパイラはACCESSIBLE BY句の構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。

    • パッケージを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このパッケージにACCESSIBLE BY句がない場合、呼出しは成功します。パッケージにACCESSIBLE BY句がある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。

  • パッケージを作成または置き換えた場合、パッケージに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。

  • レプリケートされた環境で、CREATE PACKAGE文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。

AccessibleByClauseの適切な使用方法の説明

この例は、AccessibleByClauseの正しい使用方法を示しています。この句は、CREATE PACKAGE文のトップレベルで指定されます。CallingProcプロシージャが存在する必要はないことに注意してください。

Command> CREATE OR REPLACE PACKAGE ProtectedPkg
           ACCESSIBLE BY (PROCEDURE CallingProc)
         AS
           PROCEDURE ProtectedProc;
         END;
         /
 
Package created.

AccessibleByClauseの不適切な使用方法の説明

これらの例は、AccessibleByClauseの不適切な使用を示しています。最初の例では、パッケージ・プロシージャのAccessibleByClauseを使用しようとしてコンパイル・エラーが発生します。2番目の例では、CREATE PACKAGE BODY文でAccessibleByClauseを使用しようとしてコンパイル・エラーになります。

この例では、パッケージ・プロシージャでACCESSIBLE BY句を使用します。

Command> CREATE OR REPLACE PACKAGE ProtectedPkg1
         AS
           PROCEDURE ProtectedProc1 
           ACCESSIBLE BY (PROCEDURE CallingProc)
         END;
         /
         
Warning: Package created with compilation errors.
 
Command> SHOW ERRORS
Errors for PACKAGE PROTECTEDPKG1:
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
0/0      PLS-00157: Only schema-level programs allow ACCESSIBLE BY

この例では、CREATE PACKAGE BODY文でACCESSIBLE BY句を使用します。

Command> CREATE OR REPLACE PACKAGE ProtectedPkg3
           ACCESSIBLE BY (PROCEDURE CallingProc3)
         AS
           PROCEDURE ProtectedProc3;
         END;
         /
        
Package created.

Command> CREATE OR REPLACE PACKAGE BODY ProtectedPkg3
           ACCESSIBLE BY (PROCEDURE CallingProc3)
         AS
           PROCEDURE ProtectedProc3 AS
           BEGIN
             NULL;
           END;
           ;
         /
 
Warning: Package body created with compilation errors.
 
Command> SHOW ERRORS
Errors for PACKAGE BODY PROTECTEDPKG3:
 
LINE/COL ERROR
-------- -----------------------------------------------------------------
2/1      PLS-00103: Encountered the symbol "ACCESSIBLE" when expecting one of the
following:
 
  is as compress compiled wrapped

APIのみをヘルパー・パッケージにアクセス可能にする方法

この例では、AccessibleByClauseの使用を説明する一連のステップを示します。例では、SampleAPIパッケージおよびSampleHelperパッケージを作成します。ACCESSIBLE BY句は、SampleAPIパッケージのみがSampleHelperパッケージにアクセスできるように、SampleHelperで指定されています。

ステップ:

  1. SampleHelperパッケージを作成します。ACCESSIBLE BY句を指定し、SampleAPIパッケージにSampleHelperパッケージへのアクセス権を付与します。SampleAPIパッケージは、ホワイト・リストにあります。

    Command> CREATE OR REPLACE PACKAGE SampleHelper
               ACCESSIBLE BY (SampleAPI)
             AS
               PROCEDURE SampleH1;
               PROCEDURE SampleH2;
             END;
             /
     
    Package created.
    
  2. SampleHelperパッケージ本体を作成します。

    Command> CREATE OR REPLACE PACKAGE BODY SampleHelper
             AS
               PROCEDURE SampleH1 AS
               BEGIN
                 DBMS_OUTPUT.PUT_LINE('Sample helper procedure SampleH1');
               END;
               PROCEDURE SampleH2 AS
               BEGIN
                 DBMS_OUTPUT.PUT_LINE('Sample helper procedure SampleH2');
               END;
             END;
             /
     
    Package body created.
    
  3. SampleAPIパッケージを作成します。

    Command> CREATE OR REPLACE PACKAGE SampleAPI
             AS
               PROCEDURE p1;
               PROCEDURE p2;
             END;
             /
     
    Package created.
    
  4. SampleAPIパッケージ本体を作成します。p1プロシージャは、SampleHelper.SampleH1プロシージャを参照します。p2プロシージャは、SampleHelper.SampleH2プロシージャを参照します。

    Command> CREATE OR REPLACE PACKAGE BODY SampleAPI
             AS
               PROCEDURE p1 AS
               BEGIN
                 DBMS_OUTPUT.PUT_LINE('SampleAPI procedure p1');
                 SampleHelper.SampleH1;
               END;
               PROCEDURE p2 AS
               BEGIN
                 DBMS_OUTPUT.PUT_LINE('SampleAPI procedure p2');
                 SampleHelper.SampleH2;
               END;
             END;
             /
     
    Package body created.
    
  5. SampleAPI.p1プロシージャおよびSampleAPI.p2プロシージャをコールします。SampleAPIパッケージはSampleHelperパッケージのホワイト・リストにあり、実行は成功します。

    Command> SET SERVEROUTPUT ON
    Command> BEGIN
               SampleAPI.p1;
               SampleAPI.p2;
             END;
             /
    SampleAPI procedure p1
    Sample helper procedure SampleH1
    SampleAPI procedure p2
    Sample helper procedure SampleH2
     
    PL/SQL procedure successfully completed.
    
  6. SampleHelper.SampleH1プロシージャを直接コールします。アクセス権限が不十分なため、エラーが返されます。

    Command> BEGIN
               SampleHelper.SampleH1;
             END;
            /
     8503: ORA-06550: line 2, column 3:
    PLS-00904: insufficient privilege to access object SAMPLEHELPER
     8503: ORA-06550: line 2, column 3:
    PL/SQL: Statement ignored
    The command failed.

CREATE PACKAGE BODY

CREATE PACKAGE BODY文は、スタンドアロン・パッケージの本体を作成します。パッケージとは、データベースに格納されている関連するプロシージャ、ファンクションおよびその他のプログラム・オブジェクトのカプセル化されたコレクションのことです。パッケージ仕様でこれらのオブジェクトを宣言します。パッケージ本体でこれらのオブジェクトを定義します。

必要な権限

CREATE PROCEDURE(所有者の場合)またはCREATE ANY PROCEDURE(非所有者の場合)。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE [OR REPLACE] PACKAGE BODY [Owner.]PackageBody 
      {IS|AS} plsql_package_body

パラメータ

パラメータ 説明

OR REPLACE

パッケージ本体がすでに存在する場合に再作成するには、OR REPLACEを指定します。この句を使用して、パッケージを削除および再作成せずに既存のパッケージの本体を変更します。パッケージ本体を変更すると、そのパッケージ本体はTimesTenで再コンパイルされます。

PackageBody

パッケージ本体の名前。

IS|AS

ISまたはASを指定して、ファンクションの本体を宣言します。

plsql_package_body

PL/SQLサブプログラムで構成されるパッケージ本体を指定します。

説明

レプリケートされた環境で、CREATE PACKAGE BODY文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。

パッケージ本体を作成または置き換えた場合、パッケージ本体に付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。

CREATE PROCEDURE

CREATE PROCEDURE文は、スタンドアロンのストアド・プロシージャを作成します。

必要な権限

CREATE PROCEDURE(所有者の場合)またはCREATE ANY PROCEDURE(非所有者の場合)。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE [OR REPLACE] PROCEDURE [Owner.]ProcedureName 
     [(arguments [IN|OUT|IN OUT][NOCOPY] DataType [DEFAULT expr][,...])]
     [InvokerRightsClause][AccessibleByClause] [DETERMINISTIC]
     {IS|AS} plsql_procedure_body

InvokerRightsClause::=
AUTHID {CURRENT_USER|DEFINER}

AccessibleByClause::=
ACCESSIBLE BY(accessor[,...])

accessor::= 
[UnitKind][Owner.]UnitName

InvokerRightsClauseAccessibleByClauseまたはDETERMINISTICは任意の順序で指定できます。

パラメータ

パラメータ 説明

OR REPLACE

プロシージャがすでに存在する場合に再作成するには、OR REPLACEを指定します。この句を使用して、プロシージャを削除および再作成せずに既存のプロシージャの定義を変更します。プロシージャを再作成すると、そのプロシージャはTimesTenで再コンパイルされます。

ProcedureName

プロシージャの名前。

arguments

引数またはパラメータの名前。プロシージャには0以上のパラメータを指定できます。パラメータを指定する場合は、パラメータのデータ型を指定する必要があります。データ型はPL/SQLデータ型である必要があります。

[IN|OUT|IN OUT]

パラメータのモード。

INは読取り専用パラメータです。パラメータの値をプロシージャに渡すことはできますが、プロシージャはパラメータの値をプロシージャ外に渡したり、コール側PL/SQLブロックに戻したりすることはできません。パラメータの値は変更できません。

OUTは書込み専用パラメータです。値をプロシージャからコール側PL/SQLブロックに戻すには、OUTパラメータを使用します。パラメータに値を割り当てることができます。

IN OUTは読取り/書込みパラメータです。値をプロシージャに渡し、コール側プログラムに戻すことができます(元の変更されていない値またはプロシージャ内で設定された新しい値)。

INがデフォルトです。

NOCOPY

可能なかぎり迅速にパラメータを渡すようにTimesTenに指示するには、NOCOPYを指定します。レコード、索引付き表、OUTまたはIN OUTパラメータへのVARRAYなどの大きな値を渡す場合に、パフォーマンスを向上できます。INパラメータでは、常にNOCOPYが渡されます。

DEFAULT expr

パラメータのDEFAULT値を指定するには、この句を使用します。キーワードDEFAULTのかわりに:=を指定できます。

InvokerRightsClause

PL/SQLファンクションまたはプロシージャ内のSQL文が定義者権限で実行されるか実行者権限で実行されるかを指定できます。AUTHIDの設定は、実行時にPL/SQLプロシージャまたはファンクションによって発行されるSQL文の名前解決および権限チェックに次のように影響を与えます。

  • DEFINERを指定すると、SQLの名前解決および権限チェックは、プロシージャまたはファンクションの所有者(定義者、つまりプロシージャまたはファンクションがあるスキーマの所有者)が実行しているものとして実行されます。DEFINERがデフォルトです。

  • CURRENT_USERを指定すると、SQLの名前解決および権限チェックは、現在のユーザー(実行者)が実行しているものとして実行されます。

詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』定義者権限および実行者権限(AUTHID句)に関する項を参照してください。

AccessibleByClause

この句は、プロシージャを直接呼び出せる1つ以上のアクセッサ(PL/SQLユニット)を指定する場合に使用します。プロシージャにアクセスできるアクセッサのリストは、ホワイトリストと呼ばれます。ホワイト・リストを使用すると、PL/SQLオブジェクトにセキュリティ・レイヤーを追加できます。特に、ホワイト・リストにあるオブジェクトのみにプロシージャへのアクセスを制限できます。

AccessibleByClauseは、CREATE PROCEDURE文で1回のみ指定できます。

構文: ACCESSIBLE BY (accessor [,...])

accessor

AccessibleByClauseで使用されます。アクセッサは、プロシージャを呼び出せるPL/SQLユニットです。

アクセサは、AccessibleByClauseで複数回指定できます。

構文: [UnitKind][Owner.]UnitName

UnitKind

accessor句(AccessibleByClause句の一部)で使用されます。プロシージャを呼び出せるPL/SQLユニットの種類を指定します。

  • UnitKindはオプションですが、指定する場合の有効なオプションは次のとおりです。
  • FUNCTION

  • PROCEDURE

  • PACKAGE

[Owner.]UnitName

accessor句(AccessibleByClause句の一部)で使用されます。プロシージャを呼び出せるPL/SQLユニットの名前を指定します。UnitKindを指定する場合、UnitNameをこの種類のユニットの名前にする必要があります。たとえば、UnitKindPROCEDUREを指定する場合、UnitNameはプロシージャ名である必要があります。UnitNameは必須です。

Ownerは必要に応じて指定できます。Ownerを指定する場合、UnitNameがその所有者のスキーマ内に常駐する必要があります。Ownerを指定しない場合、UnitNameはプロシージャを含むスキーマ内にある必要があります。

DETERMINISTIC

パラメータに同じ値を指定してプロシージャをコールした場合に常に同じ結果値を返すように指定するには、DETERMINISTICを指定します。

IS|AS

ISまたはASを指定して、プロシージャの本体を宣言します。

plsql_procedure_body

プロシージャの本体を指定します。

説明

  • AccessibleByClause:

    • コンパイラはAccessibleByClauseの構文の妥当性をチェックしますが、アクセッサが存在することはチェックしません。このため、所有者のスキーマにまだ存在しているアクセッサを定義できます。

    • プロシージャを呼び出すと、コンパイラはまず呼出しの通常のアクセス権チェックを実行します。いずれかのチェックに失敗すると、呼出し元がアクセッサであっても呼出しは失敗します。呼出し時の通常のアクセス権チェックがすべて成功し、このプロシージャにAccessibleByClauseがない場合、呼出しは成功します。プロシージャにAccessibleByClauseがある場合、呼出し元がアクセッサである場合にのみ呼出しは成功します。

  • プロシージャを作成または置き換えた場合、プロシージャに付与された権限は同じままです。オブジェクトを削除して再作成した場合、元のオブジェクトに付与されていたオブジェクト権限は削除されます。

  • PL/SQLプロシージャのネームスペースは、TimesTen組込みプロシージャとは異なります。PL/SQLプロシージャは、TimesTen組込みプロシージャと同じ名前で作成できます。

  • 次の句はTimesTenではサポートされません。

    • call_spec

    • AS EXTERNAL

  • レプリケートされた環境で、CREATE PROCEDURE文はレプリケートされません。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』既存のアクティブ・スタンバイ・ペアでの新規PL/SQLオブジェクトの作成に関する項および既存のクラシック・レプリケーション・スキームへのPL/SQLオブジェクトの追加に関する項を参照してください。

AccessibleByClauseの使用

この例では、ProtectedProcプロシージャを作成し、ACCESSIBLE BY句を使用してCallingProcプロシージャへのアクセスを制限します。CallingProcプロシージャはまだ存在しません。次に、ProtectedProcプロシージャをコールするCallingProcプロシージャを作成します。CallingProcプロシージャは、ACCESSIBLE BY句で指定されているため正常に作成されます。例では、ProtectedProcプロシージャを直接コールしようとしてエラーが発生します。最終的にProtectedProcプロシージャを参照するAnotherCallingProcプロシージャを作成しようとしますが、AnotherCallingProcプロシージャはホワイト・リストに存在しません。コンパイル・エラーが発生します。

この例を示すステップ:

  1. ACCESSIBLE BY句を指定して、ProtectedProcプロシージャを作成します。CallingProcプロシージャは、ホワイト・リストにあります。まだ存在しません。

    Command> CREATE OR REPLACE PROCEDURE ProtectedProc
               ACCESSIBLE BY (CallingProc)
             AS
             BEGIN
               DBMS_OUTPUT.PUT_LINE ('ProtectedProc');
             END;
             /
              
    Procedure created.
    
  2. ProtectedProcプロシージャを参照して、CallingProcプロシージャを作成します。

    Command> CREATE OR REPLACE PROCEDURE CallingProc
             AS
             BEGIN
               DBMS_OUTPUT.PUT_LINE ('CallingProc');
               ProtectedProc;
             END;
             /
             
    Procedure created.
    
  3. CallingProcプロシージャをコールします。プロシージャは正常に実行されます。

    Command> SET SERVEROUTPUT ON
    Command> exec CallingProc;
    CallingProc
    ProtectedProc
     
    PL/SQL procedure successfully completed.
    
  4. ProtectedProcプロシージャの直接のコールを試行します。アクセス権限が不十分なため、エラーがスローされます。

    Command> exec ProtectedProc;
     8503: ORA-06550: line 1, column 7:
    PLS-00904: insufficient privilege to access object PROTECTEDPROC
     8503: ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored
    The command failed.
    
  5. ProtectedProcプロシージャを参照するAnotherCallingProcプロシージャを作成します。AnotherCallingProcがホワイト・リスト内にない(ProtectedProcACCESSIBLE BY句に含まれない)ため、コンパイル・エラーが発生します。

    Command> CREATE OR REPLACE PROCEDURE AnotherCallingProc
             AS
             BEGIN
               DBMS_OUTPUT.PUT_LINE ('AnotherCallingProc');
               ProtectedProc;
             END;
             /
     
    Warning: Procedure created with compilation errors.
     
    Command> SHOW ERRORS
    Errors for PROCEDURE ANOTHERCALLINGPROC:
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    5/1      PL/SQL: Statement ignored
    5/1      PLS-00904: insufficient privilege to access object PROTECTEDPROC
    

アクセサ句の使用

この例は、アクセッサ句を一連のステップで使用する方法を示しています。

  1. SampleUser1ユーザーとSampleUser2ユーザーを作成し、両方のユーザーにADMIN権限を付与します。

    Command> CREATE USER SampleUser1 IDENTIFIED BY SampleUser1;
     
    User created.
     
    Command> CREATE USER SampleUser2 IDENTIFIED BY SampleUser2;
     
    User created.
    Command> GRANT ADMIN TO SampleUser1, SampleUser2;
    
  2. ACCESSIBLE BY句を指定して、SampleUser1.ProtectedProcプロシージャを作成します。CallingProcプロシージャは、所有者なしでホワイト・リスト内に指定されます。CallingProcプロシージャの所有者は、ACCESSIBLE BY句を持つプロシージャの所有者と同じスキーマ内に存在すると想定されます。したがって、CallingProcSampleUser1スキーマ内にあるとみなされます。

    Command> CREATE OR REPLACE PROCEDURE SampleUser1.ProtectedProc
             ACCESSIBLE BY (CallingProc)
             AS
             BEGIN
               DBMS_OUTPUT.PUT_LINE ('SampleUser1 ProtectedProc');
             END;
             /
     
    Procedure created.
    
  3. SampleUser1として接続します。SampleUser1.ProtectedProcプロシージャを参照して、CallingProcプロシージャを作成します。

    Command> Connect adding "uid=SampleUser1;pwd=SampleUser1PW" as SampleUser1;
    Connection successful:
    DSN=database1;UID=SampleUser1;DataStore=/scratch/sampleuser1/database1;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;
    PermSize=128;
    (Default setting AutoCommit=1)
    
    sampleuser1: Command> CREATE OR REPLACE PROCEDURE CallingProc
                          AS
                          BEGIN
                            DBMS_OUTPUT.PUT_LINE ('SampleUser1 CallingProc');
                            ProtectedProc;
                          END;
                          /
     
    Procedure created.
    
  4. SampleUser1接続から、CallingProcプロシージャをコールします。コールは成功します。

    sampleuser1: Command> SET SERVEROUTPUT ON
    sampleuser1: Command> exec CallingProc;
    SampleUser1 CallingProc
    SampleUser1 ProtectedProc
     
    PL/SQL procedure successfully completed.
    
  5. SampleUser2に接続します。SampleUser1.ProtectedProcプロシージャを参照して、CallingProcプロシージャを作成します。コンパイル・エラーが発生します。

    SampleUser1: Command> connect adding "uid=Sampleuser2;pwd=SampleUser2PW"
                          as SampleUser2;
    Connection successful:
    DSN=database1;UID=Sampleuser2;DataStore=/scratch/sampleuser2/database1;
    DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;
    PermSize=128;
    (Default setting AutoCommit=1)
    
    sampleuser2: Command> CREATE OR REPLACE PROCEDURE CallingProc
                          AS
                          BEGIN
                            DBMS_OUTPUT.PUT_LINE ('SampleUser2 CallingProc');
                            SampleUser1.ProtectedProc;
                          END;
                          /
     
    Warning: Procedure created with compilation errors.
     
    sampleuser2: Command> SHOW ERRORS
    Errors for PROCEDURE CALLINGPROC:
     
    LINE/COL ERROR
    -------- -----------------------------------------------------------------
    5/1      PL/SQL: Statement ignored
    5/1      PLS-00904: insufficient privilege to access object PROTECTEDPROC
    
  6. SampleUser1接続に切り替えます。ProtectedProcプロシージャを再作成します。

    sampleuser2: Command> use SampleUser1
    sampleuser1: Command> CREATE OR REPLACE PROCEDURE ProtectedProc
                          ACCESSIBLE BY (CallingProc, SampleUser2.CallingProc)
                          AS
                          BEGIN
                            DBMS_OUTPUT.PUT_LINE ('SampleUser1 ProtectedProc');
                          END;
                          /
     
    Procedure created.
    
  7. SampleUser2接続から、CallingProcプロシージャをコールします。SampleUser2.CallingProcSampleUser1.ProtectedProcプロシージャのホワイト・リストにあり、実行が成功します。

    sampleuser1: Command> use SampleUser2;
    sampleuser2: Command> SET SERVEROUTPUT ON
    sampleuser2: Command> exec CallingProc
    SampleUser2 CallingProc
    SampleUser1 ProtectedProc
     
    PL/SQL procedure successfully completed.

CREATE PROCEDURE文を使用した情報の取得

プロシージャquery_empを作成して、従業員に関する情報を取得します。employee_id 171をプロシージャに渡し、2つのOUTパラメータに対してlast_nameおよびsalaryを取得します。

Command> CREATE OR REPLACE PROCEDURE query_emp
                   (p_id IN employees.employee_id%TYPE,
                    p_name  OUT employees.last_name%TYPE,
                    p_salary OUT employees.salary%TYPE) IS
                 BEGIN
                   SELECT last_name, salary INTO p_name, p_salary
                   FROM employees
                   WHERE employee_id = p_id;
                 END query_emp;
                 /
 
Procedure created.

CREATE PROFILE

CREATE PROFILE文では、プロファイルを作成します。プロファイルとは、データベース・リソースに対する制限のセットです。ユーザーにプロファイルを割り当てると、そのユーザーはプロファイルで指定された制限を超えることができなくなります。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE PROFILE profile LIMIT password_parameters

password_parameters::=
[FAILED_LOGIN_ATTEMPTS password_parameter_options]
[PASSWORD_LIFE_TIME password_parameter_options]
[PASSWORD_REUSE_TIME password_parameter_options]
[PASSWORD_REUSE_MAX password_parameter_options]
[PASSWORD_LOCK_TIME password_parameter_options]
[PASSWORD_GRACE_TIME password_parameter_options]
[{PASSWORD_COMPLEXITY_CHECKER|PASSWORD_VERIFY_FUNCTION} password_checker_options]

password_parameter_options::=
UNLIMITED|DEFAULT|constant

password_checker_options::=
function|NULL|DEFAULT

function::
TT_VERIFY_FUNCTION|TT_STRONG_VERIFY_FUNCTION|TT_STIG_VERIFY_FUNCTION

パラメータ

パラメータ 説明

profile

プロファイルの名前。

LIMIT password_parameters

LIMIT句では、パスワード・パラメータの制限を設定します。LIMITキーワードは必須です。

パスワード・パラメータは、パスワード・パラメータの名前とパスワード・パラメータの値(または制限)で構成されます。これには、パスワード複雑度チェッカ関数が含まれます。すべてのパラメータ(FAILED_LOGIN_ATTEMPTSPASSWORD_REUSE_MAXを除く)では、時間の長さを設定します。この長さは日数として解釈されます。小数値を使用できます(たとえば、約1時間を意味するために.0833を使用できます)。最小値は1秒です。最大値は106,751,991日です。定数値は日数で表す必要があります。たとえば、5分の値を設定するには、定数値の0.0034722222222222 (5/1440日)を指定します。FAILED_LOGIN_ATTEMPTSPASSWORD_REUSE_MAXには、整数を指定する必要があります。

LIMIT句の後にパスワード・パラメータを指定しないと、そのパスワード・パラメータの制限は、DEFAULTプロファイルで定義した制限に基づくようになります。また、追加のパラメータなしでLIMITキーワードのみを指定すると、プロファイルの制限はDEFAULTプロファイルの制限に基づくようになります。

FAILED_LOGIN_ATTEMPTS

ユーザーのアカウントがロックされるまでの、ユーザーによるデータベースへの接続試行の連続失敗回数を指定します。

PASSWORD_LIFE_TIME

ユーザーが認証に同じパスワードを使用できる日数を指定します。PASSWORD_GRACE_TIMEの値も設定すると、猶予期間内にパスワードが変更されない場合に、パスワードが期限切れになります。このような状況になると、その後のデータベースへの接続は拒否されます。

PASSWORD_REUSE_TIMEおよびPASSWORD_REUSE_MAX

これら2つのパラメータは、同時に使用する必要があります。

  • PASSWORD_REUSE_TIMEでは、ユーザーがパスワードを再利用できるようになるまでの経過日数を指定します。たとえば、30の値を指定した場合、ユーザーは、以前のパスワードを30日後に再利用できるようになります。

  • PASSWORD_REUSE_MAXでは、現行のパスワードが再利用できるようになるまでに必要なパスワードの変更回数を指定します。

これらのパラメータを有効にするには、その両方に値を指定する必要があります。具体的には、次のようになります。

  • 両方のパラメータに値を指定した場合: PASSWORD_REUSE_TIMEに指定した日数の間に、PASSWORD_REUSE_MAXに指定した回数になるまでパスワードを変更していないと、ユーザーはパスワードを再利用できません。たとえば、PASSWORD_REUSE_TIME30の値を指定し、PASSWORD_REUSE_MAX10の値を指定した場合、ユーザーはパスワードを10回変更していれば、30日後にパスワードを再利用できます。

  • どちらかのパラメータに値を指定して、もう一方のパラメータにUNLIMITEDの値を指定すると、ユーザーはパスワードを再利用できなくなります。

  • 両方のパラメータにUNLIMITEDの値を指定すると、TimesTenは両方の値を無視します。つまり、パスワードが再利用できることを意味します。

PASSWORD_LOCK_TIME

指定した回数連続して接続に失敗した後に、ユーザー・アカウントがロックされる日数を指定します。

PASSWORD_GRACE_TIME

猶予期間の開始後の日数を指定します。この間は、TimesTenが警告を示しますが、データベースへの接続は許可されます。猶予期間中にパスワードが変更されないと、そのパスワードは期限切れになります。このパラメータは、PASSWORD_LIFE_TIMEパラメータに関連付けられます。

UNLIMITED

パスワード・パラメータに制限がないことを示します。UNLIMITEDを指定した場合は、パスワード・パラメータに従うことになります。たとえば、FAILED_LOGIN_ATTEMPTS UNLIMITED

DEFAULT

このプロファイルのパスワード・パラメータに対する制限を省略することを示します。このプロファイルが割り当てられているユーザーは、このパスワード・パラメータのDEFAULTプロファイルで定義された制限を受けます。

DEFAULTを指定した場合は、パスワード・パラメータに従うことになります。たとえば、FAILED_LOGIN_ATTEMPTS DEFAULT

constant

UNLIMITEDまたはDEFAULTを指定していない場合のパスワード・パラメータの値を示します。指定した場合は、パスワード・パラメータに従うことになります。たとえば、FAILED_LOGIN_ATTEMPTS 3

{PASSWORD_COMPLEXITY_CHECKER| PASSWORD_VERIFY_FUNCTION} {function|NULL|DEFAULT}

パスワードに対するパスワード検証を実行するかどうかを示します。実行する場合は、検証に使用する関数を指定します。PASSWORD_COMPLEXITY_CHECKERまたはPASSWORD_VERIFY_FUNCTIONのどちらかのパスワード・パラメータを指定できます。これらは同じものです。

functionは、サポートされている3つのパスワード複雑度チェッカ関数のいずれかを示します。TimesTenにパスワード検証を実行するように指示するには、これらの関数のいずれかを指定します。有効な値は次のとおりです。
  • TT_VERIFY_FUNCTION
  • TT_STRONG_VERIFY_FUNCTION
  • TT_STIG_VERIFY_FUNCTION

NULLは、プロファイルに割り当てられたパスワード検証関数が存在しないことを示します。

DEFAULTは、ユーザーがDEFAULTプロファイルで定義された制限を受けることを示します。DEFAULTプロファイルの初期の値はNULLです。

PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータを指定しない場合、その値はDEFAULTプロファイルに定義されている制限にデフォルト設定されます。

説明: PROFILE文

  • CREATE PROFILE文を使用して、パスワード・リソースのプロファイルを作成します。パスワード・パラメータとは、パスワード・リソースに対する制限のセットです。ユーザーにプロファイルを割り当てると、そのユーザーはプロファイルで指定された制限を超えることができなくなります。ユーザーにプロファイルを割り当てていないと、TimesTenによってDEFAULTプロファイルが割り当てられます。パスワード管理とプロファイルの詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』パスワード管理に関する項を参照してください。

  • ユーザーのパスワード・パラメータ制限を指定するには、次の手順を実行します。

    • CREATE PROFILE文を使用して、パスワード・パラメータの制限を定義するプロファイルを作成します。

    • CREATE USER文またはALTER USER文を使用して、ユーザーにプロファイルを割り当てます。

  • 各パスワード・パラメータの制限を定義する、DEFAULTプロファイルがあります。このプロファイルは、これらのパラメータに最初にUNLIMITEDを定義します(パラメータに制限が設定されていないことを示します)。次の例外があります。

    • FAILED_LOGIN_ATTEMPTS: 10に設定されます。

    • PASSWORD_LOCK_TIME: 0.0034722222222222日(5分、5/1440日)に設定されます。

    • PASSWORD_COMPLEXITY_CHECKER: NULLに設定されます。

    これらの制限を変更するには、ALTER PROFILE文を使用して、プロファイル名に"DEFAULT"を指定します。(DEFAULTは二重引用符で囲む必要があります)。詳細は、「ALTER PROFILE」を参照してください。

  • ユーザーにプロファイルが割り当てられていない場合、そのユーザーはDEFAULTプロファイルに定義されている制限を受けます。ユーザーにプロファイルが割り当てられていて、そのプロファイルでパスワード・パラメータの制限が指定されていない場合や、パスワード・パラメータにDEFAULTが指定されている場合、そのユーザーはDEFAULTプロファイルで定義されているパスワード・パラメータの制限を受けます。

  • インスタンス管理者には、システム・プロファイルが割り当てられます。インスタンス管理者のプロファイルは、変更することも削除することもできません。

パスワード複雑度チェッカの検証について

パスワード複雑度チェッカの検証により、ユーザーのパスワードはパスワードを推測しようとする侵入者を十分に阻止できる複雑なものになります。CREATE PROFILE文でパスワード複雑度チェッカ関数を指定し、このプロファイルをユーザーに割り当てると、ユーザーはパスワード複雑度チェッカ関数で定義されている要件を満たすパスワードを作成することが必要になります。そのような要件は、指定した特定のパスワード複雑度チェッカ関数によって異なります。

TimesTenには、パスワードの複雑度を管理するために、TT_VERIFY_FUNCTIONTT_STRONG_VERIFY_FUNCTIONおよびTT_STIG_VERIFY_FUNCTIONのパスワード複雑度チェッカ関数が用意されています。これらの関数は、SYSスキーマに格納されています。

パスワード複雑度チェッカ関数が対象にする文字は、文字、数字、および特殊文字です。
  • 文字:大文字と小文字
  • 数字: 0から9の数字
  • 特殊: 文字でも数字でもない文字。
    `~!@#$%^&*()_-+={}[]\/<>,.?':|(space)

    ノート:

    • 1つ以上の特殊文字を使用する場合は、パスワード全体を二重引用符(")で囲む必要があります。例外は、#@の特殊文字です。(#または@を含むパスワードは、二重引用符で囲む必要がありません)。

    • パスワードには、セミコロン(;)や二重引用符(")を含めることはできません。

    • パスワード全体を二重引用符で囲まないかぎり、パスワードの先頭は文字にする必要があります。

パスワード複雑度チェッカの検証に独自の関数を定義することはできません。CREATE USER文またはALTER USER文でIDENTIFIED BY句を使用すると、パスワードの複雑度がチェックされます。

次に、パスワード複雑度チェッカ関数を示します。

TT_VERIFY_FUNCTION

TT_VERIFY_FUNCTIONは、次のパスワード複雑度チェッカの検証を実行します。
  • パスワードは次のようにします。
    • 8文字以上にする必要があります。
    • これらの8文字のうちに、それぞれ少なくとも1つの文字、1つの数字、1つの特殊文字を含める必要があります。
  • パスワードに使用できないものを次に示します。
    • ユーザー名またはユーザー名を逆にしたもの
    • データベース名
    • OracleまたはTimesTen

    ノート:

    比較では、大文字と小文字が区別されません。

TT_STRONG_VERIFY_FUNCTION

TT_STRONG_VERIFY_FUNCTIONは、次のパスワード複雑度チェッカの検証を実行します。
  • 9文字以上にする必要があります。
  • この9文字のうちに、それぞれ少なくとも2つの大文字、2つの小文字、2つの数字および2つの特殊文字を含める必要があります。

TT_STIG_VERIFY_FUNCTION

TT_STIG_VERIFY_FUNCTIONは、次のパスワード複雑度チェッカの検証を実行します。
  • 15文字以上にする必要があります。
  • この15文字のうちに、それぞれ少なくとも1つの大文字、1つの小文字、1つの数字および1つの特殊文字を含める必要があります。

説明: パスワード複雑度チェッカの検証

  • TT_VERIFY_FUNCTIONTT_STRONG_VERIFY_FUNCTIONおよびTT_STIG_VERIFY_FUNCTIONに対するEXECUTE権限が必要です。TimesTenは、これらの関数に対するEXECUTE権限をPUBLICにデフォルトで付与します。
  • SYSTEMプロファイルとDEFAULTプロファイルには、NULLの値がデフォルトで割り当てられます。NULL値は、これらのプロファイルにパスワード複雑度チェッカ関数が存在しないことを示します。そのため、パスワード複雑度チェッカの検証は実行されません。
  • SYSTEMプロファイルを変更して、パスワード複雑度チェッカ関数を指定することはできません。システム・ユーザーのパスワードは、パスワード複雑度チェッカの検証の対象にはなりません。
  • ALTER PROFILE文を使用すると、パスワード複雑度チェッカ関数を指定するためにDEFAULTプロファイルを変更できます。そうした関数は、PASSWORD_COMPLEXITY_CHECKER (または PASSWORD_VERIFY_FUNCTION)句で指定します。
  • TimesTenのTT_VERIFY_FUNCTION関数、TT_STRONG_VERIFY_FUNCTION関数およびTT_STIG_VERIFY_FUNCTION関数は、Oracle DatabaseのORA12C_VERIFY_FUNCTION関数、ORA12C_STRONG_VERIFY_FUNCTION関数およびORA12C_STIG_VERIFY_FUNCTION関数と同等のものです。
  • ttMigrateユーティリティを使用して以前のメジャー・リリース(18.1リリースなど)にダウングレードすると、データベース内の各プロファイルのPASSWORD_COMPLEXITY_CHECKERの値はNULLに設定されます。

パスワード複雑度チェッカ関数の制限

パスワード複雑度チェッカ関数の制限は、次のとおりです。
  • パスワード複雑度チェッカ関数には、SYSスキーマを指定できません。たとえば:
    Command> CREATE PROFILE my_profile LIMIT 
               PASSWORD_COMPLEXITY_CHECKER SYS.TT_VERIFY_FUNCTION;
    15187: Cannot specify schema name for password complexity checker function
    The command failed.
    
  • 独自のパスワード複雑度チェッカ関数を定義することはできません。TT_VERIFY_FUNCTIONTT_STRONG_VERIFY_FUNCTIONまたはTT_STIG_VERIFY_FUNCTIONのパスワード複雑度チェッカ関数のみを使用してください。
  • パスワード複雑度チェッカの検証は、新しく作成したパスワードにのみ実行されます。この新しいパスワードは、CREATE USER文またはALTER USER文のIDENTIFIED BY句を使用して指定します。TimesTenは、古いパスワードと新しいパスワードの違いを確認しません。
  • パスワードの指定時に、マルチバイト文字はサポートされません。TimesTenは、マルチバイト文字が含まれるパスワードを検証しません。

PASSWORD_COMPLEXITY_CHECKERに対するTT_VERIFY_FUNCTIONの指定

この例では、最初にプロファイルを作成して、TT_VERIFY_FUNCTION関数を指定します。その後で、dba_profilesシステム・ビューを問い合せて、このプロファイルにTT_VERIFY_FUNCTIONが割り当てられていることを確認します。このプロファイルが割り当てられたユーザーは、この関数のパスワード検証要件を満たすパスワードを指定する必要があります。

Command> CREATE PROFILE myprofile_pw1 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_VERIFY_FUNCTION;

Profile created.

Command> SELECT * FROM dba_profiles WHERE profile = 'MYPROFILE_PW1';
< MYPROFILE_PW1, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_LIFE_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, TT_VERIFY_FUNCTION >
< MYPROFILE_PW1, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, PASSWORD_GRACE_TIME, PASSWORD, DEFAULT >
< MYPROFILE_PW1, TEMP_SPACE_PER_SESSION_MAX, MEMORY, DEFAULT >
8 rows found.

sampleuser_pw1ユーザーを作成して、このユーザーにmyprofile_pw1プロファイルを割り当てます。TT_VERIFY_FUNCTIONの要件を満たしているパスワードを指定します。TT_VERIFY_FUNCTION関数の詳細は、「TT_VERIFY_FUNCTION」を参照してください。

Command> CREATE USER sampleuser_pw1 
           IDENTIFIED BY "A1!XXcg3" PROFILE myprofile_pw1;

User created.

sampleuser_pw2を作成してみます。ユーザーにmyprofile_pw1プロファイルを割り当てます。ユーザー名を逆にしたパスワードを大文字で指定します。CREATE USER文は失敗します。パスワードには、逆にしたユーザー名を含めることはできません。比較では、大文字と小文字が区別されない点に注意してください。

Command> CREATE USER sampleuser_pw2 
           IDENTIFIED BY "2WP_RESUELPMAS" PROFILE myprofile_pw1;
15186: Password complexity check for the specified password failed
15188: TT-20002: Password contains the username reversed
The command failed.

PASSWORD_COMPLEXITY_CHECKERに対するTT_STRONG_VERIFY_FUNCTIONの指定

この例では、myprofile_pw2プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータにTT_STRONG_VERIFY_FUNCTIONを指定します。その後で、sampleuser_pw2ユーザーを作成し、このユーザーにmyprofile_pw2プロファイルを割り当てます。パスワードはTT_STRONG_VERIFY_FUNCTION関数の要件を満たします。TT_STRONG_VERIFY_FUNCTION関数の詳細は、「TT_STRONG_VERIFY_FUNCTION」を参照してください。

Command> CREATE PROFILE myprofile_pw2 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;

Profile created.

sampleuser_pw2ユーザーを作成して、このユーザーにmyprofile_pw2プロファイルを割り当てます。パスワードはTT_STRONG_VERIFY_FUNCTION関数の要件を満たしています。ユーザーが正常に作成されます。

Command> CREATE USER sampleuser_pw2 
           IDENTIFIED BY "!ddFF6C2?" PROFILE myprofile_pw2;

User created.

PASSWORD_COMPLEXITY_CHECKERに対するTT_STIG_VERIFY_FUNCTIONの指定

この例では、myprofile_pw3プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータにTT_STIG_VERIFY_FUNCTIONを指定します。その後で、sampleuser_pw3ユーザーを作成し、このユーザーにmyprofile_pw3プロファイルを割り当てます。パスワードはTT_STIG_VERIFY_FUNCTION関数の要件を満たします。TT_STIG_VERIFY_FUNCTION関数の詳細は、「TT_STIG_VERIFY_FUNCTION」を参照してください。

Command> CREATE PROFILE myprofile_pw3 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STIG_VERIFY_FUNCTION;

Profile created.

sampleuser_pw3ユーザーを作成して、このユーザーにmyprofile_pw3プロファイルを割り当てます。パスワードはTT_STIG_VERIFY_FUNCTION関数の要件を満たします。ユーザーが正常に作成されます。

Command> CREATE USER sampleuser_pw3 
           IDENTIFIED BY "!ddBBKKUYT165>m" PROFILE myprofile_pw3;

User created.

SYSTEMとDEFAULTのPASSWORD_COMPLEXITY_CHECKER値の変更

この例では、dba_profilesシステム・ビューを問い合せて、SYSTEMプロファイルとDEFAULTプロファイルのPASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの値を確認します。デフォルトでは、この値はNULLです。

Command> SELECT * FROM dba_profiles WHERE 
           resource_name='PASSWORD_COMPLEXITY_CHECKER' AND 
           profile IN ('DEFAULT','SYSTEM');
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< SYSTEM, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
2 rows found.

SYSTEMプロファイルのPASSWORD_COMPLEXITY_CHECKERパスワード・パラメータを変更してみます。このパスワード・パラメータは変更できないため、エラーが発生します。

Command> ALTER PROFILE SYSTEM LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;
15176: Profile SYSTEM cannot be altered
The command failed.

DEFAULTプロファイルのPASSWORD_COMPLEXITY_CHECKERパスワード・パラメータを変更してみます。この変更は成功します。DEFAULTプロファイルが割り当てられているユーザー(特定のプロファイルが割り当てられていないユーザー)には、TT_STRONG_VERIFY_FUNCTION関数のパスワード検証要件を満たしているパスワードの指定が必要です。

Command> ALTER PROFILE "DEFAULT" LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;

Profile altered

dba_profilesビューを問い合せて、DEFAULTプロファイルにTT_STRONG_VERIFY_FUNCTIONが割り当てられていることを確認します。

Command> SELECT * FROM dba_profiles WHERE 
           resource_name='PASSWORD_COMPLEXITY_CHECKER' AND 
           profile = 'DEFAULT';
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, TT_STRONG_VERIFY_FUNCTION >
1 row found.

プロファイルの作成と無効なパスワード複雑度チェッカ関数の指定の試行

この例では、PASSWORD_COMPLEXITY_CHECKER句に対して無効なパスワード複雑度チェッカ関数を指定しています。この関数がSYSスキーマに存在していても、指定可能なパスワード複雑度チェッカ関数はサポートされている3つのいずれかのみであるため、エラーが発生します。

Command> CREATE PROFILE myprofile1 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_COMPLEXITY_CHECK;
 8529: Invalid password complexity checker function TT_COMPLEXITY_CHECK
The command failed.

プロファイルの作成とパスワード・パラメータの制限の設定

この例では、profile1プロファイルを作成して、パスワード・パラメータに様々な制限を設定します。その次に、dba_profilesシステム・ビューを問い合せて制限を確認します。

Command> CREATE PROFILE profile1 LIMIT 
           FAILED_LOGIN_ATTEMPTS 5 
           PASSWORD_LIFE_TIME 60 
           PASSWORD_REUSE_TIME 60 
           PASSWORD_REUSE_MAX 5 
           PASSWORD_LOCK_TIME 1 
           PASSWORD_GRACE_TIME 10;
 
Profile created.

dba_profilesシステム・ビューを問い合せて制限を確認します。PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータがCREATE PROFILE文で指定されていないため、PASSWORD_COMPLEXITY_CHECKERの値がDEFAULTになっている点に注目してください(この値は、DEFAULTプロファイルから得られた値です)。

Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE1' AND 
           resource_type='PASSWORD';
< PROFILE1, FAILED_LOGIN_ATTEMPTS, PASSWORD, 5 >
< PROFILE1, PASSWORD_LIFE_TIME, PASSWORD, 60 >
< PROFILE1, PASSWORD_REUSE_TIME, PASSWORD, 60 >
< PROFILE1, PASSWORD_REUSE_MAX, PASSWORD, 5 >
< PROFILE1, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT >
< PROFILE1, PASSWORD_LOCK_TIME, PASSWORD, 1 >
< PROFILE1, PASSWORD_GRACE_TIME, PASSWORD, 10 >
7 rows found.

プロファイルの作成とFAILED_LOGIN_ATTEMPTSの指定

この例では、profile2プロファイルを作成して、FAILED_LOGIN_ATTEMPTS1の値を指定します。その次に、user2ユーザーを作成して、user2profile2プロファイルを割り当てます。user2ユーザーはデータベースに接続しようとしますが、無効なパスワードを指定します。接続に失敗します。その5分後に、user2ユーザーはデータベースに再度接続しようとします。PASSWORD_LOCK_TIMEの値が0.0034722222222222 (5分)のため、接続に成功します(この値は、DEFAULTプロファイルで指定されています)。

Command> CREATE PROFILE profile2 LIMIT FAILED_LOGIN_ATTEMPTS 1;
 
Profile created.
 
Command> CREATE USER user2 IDENTIFIED BY user2 PROFILE profile2;
 
User created.

user2admin権限を付与します。

Command> GRANT ADMIN TO user2;

データベースに接続してみます。接続文字列で無効なパスワードを指定したため、接続に失敗します。

Command> connect adding "UID=user2;PWD=user3" as user2;
 7001: User authentication failed
The command failed.

接続文字列で正しいパスワードを指定して、再度接続してみます。次の理由で接続に失敗します。

  • 前に接続しようとして1回失敗していること

  • 5分間のパスワード・ロック時間が経過する前に、データベースに接続しようとしたこと

none: Command> use database1
database1: Command> connect adding "UID=user2;PWD=user2" as user2;
15179: the account is locked
The command failed.

5分後に、データベースに再度接続してみます。接続が成功します。

none: Command> use database1
database1: Command> connect adding "UID=user2;PWD=user2" as user2;
Connection successful: DSN=database1;UID=user2;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

DEFAULTプロファイルのパスワード・パラメータ値の調査

この例では、dba_profilesシステム・ビューを問い合せて、DEFAULTプロファイルのパスワード・パラメータ値を確認します。

Command> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND 
           resource_type='PASSWORD';
< DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 >
< DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 >
< DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED >
7 rows found.

PASSWORD_LIFE_TIMEとPASSWORD_GRACE_TIMEの指定

この例では、profile4プロファイルを作成して、PASSWORD_LIFE_TIMEパスワード・パラメータに0.0034722222222222 (5分)の値を指定し、PASSWORD_GRACE_TIMEパスワード・パラメータに0.01041667 (15分)の値を指定します。その次に、user4ユーザーを作成して、user4profile4プロファイルを割り当てます。この例では、user4として継続してデータベースへの接続を試行します。

Command> CREATE PROFILE profile4 LIMIT 
           PASSWORD_LIFE_TIME 0.0034722222222222 
           PASSWORD_GRACE_TIME 0.01041667;
 
Profile created.

dba_profilesシステム・ビューを問い合せて、パスワード・パラメータの値を確認します。

Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE4' AND 
           resource_type='PASSWORD';
< PROFILE2, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT >
< PROFILE2, PASSWORD_LIFE_TIME, PASSWORD, .0034 >
< PROFILE2, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT >
< PROFILE2, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT >
< PROFILE2, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT >
< PROFILE2, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT >
< PROFILE2, PASSWORD_GRACE_TIME, PASSWORD, .0104 >
7 rows found.

user4ユーザーを作成して、user4profile4プロファイルを割り当てます。user4CONNECT権限を付与します。

Command> CREATE USER user4 IDENTIFIED BY user4 PROFILE profile4;
 
User created.
 
Command> GRANT CONNECT TO user4;

user4としてデータベースに接続します。接続が成功します。

Command> connect adding "UID=user4;PWD=user4" as user4;
Connection successful: DSN=access1;UID=user4;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

データベースからの切断5分後に、user4としてデータベースに再接続します。接続は成功しますが、警告が発行されます。パスワードの有効期間は5分で、パスワードの猶予期間は15分です。

user4: Command> disconnect user4;
Disconnecting from user4...
none: Command> use database1
database1: Command> connect adding "UID=user4;PWD=user4" as user4;
 
Warning 15182: Password will expire within 0.010417 days
 
Connection successful: DSN=access1;UID=user4;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

データベースからの切断15分後に、user4としてデータベースに再接続します。15分間のパスワード猶予期間が終了しているため、接続に失敗します。

user4: Command> disconnect user4;
Disconnecting from user4...
none: Command> use database1
database1: Command> connect adding "UID=user4;PWD=user4" as user4;
15180: the password has expired
The command failed.

LIMITキーワードのみを指定したプロファイルの作成

この例では、profile5プロファイルを作成して、LIMITキーワードのみを指定します。その次に、dba_profilesシステム・ビューを問い合せて、profile5プロファイルのパスワード・パラメータ制限がすべてDEFAULTの値に設定されていることを確認します。

Command> CREATE PROFILE profile5 LIMIT;
 
Profile created.
Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE5' AND 
           resource_type='PASSWORD
< PROFILE5, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT >
< PROFILE5, PASSWORD_LIFE_TIME, PASSWORD, DEFAULT >
< PROFILE5, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT >
< PROFILE5, PASSWORD_REUSE_MAX, PASSWORD, DEFAULT >
< PROFILE5, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT >
< PROFILE5, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT >
< PROFILE5, PASSWORD_GRACE_TIME, PASSWORD, DEFAULT >
7 rows found.

PASSWORD_REUSE_TIMEに対するUNLIMITEDの指定

この例では、profile6プロファイルを作成して、UNLIMITEDPASSWORD_REUSE_TIMEを指定します。パスワードは再利用できません。

Command> CREATE PROFILE profile6 LIMIT 
           PASSWORD_REUSE_MAX 2 
           PASSWORD_REUSE_TIME UNLIMITED;
 
Profile created.

user6ユーザーを作成して、user6profile6プロファイルを割り当てます。user6のパスワードを2回変更します。user6のパスワードを再利用してみます。これは、PASSWORD_REUSE_TIME値がUNLIMITEDのために失敗します。

Command> CREATE USER user6 IDENTIFIED BY user6 PROFILE profile6;
 
User created.
 
Command> ALTER USER user6 IDENTIFIED BY user6_test1;
 
User altered.
 
Command> ALTER USER user6 IDENTIFIED BY user6_test2;
 
User altered.
 
Command> ALTER USER user6 IDENTIFIED BY user6;
15183: Password cannot be reused
The command failed.

PASSWORD_REUSE_TIMEに対するDEFAULTの指定

この例では、PASSWORD_REUSE_TIMEパスワード・パラメータにDEFAULTPASSWORD_REUSE_MAXパスワード・パラメータに3の値を指定して、profile7プロファイルを作成します。TimesTenにより、PASSWORD_REUSE_TIMEパスワード・パラメータに、DEFAULTプロファイルの値が使用されます。

Command> CREATE PROFILE profile7 LIMIT 
           PASSWORD_REUSE_TIME DEFAULT 
           PASSWORD_REUSE_MAX 3;
 
Profile created.

dba_profilesシステム・ビューを問い合せて、profile7プロファイルのパスワード・パラメータの値を確認します。PASSWORD_REUSE_TIMEに対するDEFAULTの値と、PASSWORD_REUSE_MAXに対する3の値に注目してください(太字で表示)。

Command> SELECT * FROM dba_profiles WHERE profile = 'PROFILE7' AND
           resource_type = 'PASSWORD';
< PROFILE7, FAILED_LOGIN_ATTEMPTS, PASSWORD, DEFAULT >
< PROFILE7, PASSWORD_LIFE_TIME, PASSWORD, DEFAULT >
< PROFILE7, PASSWORD_REUSE_TIME, PASSWORD, DEFAULT >
< PROFILE7, PASSWORD_REUSE_MAX, PASSWORD, 3 >
< PROFILE7, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, DEFAULT >
< PROFILE7, PASSWORD_LOCK_TIME, PASSWORD, DEFAULT >
< PROFILE7, PASSWORD_GRACE_TIME, PASSWORD, DEFAULT >
7 rows found.

dba_profilesシステム・ビューを問い合せて、DEFAULTプロファイルのパスワード・パラメータの値を確認します。PASSWORD_REUSE_TIMEに対するUNLIMITEDの値に注目してください(太字で表示)。

Command> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT' AND
           resource_type = 'PASSWORD';
< DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 >
< DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 >
< DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED >
7 rows found.

user7ユーザーを作成して、user7profile7プロファイルを割り当てます。user7のパスワードを3回変更します。PASSWORD_REUSE_TIMEパラメータのUNLIMITEDの値が原因で、user7のパスワードは再利用できません。

Command> CREATE USER user7 IDENTIFIED BY user7 PROFILE profile7;
 
User created.
 
Command> ALTER USER user7 IDENTIFIED BY user7_test1;
 
User altered.
 
Command> ALTER USER user7 IDENTIFIED BY user7_test2;
 
User altered.
 
Command> ALTER USER user7 IDENTIFIED BY user_test3;
 
User altered.
 
Command> ALTER USER user7 IDENTIFIED BY user7;
15183: Password cannot be reused
The command failed.

PASSWORD_REUSE_TIMEとPASSWORD_REUSE_MAXの指定

この例では、PASSWORD_REUSE_TIMEパスワード・パラメータに0.0020833 (約2分)の値を指定し、PASSWORD_REUSE_MAXパスワード・パラメータに2の値を指定して、profile8プロファイルを作成します。その次に、user8ユーザーを作成して、user8profile8プロファイルを割り当てます。user8パスワードを2分以内に2回変更します。その後、2分以内に、user8の元のパスワード(user8_pwd)を再利用します。ALTER USER操作が失敗します。パスワードを2回変更しても、元のパスワードは0.00208333日(約2分)後にのみ再利用できるようになります。2分後に、user8の元のパスワード(user8_pwd)を再利用します。ALTER USER操作が成功します。ユーザーのパスワードが2回変更されていて、2分以上経過しています。

Command> CREATE PROFILE profile8 LIMIT 
           PASSWORD_REUSE_TIME 0.00208333 
           PASSWORD_REUSE_MAX 2;
 
Profile created.

user8ユーザーを作成して、user8profile8プロファイルを割り当てます。

Command> CREATE USER user8 IDENTIFIED BY user8_pwd PROFILE profile8;
 
User created.
 

すぐにユーザーを変更して、パスワードを2回変更します。

Command> ALTER USER user8 IDENTIFIED BY user8_test1;
 
User altered.
 
Command> ALTER USER user8 IDENTIFIED BY user8_test2;
 
User altered.

2分以内に、user8_pwdの元のパスワード(太字で表示)を再利用してみます。元のパスワードは2分後にのみ再利用できるため、ALTER USER操作は失敗します。

Command> ALTER USER user8 IDENTIFIED BY user8_pwd;
15183: Password cannot be reused
The command failed.

2分後に、user8_pwdの元のパスワード(太字で表示)を再利用してみます。ALTER USER操作が成功します。パスワードが2回変更されていて、2分経過しているため、元のパスワードが再利用できるようになります。

Command> ALTER USER user8 IDENTIFIED BY user8_pwd;
 
User altered.

CREATE REPLICATION

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

CREATE REPLICATION文は、次の処理を実行します。

  • 関連するデータベースにクラシック・レプリケーション・スキームを定義します。

  • 実行するデータベースのレプリケーション・システム表に、指定した構成を組み込みます。

  • 通常は、1つ以上のレプリケーション要素の指定、および0(ゼロ)以上のSTOREの指定が含まれています。

TimesTen SQLによるレプリケーションの構成では、クラシック・レプリケーションをプログラム的な方法で構成できます。この構成は、C、C++またはJavaコードに埋め込むことができます。レプリケーションをローカルで構成したり、クライアント/サーバーを使用してリモート・システムから構成できます。

また、サポートされているSQL文ではカバーされていない処理に対応する場合は、ttRepAdminユーティリティを使用する必要があります。ttRepAdminを使用すると、レプリケーションの状態の変更、データベースの複製、レプリケーション構成の一覧表示およびレプリケーション状態の表示を実行できます。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

定義

レプリケーション要素は、TimesTenがデータベース間で同期を取るエンティティです。レプリケーション要素は、表全体またはデータベースです。データベースには、ほとんどのタイプの表および順序を含めることができます。指定した表および順序のみを含めるか、または指定した表および順序を除くすべての表を含めることができます。一時表またはビュー(マテリアライズドか非マテリアライズドかは関係ありません)を含めることはできません。

レプリケーション・スキームは、レプリケーション要素および要素のコピーを管理するデータベースのセットです。

クラシック・レプリケーションのSQL構成の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』クラシック・レプリケーション・スキームの定義に関する項を参照してください。

SQL構文

CREATE REPLICATION [Owner.]ReplicationSchemeName
{ ELEMENT ElementName
  { DATASTORE | { TABLE [Owner.]TableName [CheckConflicts]} | 
       SEQUENCE [Owner.]SequenceName}
     { MASTER | PROPAGATOR } FullStoreName
     [TRANSMIT { NONDURABLE | DURABLE }]
     { SUBSCRIBER FullStoreName [,...]
        [ReturnServiceAttribute] } [,...] }
     [...]
     [{INCLUDE | EXCLUDE}
          {TABLE [[Owner.]TableName[,...]] |
           SEQUENCE [[Owner.]SequenceName[,...]} [,...]] 
[ STORE FullStoreName [StoreAttribute [... ]]] [...]
[ NetworkOperation[...]]

CheckConflicts構文の詳細は、「CHECK CONFLICTS」を参照してください。

ReturnServiceAttributeの構文を次に示します。

{ RETURN RECEIPT [BY REQUEST] |
  RETURN TWOSAFE [BY REQUEST] |
  NO RETURN }

StoreAttributeの構文を次に示します。

  DISABLE RETURN {SUBSCRIBER | ALL} NumFailures 
  RETURN SERVICES {ON | OFF} WHEN [REPLICATION] STOPPED 
  DURABLE COMMIT {ON | OFF}
  RESUME RETURN Milliseconds 
  LOCAL COMMIT ACTION {NO ACTION | COMMIT} 
  RETURN WAIT TIME Seconds 
  COMPRESS TRAFFIC {ON | OFF}
  PORT PortNumber 
  TIMEOUT Seconds 
  FAILTHRESHOLD Value 
  CONFLICT REPORTING SUSPEND AT Value 
  CONFLICT REPORTING RESUME AT Value 
  TABLE DEFINITION CHECKING {RELAXED|EXACT}

NetworkOperationの構文は、次のとおりです。

ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName
  { { MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost }
      PRIORITY Priority } [...]

パラメータ

パラメータ 説明

[Owner.]ReplicationSchemeName

新しいクラシック・レプリケーション・スキームに割り当てる名前です。クラシック・レプリケーション・スキームは、他のすべてのデータベース・オブジェクトとは別の一意の名前である必要があります。

CheckConflicts

双方向にレプリケートされたデータベースへの同時書込みで、レプリケーションの競合をチェックします。CheckConflictsの詳細は、「CHECK CONFLICTS」を参照してください。

COMPRESS TRAFFIC {ON | OFF}

レプリケートされた通信量を圧縮して、ネットワークの帯域幅の量を削減します。ONは、STOREで定義されたデータベースに対してレプリケートされた通信量をすべて圧縮するように指定します。OFF(デフォルト)は、通信量を圧縮しないように指定します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケートされた通信量の圧縮に関する項を参照してください。

CONFLICT REPORTING SUSPEND AT Value

競合解消のレポートを一時停止します。

Valueは、負ではない整数です。デフォルトは0(一時停止なし)です。競合のレポートは、競合の割合がValueを超えると一時的に停止されます。Valueを0に設定すると、競合のレポートの一時停止が無効になります。

この句は、表レベルのレプリケーションで有効です。

CONFLICT REPORTING RESUME AT Value

競合解消のレポートを再開します。

Valueは、負ではない整数です。競合のレポートは、競合の割合がValueを下回ると再開されます。デフォルトは1です。

この句は、表レベルのレプリケーションで有効です。

DATASTORE

データベース全体を要素として定義します。この種類の要素は、同一または異なるレプリケーション・スキームでTABLE型の要素が構成されていないマスター・データベースに対してのみ定義できます。

{INCLUDE|EXCLUDE}

{[TABLE[Owner.]TableName [,...]]|

SEQUENCE

[[Owner.]SequenceName[,...]]} [,...]

INCLUDEは、指定された表または順序のみをDATASTORE要素に含めます。INCLUDE句は、オブジェクト型(表または順序)ごとに1つ使用します。

EXCLUDEは、指定された表および順序を除外して、すべての表および順序をDATASTORE要素に含めます。EXCLUDE句は、オブジェクト型(表または順序)ごとに1つ使用します。

DISABLE RETURN {SUBSCRIBER|ALL} NumFailures

NumFailuresで指定されているタイムアウト回数を経過した後、RETURNサービスのブロッキングを無効にするようにRETURNサービス障害ポリシーを設定します。SUBSCRIBERを選択すると、レプリケートされた更新を、指定されているタイムアウト期間内に確認できなかったサブスクライバのみにこのポリシーが適用されます。ALLを選択すると、いずれかのサブスクライバから応答がなかった場合、すべてのサブスクライバにこのポリシーが適用されます。この障害ポリシーは、RETURN RECEIPTまたはRETURN TWOSAFEサービスのいずれかで指定できます。

DISABLE RETURNが指定され、RESUME RETURNが指定されていない場合、データベースのレプリケーション・エージェントが再起動されるまでRETURNサービスはオフのままです。

DURABLE COMMIT {ON|OFF}

DurableCommits一般接続属性設定を上書きします。DURABLE COMMIT ONは、レプリケーション・エージェントが実行中か停止しているかに関係なく、永続コミットを有効にします。

ELEMENT ElementName

TimesTenがデータベース間で同期を取るエンティティです。レプリケーション要素として、TimesTenでは、データベース全体(DATASTORE)および表全体(TABLE)がサポートされています。

ElementNameは、レプリケーション要素に指定される名前です。TABLE要素のElementNameの長さは、最大30文字です。DATASTORE要素のElementNameは、他のDATASTORE要素名について、最初の20文字以内が一意である必要があります。ElementNameは、クラシック・レプリケーション・スキーム内で一意である必要があります。また、同じ要素に対して2つの要素記述を定義することはできません。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケーション要素の定義に関する項を参照してください。

FAILTHRESHOLD Value

サブスクライバ・データベースのために累積できるログ・ファイルの数。この値を超えると、サブスクライバはFailedの状態に設定されます。0を指定すると、この上限は設定されません。これがデフォルトです。

『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』トランザクション・ログ障害のしきい値の設定に関する項を参照してください。

FullStoreName

次のいずれかとして指定されたデータベースです。

  • SELF

  • データベース・ファイル名の接頭辞

たとえば、データベースのパスがdirectory/subdirectory/data.ds0の場合、使用するデータベース名はdataになります。

この名前は、DSNの記述のDataStore属性で指定されるデータベース・ファイル名で、オプションでホストIDを次の書式で指定できます。

DataStoreName [ON Host]

Hostは、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』ネットワークの構成に関する項で説明されているように、IPアドレスまたは1つ以上のIPアドレスに割り当てられたリテラル・ホスト名です。ホスト名に特殊文字が含まれている場合は、二重引用符で囲む必要があります。たとえば、"MyHost-500"のようになります。ホスト名は30文字以下で指定します。

LOCAL COMMIT ACTION {NO ACTION | COMMIT}

タイムアウト・イベントのRETURN TWOSAFEトランザクションで実行されるデフォルトのアクションを指定します。

ノート: この属性は、RETURN TWOSAFEまたはRETURN TWOSAFE BY REQUEST属性がSUBSCRIBER句で設定されている場合にのみ有効です。

NO ACTION: タイムアウト時、コミット関数はアプリケーションに戻り、トランザクションをコミット・コールに入ったときと同じ状態のままにしますが、レプリケートされた表をアプリケーションが更新できない場合を除きます。アプリケーションはコミットのみを再発行できます。トランザクションはロールバックできません。これがデフォルトです。

COMMIT: タイムアウト時、コミット関数はCOMMITを実行して、トランザクションをローカルに終了しようとします。同じトランザクション上でこれ以上の処理を行うことはできません。

この設定は、ttRepSyncSetプロシージャのlocalActionパラメータをコールすることで、特定のトランザクションに対して無効にすることができます。

MASTER FullStoreName

アプリケーションで特定の要素が更新されるデータベース。更新はMASTERデータベースによってSUBSCRIBERデータベースに送信されます。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベースである必要があります。

NO RETURN

RETURNサービスを使用しないように指定します。これがデフォルトです。

RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

PORT PortNumber

データベースのレプリケーション・エージェントが接続をリスニングするTCP/IPポート番号です。指定しない場合は、レプリケーション・エージェントによってポート番号が自動的に割り当てられます。

PROPAGATOR FullStoreName

レプリケートされた更新を受け取って他のデータベースに渡すデータベース。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベースである必要があります。

RESUME RETURN Milliseconds

DISABLE RETURNによってRETURNサービスのブロッキングが無効になった場合、この属性によって、RETURNサービスのブロッキングを再度有効にするタイミングに関するポリシーを設定します。RETURNサービスのブロッキングは、障害が発生したサブスクライバが、Millisecondsで指定された時間よりも短い間隔でレプリケートされた更新を確認するとすぐに再度有効になります。

DISABLE RETURNが指定され、RESUME RETURNが指定されていない場合、データベースのレプリケーション・エージェントが再起動されるまでRETURNサービスはオフのままです。

RETURN RECEIPT [BY REQUEST]

RETURN RECEIPTサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションを受信するまでブロックされます。

RETURN RECEIPTにより、すべてのトランザクションにサービスが適用されます。RETURN REQUEST BY REQUESTを指定した場合は、ttRepSyncSetプロシージャを使用して、選択したトランザクションに対してRETURN RECEIPTサービスを有効にできます。RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

RETURN SERVICES {ON|OFF} WHEN [REPLICATION] STOPPED

レプリケーションが無効になっている場合のRETURNサービスのオンまたはオフを設定します。

OFFは、レプリケーション無効時にRETURNサービスを無効する設定であり、RETURN RECEIPTサービスのデフォルトです。ONは、レプリケーション無効時にもRETURNサービスを有効のままにできる設定であり、RETURN TWOSAFEサービスのデフォルトです。

RETURN TWOSAFE [BY REQUEST]

RETURN TWOSAFEサービスを有効にし、これによって、マスター・データベースに対してトランザクションをコミットするアプリケーションは、すべてのサブスクライバがトランザクションをコミットするまでブロックされます。

ノート: このサービスは、要素がDATASTOREと定義される場合の双方向レプリケーション・スキームでのみ使用できます。

RETURN TWOSAFEを指定すると、すべてのトランザクションにサービスが適用されます。RETURN TWOSAFE BY REQUESTを指定した場合は、ttRepSyncSetプロシージャを使用して、選択したトランザクションに対してRETURN RECEIPTサービスを有効にできます。RETURNサービスの使用の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』RETURNサービスの使用に関する項を参照してください。

RETURN WAIT TIME Seconds

RETURNサービスの応答を待機する秒数を指定します。デフォルト値は10秒です。値が0(ゼロ)の場合は、タイムアウトがないことを意味します。returnWaitパラメータを設定してアプリケーションからttRepSyncSetプロシージャをコールすることで、このタイムアウト設定を無効にすることができます。

SEQUENCE [Owner.]SequenceName

[Owner.]SequenceNameによって要素として指定された順序を定義します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケーション要素の定義に関する項を参照してください。

STORE FullStoreName

指定されたデータベースの属性を定義します。属性には、PORTTIMEOUTおよびFAILTHRESHOLDがあります。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベースである必要があります。

SUBSCRIBER FullStoreName

MASTERデータベースから更新を受け取るデータベース。FullStoreNameは、DSNの記述のDataStore属性で指定したデータベースである必要があります。

TABLE [Owner.]TableName

[Owner.]TableNameによって要素として指定された表を定義します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケーション要素の定義に関する項を参照してください。

TIMEOUT Seconds

レプリケーション・エージェントがリモート・レプリケーション・エージェントからの応答を待機する最大時間(秒)。デフォルトは120秒です。

ノート: リモート・レプリケーション・エージェントからの応答の遅延の原因となる大規模なトランザクションの場合、エージェントは、トランザクションのサイズに基づいて、タイムアウトをスケーリングします。TIMEOUTを60秒以下に設定した場合、このスケーリングは無効になります。『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』リモート・レプリケーション・エージェントからの応答タイムアウトの待機設定に関する項も参照してください。

TRANSMIT {DURABLE | NONDURABLE}

コミットされたトランザクション群をサブスクライバに転送する前に、マスターのログをファイル・システムにフラッシュするかどうかを指定します。

TRANSMIT NONDURABLEは、マスターのログ内のレコードがサブスクライバに転送される前にファイル・システムにフラッシュされないように指定します。この設定は、指定された要素がDATASTOREである場合にのみ使用できます。この設定は、RETURN TWOSAFEトランザクションのデフォルト値です。

TRANSMIT DURABLEは、サブスクライバに転送される前にレコードがファイル・システムにフラッシュされるように指定します。この設定は、非同期およびRETURN RECEIPTトランザクションのデフォルト値です。

ノート: TRANSMIT DURABLEは、RETURN TWOSAFEトランザクションに影響を与えません。

ノート: アクティブ・スタンバイ・ペアに対してTRANSMIT DURABLEを設定することはできません。

詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』DATASTORE要素に対する送信永続性の設定に関する項を参照してください。

TABLE DEFINITION CHECKING {EXACT|RELAXED}

サブスクライバで実行される表定義チェックの種類を指定します。

  • EXACT: マスターおよびサブスクライバで表が一致している必要があります。

  • RELAXED: 表には同じキー定義、列の数および列のデータ型が必要です。

デフォルトはRELAXEDです。

ノート: TABLE DEFINITION CHECKING EXACTを使用している場合、データベースを移行するにはttMigrate -exactUpgradeを使用します。TABLE DEFINITION CHECKING RELAXEDを使用している場合、データベースを移行するにはttMigrate -relaxedUpgradeを使用します。

ROUTE MASTER FullStoreName SUBSCRIBER FullStoreName

NetworkOperation句を表します。指定されている場合、各サブスクライバ・ストアへのすべてのアウトバウンド接続にマスター・ストアが使用するネットワーク・インタフェースを制御できます。

複数回指定できます。

FullStoreNameには、ON "host"を指定する必要があります。

MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost

MasterHostおよびSubscriberHostは、マスターおよびサブスクライバ・ストアのネットワーク・インタフェースのIPアドレスです。IPV6のドット表記または正規形式で指定するか、あるいはコロン表記で指定します。

句は複数回指定できます。

PRIORITY Priority

1から99の整数で表される変数。IPアドレスの優先順位を示します。整数値が小さいほど、優先度は高くなります。同じ優先度を持つアドレスが複数指定されている場合は、エラーが返されます。ピア接続の確立に使用する複数のIPアドレスの順序を制御します。

NetworkOperation 句の構文で必須です。MASTERIP MasterHost | SUBSCRIBERIP SubscriberHost句の後ろに記述します。

CHECK CONFLICTS

構文

CHECK CONFLICTSの構文は、次のとおりです。

{NO CHECK |
CHECK CONFLICTS BY ROW TIMESTAMP
      COLUMN ColumnName
      [ UPDATE BY { SYSTEM | USER } ]
      [ ON EXCEPTION { ROLLBACK [ WORK ] | NO ACTION } ]
      [ {REPORT TO 'FileName'
             [ FORMAT { XML | STANDARD } ] | NO REPORT
      } ]
}

ノート:

CHECK CONFLICT句は、TABLE型の要素に対してのみ使用できます。

パラメータ

CREATE REPLICATIONまたはALTER REPLICATION文のCHECK CONFLICTS句には、次のパラメータがあります。

パラメータ 説明

CHECK CONFLICTS BY ROW TIMESTAMP

すべての更新競合と一意性競合の検出を指定します。競合はON EXCEPTIONパラメータで指定された方法で解消されます。

DELETE処理とUPDATE処理の競合についても検出します。

COLUMN ColumnName

レプリケートされた表の列を使用してタイムスタンプを比較します。表はELEMENTの説明でTableNameによって指定されます。

ColumnNameはNULL値可能なBINARY(8)型の列で、行が最後に更新されたタイムスタンプの格納に使用されます。TimesTenでは、格納された値よりも小さいタイムスタンプ値を持つ行の更新要求が拒否されます。指定されたColumnNameは、マスター・データベースとサブスクライバ・データベース両方のレプリケートされた表に存在している必要があります。

NO CHECK

指定された要素に対する競合解消を行わないように指定します。

UPDATE BY {SYSTEM | USER}

タイムスタンプ値をTimesTen(SYSTEM)またはアプリケーション(USER)のどちらで管理するかを指定します。マスター・データベースおよびサブスクライバ・データベースのレプリケートされた表は、同じUPDATE BY指定を使用する必要があります。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』システム・タイムスタンプ列メンテナンスの有効化に関する項ユーザー・タイムスタンプ列メンテナンスの有効化に関する項を参照してください。デフォルト値は、UPDATE BY SYSTEMです。

ON EXCEPTION {ROLLBACK[WORK |NO ACTION}

検出された競合の解消方法を指定します。ROW TIMESTAMP競合の検出には、次の解消オプションがあります。

  • ROLLBACK [WORK]: 競合するアクションを含むトランザクションを強制終了します。

  • NO ACTION: 競合するアクション(UPDATEINSERTまたはDELETE)を実行せずに、トランザクションを完了します。

デフォルトはON EXCEPTION ROLLBACK [WORK]です。

REPORT TO 'FileName'

タイムスタンプ比較に失敗した更新を記録するファイルを指定します。FileNameは、1,000文字以下のSQL文字列です。(SQL文字列リテラルは、空白を含む任意の順序の文字が含まれた一重引用符付き文字列です。)複数の表の失敗した更新を記録するために同じファイルを使用できます。

[FORMAT {XML|STANDARD}]

オプションで、要素の競合レポートの形式を指定します。デフォルトの形式はSTANDARDです。

NO REPORT

失敗したタイムスタンプの比較を記録しないように指定します。

説明

  • 同じホスト上のすべてのデータベース名は、各TimesTenインスタンスの各クラシック・レプリケーション・スキームについて一意である必要があります。

  • レプリケーション要素の更新(通常のアプリケーション・トランザクションによる)は、MASTERデータベースを使用してのみ可能です。PROPAGATORおよびSUBSCRIBERデータベースは読取り専用です。

  • 複数のデータベースで同じ表を更新できるクラシック・レプリケーション・スキームを定義する場合は、行を更新する際に競合を回避する方法の推奨事項について、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』レプリケーションの競合解消に関する項を参照してください。

  • SELFは、関連するデータベースがすべてローカルであるクラシック・レプリケーション・スキーム用です。本番環境(スクリプトで各データベースのホスト名を省略しないで記述すると、関連する各データベースで使用できる)では、分散クラシック・レプリケーション・スキームに対してSELFを使用しないでください。

  • 指定したSTOREの各属性は一度だけ指定するか、または何も指定しません。

  • 単一のクラシック・レプリケーション・スキームのデータベースのPORTを指定すると、すべてのクラシック・レプリケーション・スキームに対して指定されます。その他すべての接続属性は、コマンドで指定したクラシック・レプリケーション・スキームによって異なります。

  • レプリケーション・スキームでは、DataStoreNameは、常にTimesTenデータベースのチェックポイント・ファイル名の接頭辞になります。チェックポイント処理によってファイル・システムに保存される、接尾辞.ds0.ds1のファイルがチェックポイント・ファイルです。

  • デフォルト値NOT INLINE VARCHARが指定されている行がレプリケートされる場合、受信者側のノードのデフォルト値が送信者側のノードのデフォルト値と異なる場合にのみ、受信者はデフォルト値を指すかわりに、各行に対してこの値のコピーを作成します。

  • レプリケートされた表でタイムスタンプ比較を使用するには、NULL値可能なBINARY(8)型の列を指定して、タイムスタンプ値を保持する必要があります。タイムスタンプ列は、表の作成時に定義します。ALTER TABLE文でタイムスタンプ列を追加することはできません。また、タイムスタンプ列を主キーまたは索引に含めることはできません。

  • XMLのレポート形式を指定した場合、2つのXMLドキュメントが生成されます。

    • FileName.xml: このファイルには、レポート用のDTDおよびレポートのルート・ノードが含まれます。このファイルには、ドキュメント定義とINCLUDEディレクティブが含まれます。

    • FileName.include: このファイルはFileName.xmlに含まれており、実際の競合がすべて含まれます。

    • FileName.includeファイルは切捨て可能です。FileName.xmlファイルは切り捨てないでください。

    • 各競合の例を含むXML書式の詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』XMLファイルへの競合のレポートに関する項を参照してください。

  • 要素のレポート形式を指定した後でその要素を削除しても、対応するレポート・ファイルは削除されません。

  • 競合解消のレポートを一時停止する最高水位標のしきい値を指定するには、CONFLICT REPORTING SUSPEND AT句を使用します。

  • 競合解消のレポートを再開する最低水位標のしきい値を指定するには、CONFLICT REPORTING RESUME AT句を使用します。競合の割合が最低水位標のしきい値を下回ると、競合解消のレポートが再開されます。

  • レプリケーション・エージェントによって競合のレポートが一時停止されている状態または一時停止されていない状態は、ローカル・レプリケーション・エージェントとピア・エージェントが停止および再起動された後は維持されません。

  • キャッシュ・グループをレプリケートする場合にCREATE REPLICATION文を使用しないでください。アクティブ・スタンバイ・ペアのみがキャッシュ・グループをレプリケートできます。CREATE ACTIVE STANDBY PAIR文を参照してください。

repl.tabの内容をmasterdsから2つのサブスクライバsubscriber1dsおよびsubscriber2dsにレプリケートします。

CREATE REPLICATION repl.twosubscribers
       ELEMENT e TABLE repl.tab
         MASTER masterds ON "server1"
         SUBSCRIBER subscriber1ds ON "server2",
                    subscriber2ds ON "server3";

masterdsデータベース全体をサブスクライバsubscriber1dsにレプリケートします。FAILTHRESHOLDを指定すると、subscriber1dsが失敗したとみなされる前に、最大10のログ・ファイルをmasterdsに蓄積します。

CREATE REPLICATION repl.wholestore
  ELEMENT e DATASTORE
     MASTER masterds ON "server1"
     SUBSCRIBER subscriber1ds ON "server2"
  STORE masterds FAILTHRESHOLD 10;

westdsおよびeastdsデータベース全体を双方向にレプリケートして、RETURN TWOSAFEサービスを有効にします。

CREATE REPLICATION repl.biwholestore
  ELEMENT e1 DATASTORE
     MASTER westds ON "westcoast"
     SUBSCRIBER eastds ON "eastcoast"
        RETURN TWOSAFE
  ELEMENT e2 DATASTORE
     MASTER eastds ON "eastcoast"
     SUBSCRIBER westds ON "westcoast"
        RETURN TWOSAFE;

subscriber1dsサブスクライバへの選択トランザクション更新に対して、RETURN RECEIPTサービスを有効にします。

CREATE REPLICATION repl.twosubscribers
  ELEMENT e TABLE repl.tab
     MASTER masterds ON "server1"
     SUBSCRIBER subscriber1ds ON "server2"
        RETURN RECEIPT BY REQUEST
     SUBSCRIBER subscriber2ds ON "server3";

customerswest表の内容をwestデータベースから、customerseast表の内容をeastデータベースから、ROUNDUPデータベースにレプリケートします。すべてのトランザクションに対してRETURN RECEIPTサービスを有効にします。

CREATE REPLICATION r
       ELEMENT west TABLE customerswest
         MASTER west ON "serverwest"
         SUBSCRIBER roundup ON "serverroundup"
            RETURN RECEIPT
       ELEMENT east TABLE customerseast
         MASTER east ON "servereast"
         SUBSCRIBER roundup ON "serverroundup"
            RETURN RECEIPT;

repl.tab表の内容をcentraldsデータベースからpropdsデータベースにレプリケートし、これにより、backup1dsおよびbackup2dsデータベースに変更が伝播されます。

CREATE REPLICATION repl.propagator
       ELEMENT a TABLE repl.tab
         MASTER centralds ON "finance"
         SUBSCRIBER proprds ON "nethandler"
       ELEMENT b TABLE repl.tab
         PROPAGATOR proprds ON "nethandler"
         SUBSCRIBER backup1ds ON "backupsystem1"
                    bakcup2ds ON "backupsystem2";

eastdswestdsデータベースの間で、repl.accounts表の内容を双方向でレプリケートします。各データベースは、repl.accounts表に対してマスターおよびサブスクライバの両方になります。

repl.accounts表がeastdswestdsデータベースのいずれかで更新されるため、ここにはタイムスタンプ列(tstamp)が含まれます。CHECK CONFLICTS句により、2つのデータベース間で発生した更新競合を検出するための自動タイムスタンプ比較が開始されます。比較が失敗すると、古いタイムスタンプを持つ更新が含まれるトランザクションの全体がロールバック(破棄)されます。

CREATE REPLICATION repl.r1
ELEMENT elem_accounts_1 TABLE repl.accounts
   CHECK CONFLICTS BY ROW TIMESTAMP
      COLUMN tstamp
      UPDATE BY SYSTEM
      ON EXCEPTION ROLLBACK
   MASTER westds ON "westcoast"
   SUBSCRIBER eastds ON "eastcoast"
ELEMENT elem_accounts_2 TABLE repl.accounts
   CHECK CONFLICTS BY ROW TIMESTAMP
      COLUMN tstamp
      UPDATE BY SYSTEM
      ON EXCEPTION ROLLBACK
   MASTER eastds ON "eastcoast"
   SUBSCRIBER westds ON "westcoast";

RETURN TWOSAFEサービスを使用し、activedsでTCP/IPポート40000、backupdsでTCP/IPポート40001を使用して、repl.accounts表の内容をactivedsデータベースからbackupdsデータベースにレプリケートします。activedsでのトランザクションはできるかぎりコミットする必要があるため、レプリケーションを構成し、LOCAL COMMIT ACTIONを使用してレプリケーション・タイムアウトの後でもトランザクションがコミットされるようにし、レプリケーションの停止時はRETURN TWOSAFEサービスが無効になるようにします。backupdsデータベースへの接続が割り込まれた場合にアプリケーションでの大幅な遅延を回避するために、5個のトランザクションがタイムアウトした後にRETURNサービスが無効になるように構成しますが、さらにbackupdsデータベースのレプリケーション・エージェントが100ミリ秒未満で応答したときはRETURNサービスを再度有効にするように構成します。最後に、データベース間の帯域幅は制限されるため、activedsデータベースからレプリケートされるときにデータが圧縮されるようにレプリケーションを構成します。

CREATE REPLICATION repl.r
ELEMENT elem_accounts_1 TABLE repl.accounts
   MASTER activeds ON "active"
   SUBSCRIBER backupds ON "backup"
      RETURN TWOSAFE
ELEMENT elem_accounts_2 TABLE repl.accounts
   MASTER activeds ON "active"
   SUBSCRIBER backupds ON "backup"
      RETURN TWOSAFE
STORE activeds ON "active"
   PORT 40000
   LOCAL COMMIT ACTION COMMIT
   RETURN SERVICES OFF WHEN REPLICATION STOPPED
   DISABLE RETURN SUBSCRIBER 5
   RESUME RETURN 100
   COMPRESS TRAFFIC ON
STORE backupds ON "backup"
   PORT 40001;

表レベルのレプリケーションで競合のレポートを一時停止する句と競合のレポートを再開する句の例を示します。これらの句は、データベース・レプリケーションではなく、表レベルのレプリケーションに対して使用します。repschemesコマンドを発行して、レプリケーション・スキームが作成されていることを表示します。

Command> CREATE TABLE repl.accounts (tstamp BINARY (8) NOT NULL 
           PRIMARY KEY, tstamp1 BINARY (8));
Command> CREATE REPLICATION repl.r2
           ELEMENT elem_accounts_1 TABLE repl.accounts
           CHECK CONFLICTS BY ROW TIMESTAMP
           COLUMN tstamp1
           UPDATE BY SYSTEM
           ON EXCEPTION ROLLBACK WORK
           MASTER westds ON "west1"
           SUBSCRIBER eastds ON "east1"
  ELEMENT elem_accounts_2 TABLE repl.accounts
  CHECK CONFLICTS BY ROW TIMESTAMP 
  COLUMN tstamp1
  UPDATE BY SYSTEM 
  ON EXCEPTION ROLLBACK WORK 
  MASTER eastds ON "east1"
  SUBSCRIBER westds ON "west1"
  STORE westds
  CONFLICT REPORTING SUSPEND AT 20
  CONFLICT REPORTING RESUME AT 10;
Command> REPSCHEMES;

Replication Scheme REPL.R2:

  Element: ELEM_ACCOUNTS_1
  Type: Table REPL.ACCOUNTS
  Conflict Check Column: TSTAMP1
  Conflict Exception Action: Rollback Work
  Conflict Timestamp Update: System
  Conflict Report File: (none)
  Master Store: WESTDS on WEST1 Transmit Durable
  Subscriber Store: EASTDS on EAST1

  Element: ELEM_ACCOUNTS_2
  Type: Table REPL.ACCOUNTS
  Conflict Check Column: TSTAMP1
  Conflict Exception Action: Rollback Work
  Conflict Timestamp Update: System
  Conflict Report File: (none)
  Master Store: EASTDS on EAST1 Transmit Durable
  Subscriber Store: WESTDS on WEST1

  Store: EASTDS on EAST1
    Port: (auto)
    Log Fail Threshold: (none)
    Retry Timeout: 120 seconds
    Compress Traffic: Disabled

  Store: WESTDS on WEST1
    Port: (auto)
    Log Fail Threshold: (none)
    Retry Timeout: 120 seconds
    Compress Traffic: Disabled
    Conflict Reporting Suspend: 20
    Conflict Reporting Resume: 10

1 replication scheme found.

2つのMASTERIP句とSUBSCRIBERIP句を使用したNetworkOperation句の例を示します。

CREATE REPLICATION r ELEMENT e DATASTORE
MASTER rep1 SUBSCRIBER rep2 RETURN RECEIPT
MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2"
    PRIORITY 1
MASTERIP "3.3.3.3" PRIORITY 2 SUBSCRIBERIP "4.4.4.4"
    PRIORITY 2;

NetworkOperation句の例。送信側にはデフォルトのインタフェースを使用しますが、受信側には特定のネットワークを使用します。

CREATE REPLICATION r
ELEMENT e DATASTORE
MASTER rep1 SUBSCRIBER rep2
ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2"
SUBSCRIBERIP "rep2nic2" PRIORITY 1;

複数のサブスクライバを使用するNetworkOperation句の使用例を示します。

CREATE REPLICATION r ELEMENT e DATASTORE
MASTER rep1 SUBSCRIBER rep2,rep3
ROUTE MASTER rep1 ON "machine1" SUBSCRIBER rep2 ON "machine2"
MASTERIP "1.1.1.1" PRIORITY 1 SUBSCRIBERIP "2.2.2.2"
    PRIORITY 1
ROUTE MASTER Rep1 ON "machine1" SUBSCRIBER Rep3 ON "machine2"
MASTERIP "3.3.3.3" PRIORITY 2 SUBSCRIBERIP "4.4.4.4";

CREATE SEQUENCE

CREATE SEQUENCE文は、この後、複数のユーザーが一意の整数を生成するために使用できる新しい順序番号ジェネレータを作成します。CREATE SEQUENCE文を使用して、順序の初期値を定義し、増分値、最大値または最小値を定義し、最小または最大に達した後も順序番号を生成し続けるかどうかを決定します。

必要な権限

CREATE SEQUENCE(所有者の場合)またはCREATE ANY SEQUENCE(非所有者の場合)。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。BATCH句は、TimesTen Scaleoutのみでサポートされています。

SQL構文

CREATE SEQUENCE [Owner.]SequenceName
       [INCREMENT BY IncrementValue]
       [MINVALUE MinimumValue]
       [MAXVALUE MaximumValue]
       [CYCLE]
       [CACHE CacheValue]
       [START WITH StartValue]
       [BATCH BatchValue]

パラメータ

パラメータ 説明

SEQUENCE [Owner.]SequenceName

順序番号ジェネレータの名前です。

INCREMENT BY IncrementValue

連続する数値の増分値です。この値は正または負の整数値です。0は指定できません。値が正の場合は昇順になります。負の場合は降順になります。デフォルト値は1です。降順では、範囲はMAXVALUEからMINVALUEへ変化し、昇順ではその逆になります。

MINVALUE MinimumValue

順序の最小値を指定します。デフォルトの最小値は1です。

MAXVALUE MaximumValue

昇順の場合は最大値、降順の場合は開始値です。デフォルトの最大値は(263) -1であり、これはBIGINTの最大です。

CYCLE

順序番号ジェネレータが最大値または最小値に達した後、数値の生成を続行するかどうかを指定します。デフォルトでは、順序はサイクルしません。昇順で数値が最大値に達すると、順序は始めに戻り、最小値から値を生成し続けます。降順で最小値に達すると、順序値は最大値に戻ります。CYCLEが指定されていない場合、最大/最小値に達すると順序番号ジェネレータは値の生成を停止し、エラーが返されます。

CACHE CacheValue

CACHEは毎回キャッシュを行うタイミングとなる数値の範囲を示します。再起動すると、キャッシュされた未使用の値は失われます。CacheValueに1を指定した場合、順序を使用するたびにデータベースに対して更新が発生します。キャッシュ値が大きいほど、データベースへの変更およびオーバーヘッドは少なくなります。デフォルトは20です。

START WITH StartValue

生成する最初の順序番号を指定します。この句を使用して、その最小値よりも大きい値から昇順順序を開始、あるいはその最大値よりも小さい値から降順順序を開始します。StartValueMinimumValue以上になる必要があります。また、StartValueMaximumValue以下になる必要があります。

BATCH BatchValue

TimesTen Scaleoutのみで有効です。グリッドの各要素に格納される一意の順序値の範囲を構成します。デフォルト値は1000万です。

説明

  • CREATE SEQUENCE文のすべてのパラメータは整数値である必要があります。

  • パラメータに値を指定しない場合、TimesTenでは、1から開始し、1ずつ増加し、デフォルトの最大値を持ちサイクルしない昇順がデフォルトで作成されます。

  • ビューまたはマテリアライズド・ビューと同じ名前の順序は作成しないでください。

  • CYCLE属性による順序はレプリケートできません(TimesTen Classic)。

  • アクティブ・スタンバイ・ペアのレプリケートされた環境があるTimesTen Classicで、DDL_REPLICATION_LEVELが3以上の場合にアクティブ・データベースでCREATE SEQUENCEを実行すると、順序はレプリケーション・スキームのすべてのデータベースにレプリケートされます。順序をレプリケーション・スキームに含めるには、DDL_REPLICATION_ACTIONINCLUDEに設定します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

TimesTen Scaleoutでの使用

  • CREATE SEQUENCE文では、グローバル・オブジェクトが作成されます。順序を作成した後、順序値がデータベースのいずれかの要素から取得されます。

  • 順序値は一意ですが、この値は要素をまたいで単調な順番では返されない可能性があります。1つの要素内では、順序値の順番は単調です。ただし、時間の経過に伴い、要素をまたいでは順序値は単調に返されません。ただし、1つの要素内ではプロパティが単調になることが保証されます。

  • バッチ値は、要素に格納された一意の順序値の範囲です。各要素に独自のバッチがあります。ローカル・バッチが消費されると、要素は新しいバッチを取得します。順序を所有し、バッチ順序ブロックを他の要素に割り当てる1つの要素があります。

  • BATCH句の場合:

    • この句を使用して、グリッドの各要素に格納される順序値の範囲を指定します。

    • デフォルトは1000万です。

    • BatchValueCacheValue以上になる必要があります。

    • BatchValueの最大値は、プラットフォームの符号付き整数の最大値に依存します。

  • レプリカ・セット内の各要素には独自のバッチがあります。

  • 要素のバッチ順序値はリカバリ可能です。キャッシュ値はリカバリできません。

詳細と例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』順序の使用方法に関する項を参照してください。

TimesTen ScaleoutでのCURRVALおよびNEXTVALの使用方法

SQL文でSEQUENCE値を参照するには、CURRVALNEXTVALを使用します。

  • CURRVALは、現在のセッションでNEXTVALがコールされていればその最新の値を返し、コールされていなければエラーを返します。

  • NEXTVALは、指定された増分で順序の現在値を増加させ、アクセスされた行ごとに値を返します。

複数のNEXTVAL参照を持つ1つのSQL文を実行する場合、TimesTenでは順序を一度だけ増加させ、すべてのNEXTVALに対して同じ値が返されます。SQL文にNEXTVALCURRVALの両方が含まれている場合は、NEXTVALが最初に実行されます。CURRVALNEXTVALは、そのSQL文では同じ値を持ちます。

NEXTVALおよびCURRVALは、次の場合に使用できます。

グリッドでのCURRVALおよびNEXTVALの使用方法の詳細および例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』順序の使用方法に関する項を参照してください。

TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法

SQL文でSEQUENCE値を参照するには、CURRVALNEXTVALを使用します。

  • CURRVALは、現在のセッションでNEXTVALがコールされていればその最新の値を返し、コールされていなければエラーを返します。

  • NEXTVALは、指定された増分で順序の現在値を増加させ、アクセスされた行ごとに値を返します。

順序の現在値は、接続ごとに異なります。同じデータベースに2つの同時接続がある場合、各接続は同じ順序について、最後のNEXTVAL参照により設定された独自のCURRVALを取得します。最大値に達した場合、CREATE SEQUENCECYCLEオプションの値によって、SEQUENCEはサイクルする(開始値に戻る)か、エラー文を生成します。リカバリでは、順序はロールバックされません。順序の値の範囲に幅を持たせることができますが、その場合でも各順序値は一意です。

複数のNEXTVAL参照を持つ1つのSQL文を実行する場合、TimesTenでは順序を一度だけ増加させ、すべてのNEXTVALに対して同じ値が返されます。SQL文にNEXTVALCURRVALの両方が含まれている場合は、NEXTVALが最初に実行されます。CURRVALNEXTVALは、そのSQL文では同じ値を持ちます。

ノート:

NEXTVALは、アクティブ・スタンバイ・ペアのスタンバイ・ノードへの問合せでは使用できません。

NEXTVALおよびCURRVALは、次の場合に使用できます。

例: TimesTen Scaleout

詳細な例は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』順序の使用方法に関する項を参照してください。

構文の例:

Command> CREATE SEQUENCE mysequence BATCH 100;
Command> describe mysequence;
 
Sequence SAMPLEUSER.MYSEQUENCE:
  Minimum Value: 1
  Maximum Value: 9223372036854775807
  Current Value: 1
  Increment:     1
  Cache:         20
  Cycle:         Off
  Batch:         100
 
1 sequence found.

例: TimesTen Classic

順序を作成します。

CREATE SEQUENCE mysequence INCREMENT BY 1 MINVALUE 2 
       MAXVALUE 1000;

この例では、tab1は表内に1行のデータを持ち、CYCLEが使用されているとします。

CREATE SEQUENCE s1 MINVALUE 2 MAXVALUE 4 CYCLE;
SELECT s1.NEXTVAL FROM tab1;
/* Returns the value of 2; */
SELECT s1.NEXTVAL FROM tab1;
/* Returns the value of 3; */
SELECT s1.NEXTVAL FROM tab1;
/* Returns the value of 4; */

最大値に達した後、最小値から昇順でサイクルを開始します。

SELECT s1.NEXTVAL FROM tab1;
/* Returns the value of 2; */

順序を作成して順序番号を生成するには、次の文を使用します。

CREATE SEQUENCE seq INCREMENT BY 1;
INSERT INTO student VALUES (seq.NEXTVAL, 'Sally');

UPDATE SET句で順序を使用するには、次の文を使用します。

UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';

問合せで順序を使用するには、次の文を使用します。

SELECT seq.CURRVAL FROM student;

CREATE SYNONYM

CREATE SYNONYM文は、データベース・オブジェクトのパブリック・シノニムまたはプライベート・シノニムを作成します。シノニムは、データベース・オブジェクトの別名です。オブジェクトは、表、ビュー、シノニム、順序、PL/SQLストアド・プロシージャ、PL/SQLファンクション、PL/SQLパッケージ、マテリアライズド・ビューまたはキャッシュ・グループです。

プライベート・シノニムは、特定のユーザーが所有し、そのユーザーのスキーマ内に存在します。プライベート・シノニムに所有者以外のユーザーがアクセスできるのは、基礎となるオブジェクトに対する適切な権限がユーザーにあり、シノニム名とともにスキーマを指定する場合のみです。

パブリック・シノニムは、基礎となるオブジェクトに対する適切な権限がユーザーにあるかぎり、すべてのユーザーがアクセスできます。

CREATE SYNONYMはDDL文です。

シノニムは、次のSQL文で使用できます。

  • DML文: SELECTDELETEINSERTUPDATEMERGE

  • 一部のDDL文: GRANTREVOKECREATE TABLE ... AS SELECTCREATE VIEW ... AS SELECTCREATE INDEXDROP INDEX

  • 一部のキャッシュ・グループ文: LOAD CACHE GROUPUNLOAD CACHE GROUPREFRESH CACHE GROUPFLUSH CACHE GROUP

必要な権限

プライベート・シノニムを作成するには、CREATE SYNONYM(所有者の場合)またはCREATE ANY SYNONYM(非所有者の場合)。

パブリック・シノニムを作成するには、CREATE PUBLIC SYNONYM

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE [OR REPLACE] [PUBLIC] SYNONYM [Owner1.]synonym FOR [Owner2.]object

パラメータ

パラメータ 説明

[OR REPLACE]

シノニムがすでに存在する場合に再作成するには、OR REPLACEを指定します。この句を使用すると、既存のシノニムの定義をはじめに削除しなくても、その定義を変更できます。

[PUBLIC]

PUBLICを指定すると、パブリック・シノニムを作成できます。パブリック・シノニムは、すべてのユーザーがアクセスできますが、シノニムを使用するには、基礎となるオブジェクトに対する適切な権限が各ユーザーに必要です。

オブジェクトの先頭にスキーマ名が指定されていない場合のみ、オブジェクトへの参照を変換するときに、TimesTenでパブリック・シノニムが使用されます。

[Owner1.]synonym

シノニムの所有者を指定します。PUBLICを指定した場合、所有者は指定できません。PUBLICOwner1の両方を省略した場合、TimesTenによって、自分のスキーマ内にシノニムが作成されます。

シノニムの名前を30バイト以内で指定します。

[Owner2.]object

オブジェクトが配置される所有者を指定します。シノニムを作成する対象のオブジェクト名を指定します。objectOwner2で修飾しなかった場合、そのオブジェクトは自分のスキーマ内にあります。Owner2およびobjectは、シノニムの作成時に存在している必要はありません。

説明

  • スキーマ・オブジェクトは、そのシノニムの作成時に存在している必要はありません。

  • TimesTen組込みプロシージャと同じ名前のパブリック・シノニムは作成しないでください。

  • シノニムを使用するには、シノニムを使用する前に、シノニムによって別名が付けられるオブジェクトのユーザーに適切な権限が付与されている必要があります。

  • プライベート・シノニムの名前は、プライベート・シノニムと同じスキーマにある表、ビュー、順序、PL/SQLパッケージ、ファンクション、プロシージャおよびキャッシュ・グループと同じにすることはできません。

  • パブリック・シノニムの名前は、プライベート・シノニムやオブジェクト名と同じにすることができます。

  • 問合せがOracle Databaseで実行される必要があるようにPassThrough属性が設定されている場合は、その問合せは変更されずにOracle Databaseに送信されます。問合せがキャッシュ・グループの表に対してシノニムを使用する場合、問合せが成功するためには、同じ名前のシノニムが対応するOracle Database表に定義されている必要があります。

  • オブジェクト名が、シノニムを使用できるDML文およびDDL文で使用される場合、オブジェクト名は次のように解決されます。

    1. 現在のスキーマ内で一致を検索します。一致が見つからない場合は、次に進みます。

    2. パブリック・シノニム名との一致を検索します。一致が見つからない場合は、次に進みます。

    3. SYSスキーマ内で一致を検索します。一致が見つからない場合は、次に進みます。

    4. オブジェクトは存在しません。

    TimesTenでは、一部のオブジェクトのパブリック・シノニムがSYSスキーマ内に作成されます。パブリック・シノニムの名前はオブジェクト名と同じです。そのため、オブジェクト名解決のステップ2と3を入れ替えても、検索結果は変わりません。

  • アクティブ・スタンバイ・ペアのレプリケートされた環境で、DDL_REPLICATION_LEVELが2以上の場合にアクティブ・データベースでCREATE SYNONYMを実行すると、シノニムはレプリケーション・スキームのすべてのデータベースにレプリケートされます。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

ユーザーttuserとして、jobs表のシノニムを作成します。シノニムを使用して情報を取得できることを確認します。SYS.USER_SYNONYMSシステム・ビューの内容を表示します。

Command> CREATE SYNONYM synjobs FOR jobs;
Synonym created.

Command> SELECT FIRST 2 * FROM jobs;
< AC_ACCOUNT, Public Accountant, 4200, 9000 >
< AC_MGR, Accounting Manager, 8200, 16000 >
2 rows found.
Command> SELECT FIRST 2 * FROM synjobs;
< AC_ACCOUNT, Public Accountant, 4200, 9000 >
< AC_MGR, Accounting Manager, 8200, 16000 >
2 rows found.

Command> SELECT * FROM sys.user_synonyms;
< SYNJOBS, TTUSER, JOBS, <NULL> >
1 row found.

employees表のパブリック・シノニムを作成します。

Command> CREATE PUBLIC SYNONYM pubemp FOR employees;
Synonym created.

pubempがパブリック・シノニムとしてSYS.ALL_SYNONYMSシステム・ビューに表示されることを確認します。

Command> SELECT * FROM sys.all_synonyms;
< PUBLIC, TABLES, SYS, TABLES, <NULL> >
...
< TTUSER, SYNJOBS, TTUSER, JOBS, <NULL> >
< PUBLIC, PUBEMP, TTUSER, EMPLOYEES, <NULL> >
57 rows found.

terryスキーマのtab表のシノニムを作成します。シノニムを記述します。

Command> CREATE SYNONYM syntab FOR terry.tab;
Synonym created.
Command> DESCRIBE syntab;
 
Synonym TTUSER.SYNTAB:
  For Table TERRY.TAB
  Columns:
    COL1                            VARCHAR2 (10) INLINE
    COL2                            VARCHAR2 (10) INLINE

1 Synonyms found.

OR REPLACE句を使用して、employees表の別名となるように、synjobsシノニムを再定義します。synjobsと記述します。

Command> CREATE OR REPLACE synjobs FOR employees;
Synonym created.
 
Command> DESCRIBE synjobs;
 
Synonym TTUSER.SYNJOBS:
  For Table TTUSER.EMPLOYEES
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE UNIQUE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
 
1 Synonyms found.

関連項目

DROP SYNONYM

CREATE TABLE

CREATE TABLE文は、表を定義します。

CREATE TABLE文は、TimesTen ScaleoutおよびTimesTen Classicでサポートされています。ただし、構文とセマンティクスでは違いがあります。わかりやすくするために、サポートされている構文、パラメータ、説明(セマンティクス)およびTimesTen ScaleoutとTimesTen Classicの例は、TimesTen Scaleoutでの使用方法とTimesTen Classicでの使用方法に分けられています。使用方法に繰返しがありますが、構文からパラメータへ進み、セマンティクスから各使用方法の例に進むことができるように、このような方法で示されています。

必要な権限セクションを確認してから、次を確認してください。

必要な権限

CREATE TABLE(所有者の場合)またはCREATE ANY TABLE(非所有者の場合)。

作成された表の所有者には、REFERENCE句によって参照される表に対するREFERENCES権限が必要です。

TimesTen Classicの場合:

  • DDL_REPLICATION_LEVEL=2以上およびDDL_REPLICATION_ACTION=INCLUDEのときに、アクティブ・スタンバイ・ペア間で新しい表をレプリケートする場合は、ADMIN権限が必要です。

  • これらの属性によって、CREATE TABLEでは暗黙的にALTER ACTIVE STANDBY PAIR... INCLUDE TABLE文が実行されます。詳細は、「ALTER SESSION」を参照してください。

この項を確認した後、次を参照してください。

CREATE TABLE: TimesTen Scaleoutでの使用方法

この文は、TimesTen Scaleoutでサポートされています。列ベースの圧縮およびエージングはサポートされていません。グローバル一時表では、索引使用句と分散句はサポートされていません。

次を参照してください。

CREATE TABLEのSQL構文: TimesTen Scaleout

永続表の構文は、次のとおりです。

CREATE TABLE [Owner.]TableName
(
    ColumnDefinition [,...]
     [PRIMARY KEY (ColumnName [,...]) [UsingIndexClause1]]|
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
            [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
    
)
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[DistributionClause]
[AS SelectQuery]

次に、UsingIndexClause1の構文を示します。ノート: CreateIndexStmtは、TimesTenのCREATE INDEX文です。詳細は、「CREATE INDEX」を参照してください。一意索引は主キーの要件であるため、その索引を作成する必要があります。

UsingIndexClause1::= USING INDEX {GLOBAL | LOCAL}| USING INDEX (CreateIndexStmt)
DistributionClauseの構文は、次のとおりです。
DistributionClause::= DISTRIBUTE BY HASH [(ColumnName [,...])] | 
DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)] | DUPLICATE

ノート:

PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。UsingIndexClause1句を指定する場合は、PRIMARY KEYを指定する必要があり、PRIMARY KEYColumnDefinition句の後に指定する必要があります。UsingIndexClause1句は、ColumnDefinition句の一部としては指定できません。

グローバル一時表の構文:

UsingIndexClause1DistributionClauseは、グローバル一時表ではサポートされていません。構文は次のとおりです。

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName
(
    {{ColumnDefinition} [,...]
     [PRIMARY KEY (ColumnName [,...])] |
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
      }
)
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[ON COMMIT { DELETE | PRESERVE } ROWS ]

CREATE TABLEのパラメータ: TimesTen Scaleout

パラメータ 説明

CREATE TABLE [Owner.]TableName

CREATE TABLEは、表の作成を指示します。表の名前を指定する必要があります。表の所有者の指定はオプションです。

(ColumnDefinition)

ColumnDefinitionは、列名やデータ型などを指示します。ColumnDefinitionの説明は、「列定義: TimesTen Scaleout」を参照してください。

AS SelectQuery句を指定する場合、ColumnDefinitionはオプションです。

PRIMARY KEY (ColumnName [,...])

ColumnDefinitionの後にPRIMARY KEYキーワードを配置することで、列の定義後にPRIMARY KEYを指定するように指示します。これにより、主キーには複数の列を指定できます。

[UsingIndexClause1] UsingIndexClause1はオプションです。説明は、この表の次の2行に示します。CREATE TABLEの定義には、2つのUSING INDEX句を指定できません。この句を使用すると、PRIMARY KEYに対するグローバル索引またはローカル索引を定義できます。
USING INDEX {GLOBAL|LOCAL} [UsingIndexClause1]句の一部。指定することで、主キーにグローバル索引またはローカル索引を作成するかどうかを示します。
USING INDEX (CreateIndexStmt) [UsingIndexClause1]句の一部。このUSING INDEX句が指定されている場合、(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キーの要件に応じて、一意索引を作成する必要があります。

CONSTRAINT ForeignKeyName

オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。

FOREIGN KEY

新しい表とRefTableNameによって識別される参照先の表の間で外部キー制約を指定します。外部キー制約で指定される列には、2つのリストがあります。

最初のリストの列は、新しい表の列であり、参照元列と呼ばれます。2番目のリストの列は、参照先の表の列であり、参照先列と呼ばれます。これら2つのリストは、長さ、精度、スケールを含めてデータ型が一致している必要があります。参照先の表には、参照先列に対する主キーまたは一意索引がすでに存在している必要があります。

参照先列の列名リストはオプションです。省略した場合、RefTableNameの1次索引が使用されます。

外部キーを宣言することにより、参照元列に範囲索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。

外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。INSERTDELETEまたはUPDATE文が制約に違反した場合、TimesTenエラー3001が返されます。

TimesTenでは、SQL-92 "NO ACTION"の更新および削除規則とON DELETE CASCADEがサポートされています。外部キー制約は遅延可能ではありません。

外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表がCOMMIT DELETEを使用して定義されている場合は、子表にもCOMMIT DELETE属性が必要です。

外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。

AS SelectQuery句を指定する場合は、作成する表に対して外部キーを定義できません。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

UNIQUE HASH ON

表のハッシュ索引。UNIQUE HASH ONを指定するには、主キーの定義が必要です。

HashColumnName

表に定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

AS SelectQuery句を指定する場合は、作成する表にHashColumnNameを定義する必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

[ON COMMIT {DELETE|PRESERVE} ROWS]

グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。

AS SelectQuery

指定すると、SelectQueryの結果セットの内容から新しい表が作成されます。SelectQueryで返される行が表に挿入されます。

データ型およびデータ型の長さは、SelectQueryから導出されます。

SelectQueryは、副問合せを含めることも含めないこともできる有効なSELECT文です。

SELECT動詞の後に文レベルのオプティマイザ・ヒントを指定できます。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

DistributionClause

TimesTen Scaleoutのみでサポートされています。3つのオプションがあります。

  • DISTRIBUTE BY HASH [(ColumnName [,...])]

  • DUPLICATE

  • DISTRIBUTE BY REFERENCE [(ForeignKeyConstraint)]

DISTRIBUTE BY HASH句は、主キーのハッシュまたはユーザー定義分散列のハッシュに基づいてデータを分散するハッシュ分散スキームを指定します。行はレプリカ・セット間で分散され、各行は1つのレプリカ・セットに存在します。分散キーはオプションです。指定する場合は、1つ以上の列で構成され、それらの列はデータを分散するために使用されます。

DUPLICATE句は、表のデータの同一コピーをデータベースのすべての要素に分散する複製分散スキームを指定します。表のすべての行が各要素に存在します。

DISTRIBUTE BY REFERENCE句は、外部キー制約によって定義された親行の位置に基づいて子表のデータを分散する参照分散スキームを指定します。子表の行は、親表と同じレプリカ・セットに存在します。DISTRIBUTE BY REFERENCE句では外部キー制約はオプションです。ただし、複数の外部キー制約を定義した場合、DISTRIBUTE BY REFERENCE句でいずれかの外部キー制約を指定する必要があります。

句を指定しない場合、デフォルトはDISTRIBUTE BY HASHです。

AS SelectQuery句の前にDistributionClauseを指定する必要があります。

分散キー列は更新できません。

GLOBAL TEMPORARY

作成する表をグローバル一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。

グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。

グローバル一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。

一時表の操作でログ・レコードが生成されます。生成されるログの量は、永続表用よりも少なくなります。

DistributionClauseはサポートされていません。

TRUNCATE TABLEは、グローバル一時表でサポートされていません。

ローカルの一時表は、サポートされていません。

グローバル一時表にアクセスするには、オブジェクト権限は必要ありません。

グローバル一時表にはAS SelectQuery句を指定しないでください。

ColumnName

表の列の名前。

主キー定義で名前が使用されている場合、名前は作成する表の主キーを形成します。主キーには最大16列を指定できます。外部キーの場合、ColumnNameはオプションです。外部キーに対して指定しない場合、参照されるのは親表の主キーです。

AS SelectQuery句を指定する場合、ColumnNameを指定する必要はありません。AS SelectQuery句にデータ型を指定しないでください。

列定義: TimesTen Scaleout

SQL構文

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

構文は次のとおりです。

ColumnName ColumnDataType
 [DEFAULT DefaultVal]
 [[NOT] INLINE]
 [PRIMARY KEY | UNIQUE | 
 NULL [UNIQUE] | 
 NOT NULL [ENABLE] [PRIMARY KEY | UNIQUE] 
]

列定義のパラメータ

列定義には、次のパラメータがあります。

パラメータ 説明

ColumnName

新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。1つの表の列数は最大で1000です。

AS SelectQuery句を指定する場合、ColumnNameはオプションです。列名の数は、SelectQueryの列の数と一致している必要があります。

ColumnDataType

列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

AS SelectQuery句を指定する場合、ColumnDataTypeは指定しないでください。

DEFAULT DefaultVal

INSERT文で列の値が指定されていない場合は、列にデフォルト値DefaultValを挿入します。指定されたデフォルト値は、列のデータ型と互換性がある型である必要があります。デフォルト値には、関連付けられた列で許可されている任意のデータ型を指定できます。ROWIDデータ型について、または読取り専用キャッシュ・グループの列についてデフォルト値を割り当てることはできません。また、DEFAULT句でファンクションを使用することはできません。

DefaultValでは、次のデータ型がサポートされます。

デフォルト値がユーザーのいずれかである場合、列のデータ型はCHARまたはVARCHAR2のいずれかであり、列の幅は30文字以上である必要があります。

AS SelectQuery句を指定する場合は、オプションで、作成する表にDEFAULT句を指定することもできます。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にINLINE | NOT INLINE句を指定することもできます。

NULL

列にNULL値を含めることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNULLを指定することもできます。

NULLを指定した場合は、ENABLEを指定できません。

NOT NULL [ENABLE]

列にNULL値を含めることはできません。NOT NULLを指定した場合、列にNULL値を保存しようとする文はすべて拒否されます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNOT NULL[ENABLE]を指定することもできます。

NOT NULLを指定する場合は、オプションでENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

UNIQUE

列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意の範囲索引が作成されます。つまり、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があります。PRIMARY KEYとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にUNIQUEを指定することもできます。

PRIMARY KEY

列に設定される一意のNOT NULL制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。UNIQUEとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にPRIMARY KEYを指定することもできます。

CREATE TABLEのUSING INDEX句の説明: TimesTen Scaleout

CREATE TABLEの定義には、PRIMARY KEY句の後に追加の句を指定するオプションがあります。この句を使用すると、主キー制約に対するグローバル索引またはローカル索引を指定できます。
  • USING INDEX {GLOBAL | LOCAL}句は、主キー制約に対するグローバル索引またはローカル索引を指定できるようにする1つのオプションです。GLOBALまたはLOCALのキーワードを指定する必要があります。ハッシュ索引を定義する場合は、USING INDEX {GLOBAL | LOCAL}句の後にオプションでUSE HASH INDEX句を指定できます。

  • USING INDEX (CreateIndexStmt)句は、グローバル索引またはローカル索引を指定する別のオプションです。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。主キー制約の要件に応じて、一意索引を作成する必要があります。CREATE INDEX文を使用してハッシュ索引を作成する場合は、CREATE INDEX文の詳細について、「CREATE INDEX」を参照してください。

ノート:

CREATE TABLEの定義では、USING INDEX {GLOBAL | LOCAL}USING INDEX (CreateIndexStmt)の両方を使用することはできません。どちらかの句を指定するか、どちらの句も指定しないでください。
ハッシュ索引の作成時には、ハッシュ索引のサイズを設定する必要があります。TimesTenには、この目的のためのPAGES=句があります。次のオプションを検討してください。
  • USING INDEX...CreateIndexStmt句を指定してHASH索引を作成する場合は、PAGES=句を指定するオプションがあります。PAGES=句を指定しない場合、TimesTenは、デフォルトとしてPAGES=CURRENTを使用してハッシュ索引のサイズを設定します。(CREATE INDEX文の詳細は、「CREATE INDEX」を参照してください)。

  • UNIQUE HASH ON句(CREATE TABLE定義の一部)を指定する場合は、ハッシュ索引のサイズを設定するためのPAGES=句を指定する必要があります。

  • USING INDEX...CreateIndexStmtUNIQUE HASH ON句の両方(CREATE TABLE定義の一部)を指定すると、TimesTenは、UNIQUE HASH ON...PAGES=句で指定された値を使用してハッシュ索引のサイズを設定します。また、TimesTenは警告も発行します。この警告では、ハッシュ索引に対して異なるページ数の指定があることと、UNIQUE HASH ON...PAGES=句で指定された値を使用していることが示されます。

この例では、PAGES=句はCreateIndexStmt句(PAGES=200)とUNIQUE HASH ON句(PAGES=400)の両方で指定されています。TimesTenは警告を発行して、ハッシュ索引のサイズ設定にPAGES=400を使用します。
Command> CREATE TABLE mytab (col1 TT_INTEGER, col2 TT_INTEGER, PRIMARY KEY (col1, col2)
           USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX myindex on mytab (col1,col2) PAGES=200)) 
           UNIQUE HASH ON (col1,col2) PAGES=400 DISTRIBUTE BY HASH (col1);
Warning  2252: Different number of pages specified for hash index MYINDEX in table and index definition. 
Index created with pages = 400
制限
  • USING INDEX句は、表に対する外部キー制約には使用できません。

  • USING INDEX句は、ビューには使用できません。

グローバル索引とローカル索引およびそれらのTimesTen Scaleoutでの使用の詳細は、「CREATE INDEX」を参照してください。

CREATE TABLEの追加情報: TimesTen Scaleout

  • TimesTen Scaleoutは、3つの分散スキームのいずれかによってデータを分散します。

    • ハッシュ: TimesTen Scaleoutは、主キー列またはDISTRIBUTED BY HASH句で指定された1つ以上の列のハッシュに基づいてデータを分散します。指定した行がレプリカ・セットに格納されます。行はレプリカ・セット間で均一に分散されます。大部分の表に適しているため、ハッシュはデフォルトの分散スキームです。

    • 参照: TimesTen Scaleoutは外部キーで識別される親表の場所に基づいて子表のデータを分散します。子表の指定した行が親表と同じレプリカ・セットに存在します。この分散スキームは、1つのレプリカ・セット内の関連データを分散することで、結合を最適化します。ハッシュまたは参照によって親表を分散できます。ハッシュによって分散された場合、親はルート表と呼ばれます。子(外部)キー列をNOT NULLとして定義する必要があります。

    • 複製: TimesTen Scaleoutは、データの同一のコピーをデータベースのすべての要素に分散します。すべての行がすべての要素に存在します。この分散スキームは、各データ・インスタンスに同一のデータを格納することで、読取りのパフォーマンスを最適化します。この分散スキームは、比較的小さい、頻繁に読み取られる、変更頻度の低い表に適しています。

    詳細は、『Oracle TimesTen In-Memory Database Scaleoutユーザーズ・ガイド』表に対する分散スキームの定義に関する項および表の分散スキームの定義に関する項を参照してください。

  • ハッシュ分散スキームを使用する表の場合:

    • 指定された場合、分散キーが使用されます。

    • 分散キーが指定されない場合は、主キーが使用されます。

    • 主キーまたは分散キーがない場合は、非表示列が使用されます。データはランダムかつ均等に分散されます。

    表に主キーが定義されている場合は、分散キーを指定する必要がありますが、主キーはデータを分散する最適な方法ではありません。主キーがなく、一意の列がある場合、この一意の列にデータを分散できます。主キーがなく、一意の列がない場合は、分散キーを指定しないでください。TimesTen Scaleoutは、非表示列にデータを分散します。

  • 参照による分散スキームの場合:

    • DISTRIBUTE BY REFERENCE句では、1つの外部キー制約のみを参照できます。子表に複数の外部キー制約がある場合がありますが、参照分散を決定するために1つのみを使用できます。

    • 参照先外部キー制約が複数ある場合は、制約句で指定する必要があります。

    • 参照分散句内の外部キー制約は、主キーまたは親表の一意キーを参照する必要があります。親表がルートである場合、参照先キーは分散キーである必要があります。

    • 親表の非分散キー列への外部キー関係を作成できますが、この外部キー関係に基づいて参照によって分散することはできません。

    • DISTRIBUTE BY REFERENCE句で使用されている外部キー列は更新できません。

  • 表にデータをロードしようとしている場合は、索引のない表の作成を検討してください。索引は、データのロード後に作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。例外は、外部キーと参照表を使用している場合です。
  • CREATE TABLE...AS SELECT文を使用して、元表の定義に基づいて新しい表を作成できます。主キー制約は新しい表に引き継がれないため、新しい表に主キー制約を定義しない場合、データの分散方法が変更されることに注意してください。

    詳細は、「CREATE TABLE...AS SELECTの使用」を参照してください。

  • 列を同じ値に更新しないかぎり、分散キー列を更新できません。

  • 主キーに保存されるすべての列は、NOT NULLである必要があります。

  • ColumnDefinitionで指定されたPRIMARY KEYは、1つの列に対してのみ指定できます。

  • PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。

  • 主キーおよび外部キー制約において、制約列リストでの列名の重複は許可されません。

  • 主キー列は、列を同じ値に更新する以外の更新はできません。

  • インライン列ではなくアウトライン列を定義する際にパフォーマンスに関して考慮する事項があります。

    • TimesTenは、アウトライン列を使用してデータを連続して格納しないため、データへのアクセスは遅くなります。

    • TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。

    • TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。

    • 列を保存するとオーバーヘッドが少なくなります。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • キャッシュ表を参照する外部キーを持つ表は作成できません。

  • UNIQUE列制約およびデフォルトの列の値は、マテリアライズド・ビューではサポートされていません。

  • 表の主キーで使用する索引を変更するには、ALTER TABLE文を使用します。

  • AS SelectQuery句を指定する場合:

    • データ型およびデータ型の長さは、SelectQueryから導出されます。作成する表の列にデータ型を指定しないでください。

    • SelectQueryで列を含む式ではなく列が選択された場合、TimesTenでは、新しい表の列に対して、選択された表の対応する列に明示的に作成されていたNOT NULL制約を定義します。

    • 選択された表の列(主キーなど)でTimesTenにより暗黙的に作成されていたNOT NULL制約は、新しい表に引き継がれます。選択した表のNOT NULL制約を無効にするには、新しい列をNULLとして定義します。たとえば:

      CREATE TABLE newtable (newcol NULL) AS SELECT (col) FROM tab;
      
    • NOT INLINE/INLINE属性は新しい表に引き継がれます。

    • 一意キー、外部キー、索引および列のデフォルト値は、新しい表に引き継がれません。

    • SelectQueryのすべての式が式ではなく列である場合は、作成する表から列を省略できます。この場合、列の名前はSelectQueryの列と同じです。SelectQueryに単純な列参照ではなく式が含まれている場合は、列の別名を指定するか、またはCREATE TABLE文で列に名前を付けます。

    • 作成する表に対して外部キーを指定しないでください。

    • SelectQuerySELECT FOR UPDATEを指定しないでください。

    • AS SelectQuery句を使用する場合、ORDER BY句はサポートされません。

    • SelectQueryに集合演算子UNIONMINUSおよびINTERSECTを含めることはできません。

  • デフォルトでは、主キーを実現するために、範囲索引が作成されます。主キーに対してハッシュ索引を指定するには、UNIQUE HASH句を使用してください。

    • アプリケーションで表の主キーを使用して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、その表に対して範囲索引を選択してください。

    • 主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。

  • ハッシュ索引は、表が存在している間、ALTER TABLE文を使用してハッシュ索引がサイズ変更されるまで、または索引が削除されて再作成されるまで変更されない固定のサイズで作成されます。小さいハッシュ索引ほどハッシュの衝突が増えます。大きいハッシュ索引ほど衝突が少なくなりますが、メモリを消費しやすくなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。

    ハッシュ索引のサイズが適性に設定されていることを確認するには、SET PAGES句のRowPagesパラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

  • ハッシュ・キーには、最大16列を指定できます。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

    • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADEには、次の規則も適用されます。

    • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • グローバル一時表のデータは現在の接続専用となり、ユーザー間で保護する必要はありません。このため、グローバル一時表にオブジェクト権限は必要ありません。

例: TimesTen Scaleoutのグローバル索引とローカル索引

次に示す例は、CREATE TABLE...PRIMARY KEYでグローバル索引を使用するための様々な構文の使用を示しています。

主キーを指定する表を作成します。USING INDEX GLOBAL句を使用して、グローバル範囲索引を作成します。主キーの要件と同様に、この索引は一意にする必要があります。
Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX GLOBAL) DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  MYTAB: global unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX LOCAL句を使用して、ローカル範囲索引を作成します。主キーの要件と同様に、この索引は一意にする必要があります。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
  PRIMARY KEY (c,b) USING INDEX LOCAL DISTRIBUTE BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  MYTAB: unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX (CreateIndexStmt)句を使用して、グローバル範囲索引を作成します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。索引の作成時には、UNIQUEキーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE INDEX GlobalUniqueIdx ON mytab (c,b))) DISTRIBUTE  BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  GLOBALUNIQUEIDX: global unique range index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX (CreateIndexStmt)句を使用して、グローバル範囲索引を作成します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。CREATE INDEX定義では、索引定義に追加の列を含めるためのINCLUDE句を指定します。索引の作成時には、UNIQUEキーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE INDEX GlobalUniqueIdx 
           ON mytab (c,b) INCLUDE (a))) DISTRIBUTE  BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  GLOBALUNIQUEIDX: global unique range index on columns:
    C
    B
    Included columns:
      A
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

主キーを指定する表を作成します。USING INDEX (CreateIndexStmt)句を使用して、グローバル一意ハッシュ索引を作成します。(CreateIndexStmt)句は、TimesTenのCREATE INDEX文に従って索引を定義することを示します。カッコ( )が必要です。索引の作成時には、UNIQUEキーワードを指定する必要があります。これは主キーの要件です。この文の詳細は、「CREATE INDEX」を参照してください。

Command> CREATE TABLE mytab (c TT_INTEGER, b TT_INTEGER, a TT_INTEGER, 
           PRIMARY KEY (c,b) USING INDEX (CREATE GLOBAL UNIQUE HASH INDEX GlobalUniqueIdx 
           ON mytab (c,b))) DISTRIBUTE  BY HASH (a,b);
Command> indexes mytab;

Indexes on table SAMPLEUSER.MYTAB:
  GLOBALUNIQUEIDX: global unique hash index on columns:
    C
    B
  1 index found.

1 index found on 1 table.
Command> DROP TABLE mytab;

その他の例: TimesTen Scaleout

これらの例では、重複、ハッシュおよび参照分散スキームを使用して表を作成する方法を示します。

これらの例では、DISTRIBUTE BY REFERENCE分散スキームを使用して表を作成する方法を示します。

「CREATE TABLE...AS SELECTの使用」には、TimesTen ScaleoutでのCREATE TABLE...AS SELECTの使用方法が示されています。

account_type表の作成

この例では、ttIsqlを実行してaccount_type表を作成し、複製分散スキームを使用してデータを分散します。この表には少数の行が含まれ、複製分散スキームを使用して読取りを最適化します。表内のデータのコピーはデータベースのすべての要素に分散されます。

Command> CREATE TABLE account_type ( type CHAR(1) NOT NULL PRIMARY KEY,
           description VARCHAR2(100) NOT NULL) DUPLICATE;

account_status表の作成

この例では、ttIsqlを実行してaccount_status表を作成し、複製分散スキームを使用します。表のサイズは小さく、分散スキームを使用して読取りを最適化します。表内のデータのコピーはデータベースのすべての要素に分散されます。

Command> CREATE TABLE account_status(status NUMBER(2) NOT NULL PRIMARY KEY,
           description VARCHAR2(100) NOT NULL) DUPLICATE;

顧客表の作成

この例では、ttIsqlを実行してcustomers表を作成し、ハッシュによって表を分散します。表内のデータは、cust_id列(主キー)のハッシュに基づいて各要素に分散されます。

Command> CREATE TABLE customers(cust_id NUMBER(10,0) NOT NULL PRIMARY KEY,
           first_name VARCHAR2(30) NOT NULL,last_name VARCHAR2(30) NOT NULL,
           addr1 VARCHAR2(64),addr2 VARCHAR2(64), zipcode VARCHAR2(5),
           member_since DATE NOT NULL)
         DISTRIBUTE BY HASH;

アカウント表の作成

この例では、ttIsqlを実行してaccounts表を作成し、3つの主キー/外部キー関係を定義します。accounts表は参照によって分散され、データはfk_customer外部キー制約に基づいて分散されます。このスキームは、(fk_customer外部キー制約の) customers.cust_id親列の対応する値の場所に基づいてaccounts表のデータを分散することで、結合のパフォーマンスを最適化します。子表の行は、親表と同じレプリカ・セットに存在します。結合が主キーまたは外部キーで実行される場合、データは1つの要素に格納されるため、TimesTen Scaleoutは様々な要素にアクセスする必要がありません。

Command> CREATE TABLE accounts(account_id NUMBER(10,0) NOT NULL PRIMARY KEY,
           phone VARCHAR2(15) NOT NULL,account_type CHAR(1) NOT NULL,
           status NUMBER(2) NOT NULL,current_balance NUMBER(10,2) NOT NULL,
           prev_balance NUMBER(10,2) NOT NULL,date_created DATE NOT NULL,
           cust_id NUMBER(10,0) NOT NULL,
         CONSTRAINT fk_customer FOREIGN KEY (cust_id)
         REFERENCES customers(cust_id),CONSTRAINT fk_acct_type
         FOREIGN KEY (account_type)
         REFERENCES account_type(type),
         CONSTRAINT fk_acct_status
         FOREIGN KEY (status)
         REFERENCES account_status(status)
         )
         DISTRIBUTE BY REFERENCE (fk_customer);

トランザクション表の作成

この例では、ttIsqlを実行してtransactions表を作成します。transactions表は参照によって分散され、データはfk_accounts外部キー制約に基づいて分散されます。このスキームは、(fk_accounts外部キー制約の) accounts.account_id親列の対応する値の場所に基づいてtransaction表のデータを分散することで、結合のパフォーマンスを最適化します。子表の行は、親表と同じレプリカ・セットに存在します。結合が主キーまたは外部キーで実行される場合、データは1つの要素に格納されるため、TimesTen Scaleoutは様々な要素にアクセスする必要がありません。

accounts親表も参照によって分散されます。これは、参照分散階層による2レベルの分散を定義します。

Command> CREATE TABLE transactions(transaction_id NUMBER(10,0) NOT NULL,
           account_id NUMBER(10,0) NOT NULL ,
           transaction_ts TIMESTAMP NOT NULL,
           description VARCHAR2(60),
           optype CHAR(1) NOT NULL,
           amount NUMBER(6,2) NOT NULL,
         PRIMARY KEY (account_id, transaction_id, transaction_ts),
         CONSTRAINT fk_accounts FOREIGN KEY (account_id)
         REFERENCES accounts(account_id)
         )
         DISTRIBUTE BY REFERENCE (fk_accounts);

表の表示

この例では、ttIsql tablesコマンドを実行して、データベースの表を表示します。

Command> tables;
  SAMPLEUSER.ACCOUNTS
  SAMPLEUSER.ACCOUNT_STATUS
  SAMPLEUSER.ACCOUNT_TYPE
  SAMPLEUSER.CUSTOMERS
  SAMPLEUSER.TRANSACTIONS
5 tables found.

accounts表の定義の表示

この例では、ttIsql describeコマンドを実行して、accounts表の定義を表示します。

Command> describe accounts;
 
Table SAMPLEUSER.ACCOUNTS:
  Columns:
   *ACCOUNT_ID                      NUMBER (10) NOT NULL
    PHONE                           VARCHAR2 (15) INLINE NOT NULL
    ACCOUNT_TYPE                    CHAR (1) NOT NULL
    STATUS                          NUMBER (2) NOT NULL
    CURRENT_BALANCE                 NUMBER (10,2) NOT NULL
    PREV_BALANCE                    NUMBER (10,2) NOT NULL
    DATE_CREATED                    DATE NOT NULL
    CUST_ID                         NUMBER (10) NOT NULL
  DISTRIBUTE BY REFERENCE (FK_CUSTOMER)
 
1 table found.
(primary key columns are indicated with *)

1つの外部キーを含むDISTRIBUTE BY REFERENCE

この例は、DISTRIBUTE BY REFERENCE句で外部キー制約を指定する必要がないことを示しています。1つの外部キーのみがあります。

最初にOrders表を作成し、ハッシュによって分散します。

Command> CREATE TABLE Orders
           (OrderId TT_INTEGER NOT NULL PRIMARY KEY,
            OrderDate DATE NOT NULL,
            discount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

1つの外部キー制約を含むOrderDetails表を作成します。分散句で制約を指定する必要はありません。

Command> CREATE TABLE OrderDetails
           (OrderId TT_INTEGER NOT NULL,
            PartId TT_INTEGER NOT NULL,
            Quantity TT_INTEGER NOT NULL,
         FOREIGN KEY (OrderId)
         REFERENCES Orders (OrderId))
         DISTRIBUTE BY REFERENCE;

ttIsql describeコマンドを実行して、表を表示します。

Command> describe Orders;
 
Table SAMPLEUSER.ORDERS:
  Columns:
   *ORDERID                         TT_INTEGER NOT NULL
    ORDERDATE                       DATE NOT NULL
    DISCOUNT                        BINARY_FLOAT
  DISTRIBUTE BY HASH (ORDERID)
 
1 table found.
(primary key columns are indicated with *)

Command> describe OrderDetails;
 
Table SAMPLEUSER.ORDERDETAILS:
  Columns:
    ORDERID                         TT_INTEGER NOT NULL
    PARTID                          TT_INTEGER NOT NULL
    QUANTITY                        TT_INTEGER NOT NULL
  DISTRIBUTE BY REFERENCE
 
1 table found.
(primary key columns are indicated with *)

複数の外部キーを含む表

この例は、表に複数の外部キー制約が含まれている場合、参照として使用される外部キー制約をDISTRIBUTE BY REFERENCE句で指定する必要があることを示しています。customers2表は親となり、ハッシュによって分散されます。OrderDetails2表には2つの外部キー制約が含まれており、この表は参照によってc1_1制約で分散されます。この制約をDISTRIBUTED BY REFERENCE句に含める必要があります。

Command> CREATE TABLE customers2 (CustomerId TT_INTEGER NOT NULL PRIMARY KEY,
           LastOrderDate DATE NOT NULL,PromotionDiscount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

Command> CREATE TABLE OrderDetails2 (OrderId TT_INTEGER NOT NULL,
           CustomerId TT_INTEGER NOT NULL, Quantity TT_INTEGER NOT NULL,
         CONSTRAINT c1_1 FOREIGN KEY (OrderId) 
         REFERENCES Orders (OrderId),
         CONSTRAINT c2_2 FOREIGN KEY (CustomerId) 
         REFERENCES Customers2 (CustomerId))
         DISTRIBUTE BY REFERENCE (c1_1);

親表の分散キーに基づかない外部キー関係

この例は、OrderId主キーおよびCouponId一意キーを持つorders2親表を作成します。この表は、ハッシュによって分散されます。分散キーが指定されていないため、データはハッシュによってOrderId主キーで分散されます。coupons子表はCouponId一意キーに外部キー関係を確立します。このキーはorders2親表の分散キーではないため、TimesTen Scaleoutはエラーをスローします。

Command> CREATE TABLE Orders2 (OrderId TT_INTEGER NOT NULL PRIMARY KEY,
           CouponId TT_INTEGER NOT NULL UNIQUE, OrderDate DATE NOT NULL,
           discount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

Command> CREATE TABLE Coupons (CouponId TT_INTEGER NOT NULL, 
           discount BINARY_FLOAT,
         CONSTRAINT CouponC1 FOREIGN KEY (CouponId) 
         REFERENCES Orders2 (CouponId) )
         DISTRIBUTE BY REFERENCE (CouponC1);
 1067: The Parent keys for a distribute by reference table with hash distributed
parent must include the distribution keys of the parent.
The command failed.

第1レベルおよび第2レベルの子外部キー関係の使用

この例では、Coupons2親表を作成し、ハッシュによってデータを分散します。Orders3子表は第1レベルの外部キー関係として作成され、親表(Coupons2)はルート表です。OrderDetails3子表は第2レベルの外部キー関係として作成され、親表(Orders3)は参照表です。

Command> CREATE TABLE Coupons2 (CouponId TT_INTEGER NOT NULL PRIMARY KEY, 
           discount BINARY_FLOAT)
         DISTRIBUTE BY HASH;

Command> CREATE TABLE Orders3 (OrderId TT_INTEGER NOT NULL PRIMARY KEY,
           CouponId TT_INTEGER NOT NULL, OrderDate DATE NOT NULL,
           discount BINARY_FLOAT, CONSTRAINT c1_coupons FOREIGN KEY (CouponId)
         REFERENCES Coupons2 (CouponId))
         DISTRIBUTE BY REFERENCE (c1_coupons);

Command> CREATE TABLE OrderDetails3 (OrderId TT_INTEGER NOT NULL,
           PartId TT_INTEGER NOT NULL, quantity TT_INTEGER NOT NULL,
         CONSTRAINT c1_orders FOREIGN KEY (OrderId)
         REFERENCES Orders3 (OrderId))
         DISTRIBUTE BY REFERENCE (C1_orders);

CREATE TABLE...AS SELECTの使用

この例では、customers表に基づいてNewCustomers表を作成します。主キー制約を定義することで、同じ分散スキームを保持し、データが主キーに基づいて分散されるようにします。

Command> CREATE TABLE NewCustomers(cust_id PRIMARY KEY, first_name, last_name, 
           addr1, addr2, zipcode, member_since) AS SELECT * FROM customers;
0 rows inserted.
Command> describe NewCustomers;
 
Table SAMPLEUSER.NEWCUSTOMERS:
  Columns:
   *CUST_ID                         NUMBER (10) NOT NULL
    FIRST_NAME                      VARCHAR2 (30) INLINE NOT NULL
    LAST_NAME                       VARCHAR2 (30) INLINE NOT NULL
    ADDR1                           VARCHAR2 (64) INLINE
    ADDR2                           VARCHAR2 (64) INLINE
    ZIPCODE                         VARCHAR2 (5) INLINE
    MEMBER_SINCE                    DATE NOT NULL
  DISTRIBUTE BY HASH (CUST_ID)
 
1 table found.
(primary key columns are indicated with *)

ttIsql describeを実行して、元のcustomers表を表示します。

Command> describe Customers;

Table SAMPLEUSER.CUSTOMERS:
  Columns:
   *CUST_ID                         NUMBER (10) NOT NULL
    FIRST_NAME                      VARCHAR2 (30) INLINE NOT NULL
    LAST_NAME                       VARCHAR2 (30) INLINE NOT NULL
    ADDR1                           VARCHAR2 (64) INLINE
    ADDR2                           VARCHAR2 (64) INLINE
    ZIPCODE                         VARCHAR2 (5) INLINE
    MEMBER_SINCE                    DATE NOT NULL
  DISTRIBUTE BY HASH (CUST_ID)
 
1 table found.
(primary key columns are indicated with *)

CREATE TABLEのSQL構文: TimesTen Classic

PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。

永続表の構文は、次のとおりです。

CREATE TABLE [Owner.]TableName
(
    {{ColumnDefinition} [,...]
     [PRIMARY KEY (ColumnName [,...]) |
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
            [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
    }
)
[ColumnBasedCompression]
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[AGING {LRU|
         USE ColumnName
             LIFETIME Num1 {SECOND[S] | MINUTE[S] | HOUR[S] |DAY[S]}
               [CYCLE Num2 {SECOND[S] | MINUTE[S] |HOUR[S] |DAY[S]}]
       }[ON|OFF]
] 
[AS SelectQuery]

グローバル一時表の構文は、次のとおりです。

CREATE GLOBAL TEMPORARY TABLE [Owner.]TableName
(
    {{ColumnDefinition} [,...]
     [PRIMARY KEY (ColumnName [,...]) |
     [[CONSTRAINT ForeignKeyName]
        FOREIGN KEY ([ColumnName] [,...])
        REFERENCES RefTableName
             [(ColumnName [,...])] [ON DELETE CASCADE]] [...]
      }
)
[UNIQUE HASH ON (HashColumnName [,...])
    PAGES = PrimaryPages]
[ON COMMIT { DELETE | PRESERVE } ROWS]

CREATE TABLEのパラメータ: TimesTen Classic

パラメータ 説明

[Owner.]TableName

新しい表に割り当てる名前です。2つの表に同じ所有者名と表名を指定することはできません。

所有者名を指定していない場合は、ログイン名が新しい表の所有者名になります。TimesTenの表の所有者は、ユーザーIDの設定またはログイン名によって決まります。Oracle Database表の所有者名は、TimesTen表の所有者名と常に一致させる必要があります。

名前を定義するためのルールについては、「基本名」を参照してください。

GLOBAL TEMPORARY

作成する表をグローバル一時表にします。一時表は永続表と類似していますが、接続で参照された場合にのみ効率的にマテリアライズされます。

グローバル一時表定義は永続的であり、すべての接続に対して表示されますが、表インスタンスは各接続に対してローカルです。表インスタンスは、表を参照するコマンドが接続に対してコンパイルされる場合に作成され、接続が切断されると削除されます。同じ一時表のすべてのインスタンスの名前は同じですが、表名と追加の接続IDに基づいて識別されます。グローバル一時表は、一時領域に割り当てられます。

グローバル一時表の内容は接続間で共有できません。各接続では、その接続の表の内容のみが表示され、一時表を参照するコンパイルされたコマンドは接続間で共有されません。

DDL_REPLICATION_LEVELが2以上の場合、グローバル一時表の作成はアクティブ・スタンバイ・ペア内でレプリケートされますが、グローバル一時表はレプリケーション・スキームに含まれません。

DATASTORE要素が指定されている場合、一時表はアクティブ・スタンバイ・ペアから自動的に除外されます。

キャッシュ・グループ表は、一時表として定義できません。

一時表の変更は、XLAで追跡できません。

一時表の操作でログ・レコードが生成されます。生成されるログの量は、永続表用よりも少なくなります。

TRUNCATE TABLEは、グローバル一時表でサポートされていません。

ローカルの一時表は、サポートされていません。

グローバル一時表にアクセスするには、オブジェクト権限は必要ありません。

グローバル一時表にはAS SelectQuery句を指定しないでください。

ColumnDefinition

表の個々の列です。各表には、列が少なくとも1つ必要です。

AS SelectQuery句を指定する場合、ColumnDefinitionはオプションです。

ColumnName

表の列の名前。CREATE TABLE文の様々な句で使用されます。

主キー定義で名前が使用されている場合、名前は作成する表の主キーを形成します。主キーには最大16列を指定できます。外部キーの場合、ColumnNameはオプションです。外部キーに対して指定しない場合、参照されるのは親表の主キーです。

AS SelectQuery句を指定する場合、ColumnNameを指定する必要はありません。AS SelectQuery句にデータ型を指定しないでください。

PRIMARY KEY

PRIMARY KEYは、表定義で一度だけ指定できます。これによって、1つ以上の列が表の主キーを構成していることを示します。主キーの内容は一意かつNOT NULLである必要があります。列には、UNIQUEと単一列PRIMARY KEYの両方を指定することはできません。

CONSTRAINT ForeignKeyName

オプションのユーザー定義の名前を外部キーに指定します。ユーザーが指定しない場合は、システムによってデフォルトの名前が指定されます。

FOREIGN KEY

新しい表とRefTableNameによって識別される参照先の表の間で外部キー制約を指定します。外部キー制約で指定される列には、2つのリストがあります。

最初のリストの列は、新しい表の列であり、参照元列と呼ばれます。2番目のリストの列は、参照先の表の列であり、参照先列と呼ばれます。これら2つのリストは、長さ、精度、スケールを含めてデータ型が一致している必要があります。参照先の表には、参照先列に対する主キーまたは一意索引がすでに存在している必要があります。

参照先列の列名リストはオプションです。省略した場合、RefTableNameの1次索引が使用されます。

外部キーを宣言することにより、参照元列に範囲索引が作成されます。参照先の表またはその参照先の索引は、参照元表を削除しないかぎり削除できません。

外部キー制約によって、新しい表の各行と参照先の表の行は、参照元列の内容と参照先列の内容が同じになるように一致させる必要があります。INSERTDELETEまたはUPDATE文が制約に違反した場合、TimesTenエラー3001が返されます。

TimesTenでは、SQL-92 "NO ACTION"の更新および削除規則とON DELETE CASCADEがサポートされています。外部キー制約は遅延可能ではありません。

外部キーはグローバル一時表で定義できますが、グローバル一時表の参照のみを行うことができます。親表がCOMMIT DELETEを使用して定義されている場合は、子表にもCOMMIT DELETE属性が必要です。

外部キーは、アクティブな親表を参照できません。アクティブな親表とは、接続に対してマテリアライズされたインスタンスを持つ表のことです。

AS SelectQuery句を指定する場合は、作成する表に対して外部キーを定義できません。

[ON DELETE CASCADE]

ON DELETE CASCADE参照アクションを有効にします。指定されている場合、参照先キーの値を含む行が親表から削除されると、依存する外部キーの値を持つ子表の行も削除されます。

ColumnBasedCompression

データをより効率的に格納する、列レベルでの圧縮を定義します。列での重複する値の冗長な格納を削除し、全表スキャンを実行するSQL問合せのパフォーマンスを向上させます。詳細は、「表の列ベースの圧縮(TimesTen Classic)」を参照してください。

UNIQUE

UNIQUE列の各行の値が一意である必要があることを示します。

UNIQUE HASH ON

表のハッシュ索引。このパラメータは、等価条件に使用します。UNIQUE HASH ONを指定するには、主キーの定義が必要です。

HashColumnName

表に定義された列をこの表のハッシュ・キーに含めます。ハッシュ索引に指定される列は、主キーの列と同じである必要があります。

AS SelectQuery句を指定する場合は、作成する表にHashColumnNameを定義する必要があります。

PAGES = PrimaryPages

表の想定ページ数に基づいてハッシュ索引のサイズを設定します。PrimaryPagesの値は、表の想定行数を256で除算して決定します。たとえば、表に256,000行ある場合は、PrimaryPagesに1000を指定します(256000/256=1000)。

PrimaryPagesの値は、0を含まない正の定数である必要があります。

PrimaryPagesの推定値が小さすぎると、パフォーマンスが悪化します。

[ON COMMIT {DELETE|PRESERVE} ROWS]

グローバル一時表を作成するトランザクションがコミットされるときに、行を削除するか、または保存するかを指定するオプションの文です。この文が指定されていない場合は、一時表の行が削除されます。

[AGING LRU [ON|OFF]]

指定する場合、表のLRUエージング・ポリシーを定義します。LRUエージング・ポリシーでは、エージングのタイプ(LRU)、エージング状態(ONまたはOFF)およびLRUエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

LRU属性は、組込みプロシージャのttAgingLRUConfigまたはttAgingTableLRUConfigのどちらか(あるいはその両方)をコールすることで定義します。LRU属性はSQLレベルでは定義できません。詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』ttAgingLRUConfigに関する項およびttAgingTableLRUConfigに関する項と、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』表へのエージング・ポリシーの実装に関する項を参照してください。

[AGING USE ColumnName...[ON|OFF]]

指定する場合、表の時間ベースのエージング・ポリシーを定義します。時間ベースのエージング・ポリシーでは、エージングのタイプ(時間ベース)、エージング状態(ONまたはOFF)および時間ベースのエージング属性を定義します。

エージング状態をONまたはOFFのいずれかに設定します。ONはエージング状態が有効であり、エージングが自動的に実行されることを示します。OFFはエージング状態が無効であり、エージングが自動的に実行されないことを示します。両方の場合、エージング・ポリシーが定義されます。デフォルトはONです。

時間ベースのエージング属性はSQLレベルで定義され、LIFETIME句およびCYCLE句で指定します。

時間ベース・エージングに使用する列の名前としてColumnNameを指定します。列は、NOT NULLTIMESTAMPデータ型またはDATEデータ型として定義します。この列の値がSYSDATEから差し引かれ、指定した単位(秒、分、時間、日数)を使用して切り捨てられた後、LIFETIME値との比較が行われます。結果がLIFETIME値より大きい場合、その行はエージングの候補となります。

エージングに使用される列の値は、アプリケーションによって更新されます。この列の値が不明な行がある場合、その行がエージ・アウトされないようにするには、列に大きなデフォルト値を定義します(この列はNULLにはできません)。

TT_TIMESTAMPデータ型またはTT_DATEデータ型を使用してエージング列を定義できます。TT_DATEデータ型を選択する場合は、LIFETIME単位としてDAYSを指定する必要があります。

AS SelectQuery句を指定する場合は、作成する表にColumnNameを定義する必要があります。

時間ベースのエージングの詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』表へのエージングの実装に関する項を参照してください。

LIFETIME Num1 {SECOND[S]| MINUTE[S]|HOUR[S]| DAY[S]}

LIFETIMEは時間ベースのエージング属性で、必須の句です。

AGING USE ColumnName句の後にLIFETIME句を指定します。

LIFETIME句には、データがキャッシュに保持されることが保証される時間を指定します。

Num1には、行がキャッシュに保持される時間の長さを、秒、分、時間または日数で表す正の整定数を指定します。LIFETIME値を超えた行はエージ・アウト(表から削除)されます。エージング列をTT_DATEデータ型を使用して定義する場合は、LIFETIME単位としてDAYSを指定する必要があります。

時間の単位の概念がサポートされています。時間の単位にDAYSを指定した場合、タイムスタンプの日付が同じ日になっているすべての行が同時にエージ・アウトされます。また、HOURSを時間の単位に指定した場合は、タイムスタンプ値の時間が同じ行が、すべて同時にエージ・アウトされます。LIFETIMEの3 DAYSは、LIFETIMEの72 HOURS(3×24)やLIFETIMEの432 MINUTES(3×24×60)とは異なります。

[CYCLE Num2 {SECOND[S] |MINUTE[S]|HOUR[S]| DAY[S]}]

CYCLEは時間ベースのエージング属性で、オプションです。LIFETIME句の後にCYCLE句を指定します。

CYCLE句は、データが指定したLIFETIME値を超えているかどうか、その結果エージ・アウト(削除)する必要があるかどうかを確認するために、システムで行をチェックする頻度を指定します。

Num2には、正の整数を指定します。

CYCLE句を指定しない場合、デフォルト値は5分です。Num2に0を指定した場合、エージング・スレッドは1秒ごとに起動します。

エージング状態がOFFの場合、エージングは自動的に実行されず、CYCLE句は無視されます。

AS SelectQuery

指定すると、SelectQueryの結果セットの内容から新しい表が作成されます。SelectQueryで返される行が表に挿入されます。

データ型およびデータ型の長さは、SelectQueryから導出されます。

SelectQueryは、副問合せを含めることも含めないこともできる有効なSELECT文です。SELECT文の詳細は、「SELECT」を参照してください。

SELECT動詞の後に文レベルのオプティマイザ・ヒントを指定できます。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

列定義: TimesTen Classic

SQL構文

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

LOB以外のすべてのデータ型について、構文は次のとおりです。

ColumnName ColumnDataType
 [DEFAULT DefaultVal]
 [[NOT] INLINE]
 [PRIMARY KEY | UNIQUE | 
 NULL [UNIQUE] | 
 NOT NULL [ENABLE] [PRIMARY KEY | UNIQUE] 
]

LOBデータ型の場合、LOB列に主キーまたは一意制約を作成できません。また、LOBデータ型は表外に格納されるため、INLINE属性を指定できません。

LOBデータ型は、TimesTen Scaleoutではサポートされていません。

すべてのLOBデータ型について、構文は次のとおりです。

ColumnName ColumnDataType
 [DEFAULT DefaultVal] [[NOT] NULL [ENABLE]] |
 [[NOT] NULL [ENABLE]] [DEFAULT DefaultVal]

パラメータ

列定義には、次のパラメータがあります。

パラメータ 説明

ColumnName

新しい表の列に割り当てる名前です。表の2つの列に同じ名前を指定することはできません。1つの表の列数は最大で1000です。

AS SelectQuery句を指定する場合、ColumnNameはオプションです。列名の数は、SelectQueryの列の数と一致している必要があります。

ColumnDataType

列に格納できるデータ型です。長さを指定する必要があるデータ型もあります。指定できるデータ型の詳細は、「データ型」を参照してください。

AS SelectQuery句を指定する場合、ColumnDataTypeは指定しないでください。

DEFAULT DefaultVal

INSERT文で列の値が指定されていない場合は、列にデフォルト値DefaultValを挿入します。指定されたデフォルト値は、列のデータ型と互換性がある型である必要があります。デフォルト値には、関連付けられた列で許可されている任意のデータ型を指定できます。ROWIDデータ型について、または読取り専用キャッシュ・グループの列についてデフォルト値を割り当てることはできません。また、DEFAULT句でファンクションを使用することはできません。

DefaultValでは、次のデータ型がサポートされます。

デフォルト値がユーザーのいずれかである場合、列のデータ型はCHARまたはVARCHAR2のいずれかであり、列の幅は30文字以上である必要があります。

AS SelectQuery句を指定する場合は、オプションで、作成する表にDEFAULT句を指定することもできます。

INLINE|NOT INLINE

デフォルトでは、宣言された列の長さが128バイトより大きい可変長の列は表外に保存されます。宣言された列の長さが128バイト以下の可変長の列は、表内に保存されます。INLINEおよびNOT INLINEキーワードを使用すると、表を作成するときのデフォルトの動作を無効にすることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にINLINE | NOT INLINE句を指定することもできます。

NULL

列にNULL値を含めることができます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNULLを指定することもできます。

NULLを指定した場合は、ENABLEを指定できません。

NOT NULL [ENABLE]

列にNULL値を含めることはできません。NOT NULLを指定した場合、列にNULL値を保存しようとする文はすべて拒否されます。

AS SelectQuery句を指定する場合は、オプションで、作成する表にNOT NULL[ENABLE]を指定することもできます。

NOT NULLを指定する場合は、オプションでENABLEを指定できます。NOT NULL制約は常に有効なため、ENABLEの指定は必須ではありません。

ENABLEキーワードは、CREATE TABLE文で列を定義する場合にのみ使用できます。

UNIQUE

列に設定される一意制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。一意性を実現するために、TimesTenでは一意の範囲索引が作成されます。つまり、一意制約を持つ列は、制約を持たない列よりも多くのメモリーと時間を実行時に使用する可能性があります。PRIMARY KEYとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にUNIQUEを指定することもできます。

PRIMARY KEY

列に設定される一意のNOT NULL制約です。この列に同じ値を持つ行を、表内に複数保持することはできません。UNIQUEとともに使用することはできません。

AS SelectQuery句を指定する場合は、オプションで、作成する表にPRIMARY KEYを指定することもできます。

CREATE TABLEの説明: TimesTen Classic

  • 表にデータをロードしようとしている場合は、索引のない表の作成を検討してください。索引は、データのロード後に作成できます。これにより、表へのデータのロードにかかる時間が短縮されます。
  • 主キーに保存されるすべての列は、NOT NULLである必要があります。

  • ColumnDefinitionで指定されたPRIMARY KEYは、1つの列に対してのみ指定できます。

  • PRIMARY KEYを、ColumnDefinition句とPRIMARY KEY句の両方で指定することはできません。

  • 主キーおよび外部キー制約において、制約列リストでの列名の重複は許可されません。

  • 主キー列は、列を同じ値に更新する以外の更新はできません。

  • インライン列ではなくアウトライン列を定義する際にパフォーマンスに関して考慮する事項があります。

    • TimesTenは、アウトライン列を使用してデータを連続して格納しないため、データへのアクセスは遅くなります。

    • TimesTenは、より多くのロギング操作を生成するため、データの移入が遅くなります。

    • TimesTenは、より多くの再利用操作およびロギング操作を実行するため、データの削除が遅くなります。

    • 列を保存するとオーバーヘッドが少なくなります。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • ON DELETE CASCADEトリガー・アクションを変更するには、外部キー制約を削除して再定義してください。

  • キャッシュ表を参照する外部キーを持つ表は作成できません。

  • UNIQUE列制約およびデフォルトの列の値は、マテリアライズド・ビューではサポートされていません。

  • 表の主キーで使用する索引を変更するには、ALTER TABLE文を使用します。

  • AS SelectQuery句を指定する場合:

    • データ型およびデータ型の長さは、SelectQueryから導出されます。作成する表の列にデータ型を指定しないでください。

    • SelectQueryで列を含む式ではなく列が選択された場合、TimesTenでは、新しい表の列に対して、選択された表の対応する列に明示的に作成されていたNOT NULL制約を定義します。

    • 選択された表の列(主キーなど)でTimesTenにより暗黙的に作成されていたNOT NULL制約は、新しい表に引き継がれます。選択した表のNOT NULL制約を無効にするには、新しい列をNULLとして定義します。たとえば:

      CREATE TABLE newtable (newcol NULL) AS SELECT (col) FROM tab;
      
    • NOT INLINE/INLINE属性は新しい表に引き継がれます。

    • 一意キー、外部キー、索引および列のデフォルト値は、新しい表に引き継がれません。

    • SelectQueryのすべての式が式ではなく列である場合は、作成する表から列を省略できます。この場合、列の名前はSelectQueryの列と同じです。SelectQueryに単純な列参照ではなく式が含まれている場合は、列の別名を指定するか、またはCREATE TABLE文で列に名前を付けます。

    • 作成する表に対して外部キーを指定しないでください。

    • SelectQuerySELECT FOR UPDATEを指定しないでください。

    • AS SelectQuery句を使用する場合、ORDER BY句はサポートされません。

    • SelectQueryに集合演算子UNIONMINUSおよびINTERSECTを含めることはできません。

    • レプリケートされた環境では、次のことに注意してください。

      グローバル一時表を含む新しい表の作成時に表をアクティブ・スタンバイ・ペアに含めるには、アクティブ・データベースでCREATE TABLE文を実行する前に、DDL_REPLICATION_LEVELを2以上に設定し、DDL_REPLICATION_ACTIONINCLUDEに設定します。この構成では、表はアクティブ・スタンバイ・ペアに含まれ、レプリケーション・スキームのすべてのデータベースにレプリケートされます。

      DDL_REPLICATION_ACTIONEXCLUDEに設定した場合、新しい表は、アクティブ・スタンバイ・ペアに含まれませんが、レプリケーション・スキームのすべてのデータベースにレプリケートされます。表はレプリケーション・スキームの一部にはならないため、その表で発行されたDMLはレプリケートされません。表に対してDMLレプリケーションを有効にするには、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLE文を実行して、表を含める必要があります。この場合、ALTER ACTIVE STANDBY PAIR ... INCLUDE TABLEを実行すると表の内容は切り捨てられるため、この文を実行する前に、表は空であり、すべてのデータベースに存在している必要があります。

      詳細は、「ALTER SESSION」を参照してください。

  • デフォルトでは、主キーを実現するために、範囲索引が作成されます。主キーに対してハッシュ索引を指定するには、UNIQUE HASH句を使用してください。

    • アプリケーションで表の主キーを使用して範囲問合せを実行する場合は、UNIQUE HASH句を省略して、その表に対して範囲索引を選択してください。

    • 主キーの完全一致検索のみをアプリケーションで実行する場合は、ハッシュ索引の方がレスポンス時間およびスループットが優れている場合があります。その場合は、UNIQUE HASH句を指定します。

  • ハッシュ索引は、表が存在している間、ALTER TABLE文を使用してハッシュ索引がサイズ変更されるまで、または索引が削除されて再作成されるまで変更されない固定のサイズで作成されます。小さいハッシュ索引ほどハッシュの衝突が増えます。大きいハッシュ索引ほど衝突が少なくなりますが、メモリを消費しやすくなります。ハッシュ・キー比較は高速な操作であるため、少数のハッシュ衝突がTimesTenにパフォーマンスの問題を発生させることはありません。

    ハッシュ索引のサイズが適性に設定されていることを確認するには、SET PAGES句のRowPagesパラメータの値により、アプリケーションで表の想定サイズを示す必要があります。この値は、表の想定行数を256で除算して計算します。たとえば、表に256,000行ある場合は、RowPagesに1000を指定します(256000/256=1000)。

  • ハッシュ・キーには、最大16列を指定できます。

  • ON DELETE CASCADEは、マテリアライズド・ビューのディテール表でサポートされています。子表に対して定義されたマテリアライズド・ビューがある場合、親表からの削除によって子表でカスケード削除が行われます。つまり、親表での削除により、マテリアライズド・ビューも変更されます。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • ON DELETE CASCADE: 親表から子表へのパスが異なる場合があるため、次のルールが適用されます。

    • 親表から子表へのすべてのパスを、deleteパスかdo not deleteパスのいずれかに統一します。deleteパスのすべての子表でON DELETE CASCADEを指定します。

    • このルールは、1つの親表から複数の子表へ、または複数の親表から1つの子表へのパスには適用されません。

  • ON DELETE CASCADEには、次の規則も適用されます。

    • ある表にdeleteパスでアクセスする場合、その表のすべての子表にもdeleteパスでアクセスします。

  • レプリケーションを含むON DELETE CASCADE: 次の制限が適用されます。

    • ON DELETE CASCADEで指定された外部キーは、レプリケートされた表のマスターとサブスクライバの間で一致している必要があります。これは実行時に確認されます。エラーが発生すると、RECEIVERスレッドは処理を停止します。

    • カスケード削除のツリーに含まれる表をレプリケートする場合は、ツリーに含まれるすべての表をレプリケートする必要があります。この制限は、レプリケーション・スキームを作成したとき、またはレプリケーション表のいずれかにON DELETE CASCADE付きの外部キーを追加したときにチェックされます。エラーが検出されると、処理は中断します。外部キー制約を変更する前に、まずレプリケーション・スキームを削除することが必要になる場合があります。

    • レプリケートされた表で外部キーの追加や削除を行う前に、レプリケーション・エージェントを停止する必要があります。

  • グローバル一時表のデータは現在の接続専用となり、ユーザー間で保護する必要はありません。このため、グローバル一時表にオブジェクト権限は必要ありません。

  • 表のエージング・ポリシーを定義した後に、エージング・ポリシーをLRUから時間ベースに、または時間ベースからLRUに変更できません。最初にエージングを削除し、表を変更して新しいエージング・ポリシーを追加する必要があります。

  • エージング・ポリシーは、エージング状態を変更するように定義する必要があります。

  • 時間ベースのエージング・ポリシーの場合、エージング列を追加または変更できません。これは、NOT NULL列を追加または変更できないためです。

  • 1つのシステムでLRUエージングと時間ベースのエージングの両方を組み合せて使用できます。LRUエージングのみを使用する場合、エージング・スレッドはデータベース全体に指定されたサイクルに基づいて起動します。一方、時間ベースのエージングのみを使用する場合、エージング・スレッドは最適な頻度に基づいて起動します。この頻度は、すべての表のCYCLE句に指定された値によって決定されます。LRUエージングと時間ベースのエージングの両方を使用する場合は、両方のタイプを組み合せて考慮した上でスレッドが起動します。

  • LRUエージングでは、行がアクセスされているかまたは参照されているかどうかを、次のルールで判断します。

    • SELECT文の結果セットを構築するために使用された行。

    • INSERT ... SELECT文の結果セットを構築するために使用された行。

    • 更新または削除対象の行。

  • コマンドで参照される表に対してLRUエージングの削除や追加を行うと、コンパイルされたコマンドは無効と指定され、再コンパイルが必要になります。

  • エージング状態にかかわらずエージング処理をすぐにスケジュールするには、ttAgingScheduleNowプロシージャをコールします。

  • エージングの制限:

    • LRUエージングと時間ベースのエージングは、マテリアライズド・ビューのディテール表ではサポートされていません。

    • LRUエージングと時間ベースのエージングは、グローバル一時表ではサポートされていません。

    • 時間ベースのエージングに使用されている列は削除できません。

    • エージング・ポリシーとエージング状態は、すべてのレプリケーション・サイトで同じである必要があります。

    • 外部キーによって関連付けられている表には、同じエージング・ポリシーを設定する必要があります。

    • LRUエージングでは、子行がエージングの対象でない場合、この子行とその親行は削除されません。ON DELETE CASCADEの設定は無視されます。

    • 時間ベースのエージングでは、親行がエージングの対象である場合、すべての子行が削除されます。ON DELETE CASCADEは、設定の有無にかかわらず無視されます。

表の列ベースの圧縮(TimesTen Classic)

データをより効率的に格納する列レベルで表を圧縮できます。これは、列での重複する値の冗長な格納を削除し、全表スキャンを実行するSQL問合せのパフォーマンスを向上させます。

表の圧縮される1つ以上の列(圧縮列グループと呼ばれる)を定義できます。各表に1つ以上の圧縮列グループを定義できます。

各圧縮列グループに対して、圧縮列グループのすべての個別値の列を含むディクショナリ表が作成されます。圧縮列グループには、ディクショナリ表の適切な値の行へのポインタが含まれます。このポインタの幅は、ディクショナリ表に対して定義した最大エントリ数に応じて、1、2または4バイトです。そのため、圧縮されている列グループ内の列の幅の合計が、1、2または4バイトのポインタの幅より広い場合、およびこれらの列値に多くの重複する値が存在する場合は、表で使用される領域を削減しました。

図6-1に、ディクショナリ表の適切な行を指している、表の圧縮列グループを示します。

図6-1 列ベースの圧縮

図6-1の説明を次に示します
「図6-1 列ベースの圧縮」の説明

ディクショナリ表には、各個別値へのポインタの列があります。ユーザーが圧縮列グループの個別エントリの最大数を構成すると、圧縮列グループのサイズが次のように設定されます。

  • エントリの最大数が255(28-1)の場合は1バイト。最大数が1から255の場合、ディクショナリのサイズは255(28-1)に設定され、圧縮列グループのポインタ列は1バイトになります。

  • エントリの最大数が65,535(216-1)の場合は2バイト。最大数が256から65,535の場合、ディクショナリのサイズは65,535(216-1)に設定され、圧縮列グループのポインタ列は2バイトになります。

  • エントリの最大数が4,294,967,295(232-1)の場合は4バイト。最大数が65,536から4,294,967,295の場合、ディクショナリのサイズは4,294,967,295(232-1)に設定され、圧縮列グループのポインタ列は4バイトになります。これがデフォルトです。

構文: 列ベースの圧縮(TimesTen Classic)

ColumnBasedCompressionの構文は、次のとおりです。

[COMPRESS (CompressColumns [,...])]

CompressColumnsの構文は次のとおりです。

{ColumnDefinition | (ColumnDefinition [,...])} BY DICTIONARY 
   [MAXVALUES = CompressMax]

パラメータ

ColumnBasedCompression構文には、次のパラメータがあります。

パラメータ 説明

COMPRESS (CompressColumns [,...])

圧縮が有効な表について圧縮列グループを定義します。表の1つ以上の列を含めることができます。ただし、1つの列は1つの圧縮列グループにのみ含めることができます。

圧縮列グループで複数の列を指定する場合、INLINE列のみがサポートされます。アウトライン列は、複数列圧縮グループに指定できません。

各圧縮列グループは、最大16列に制限されます。

BY DICTIONARY

各圧縮列グループの圧縮ディクショナリを定義します。

MAXVALUES = CompressMax

CompressMaxは、表の個別値の合計数であり、圧縮列グループ・ポインタ列のサイズを1、2または4バイトに設定し、ディクショナリ表のエントリの最大数のサイズを設定します。

ディクショナリ表の場合、NULLは1つの一意の値としてカウントされます。

CompressMaxは、1から429497295 (232-1)までの整数です。

MAXVALUES句を省略した場合の最大サイズのデフォルトは232-1であり、ポインタ列に4バイトが使用されます。値が232-1よりも大きい場合は、エラーがスローされます。

説明: 列ベースの圧縮(TimesTen Classic)

  • 圧縮列グループは、表の作成時に追加するか、ALTER TABLE文を使用して後で追加できます。ALTER TABLE文を使用して、圧縮列グループを削除できますが、グループ全体を削除する必要があります。

  • 表のすべての列および個別の圧縮列グループに存在する列に索引を作成できます。ただし、一意の列または単一列主キーに単一列圧縮グループを作成することはできません。すべての索引または主キーが同じ圧縮グループに存在する場合も、一意の索引または主キーを作成することはできません。

  • LOB列は圧縮できません。

  • レプリケートされた表、キャッシュ・グループ表またはグローバル一時表の列では、圧縮はサポートされません。CREATE TABLE AS SELECT文を使用し、その文でその表に対して列ベースの圧縮を定義すると、表を作成できません。

  • 圧縮が有効な表では、マテリアライズド・ビューを作成できません。

  • 列ベースの圧縮は、TimesTen Scaleoutではサポートされていません。

例: TimesTen Classic

範囲索引がpartnumberに対して作成されます(主キーであるため)。

Command> CREATE TABLE price
          (partnumber INTEGER NOT NULL PRIMARY KEY,
           vendornumber INTEGER NOT NULL,
           vendpartnum CHAR(20) NOT NULL,
           unitprice DECIMAL(10,2),
           deliverydays SMALLINT,
           discountqty SMALLINT);
Command> INDEXES price;
Indexes on table SAMPLEUSER.PRICE:
 PRICE: unique range index on columns:
    PARTNUMBER
  1 index found.
1 index found on 1 table.

ハッシュ索引は、主キーであるclubname列に作成されます。

CREATE TABLE recreation.clubs
(clubname CHAR(15) NOT NULL PRIMARY KEY,
 clubphone SMALLINT,
 activity CHAR(18))
UNIQUE HASH ON (clubname) PAGES = 30;

範囲索引は、membernameおよびclubの2つの列で作成されます(ともに主キーであるため)。

Command> CREATE TABLE recreation.members
          (membername CHAR(20) NOT NULL,
           club CHAR(15) NOT NULL,
           memberphone SMALLINT,
           PRIMARY KEY (membername, club));
Command> INDEXES recreation.members;
Indexes on table RECREATION.MEMBERS:
  MEMBERS: unique range index on columns:
    MEMBERNAME
    CLUB
  1 index found on 1 table.

recreation.events表にはハッシュ索引は作成されません。

CREATE TABLE recreation.events
(sponsorclub CHAR(15),
 event CHAR(30),
 coordinator CHAR(20),
 results VARBINARY(10000));

ハッシュ索引は、vendornumber列に作成されます。

CREATE TABLE purchasing.vendors
(vendornumber INTEGER NOT NULL PRIMARY KEY,
 vendorname CHAR(30) NOT NULL,
 contactname CHAR(30),
 phonenumber CHAR(15),
 vendorstreet CHAR(30) NOT NULL,
 vendorcity CHAR(20) NOT NULL,
 vendorstate CHAR(2) NOT NULL,
 vendorzipcode CHAR(10) NOT NULL,
 vendorremarks VARCHAR(60))
UNIQUE HASH ON (vendornumber) PAGES = 101;

ハッシュ索引は、membername列およびclub列で作成されます(ともに主キーであるため)。

CREATE TABLE recreation.members
    (membername CHAR(20) NOT NULL,
        club CHAR(15) NOT NULL,
        memberphone SMALLINT,
        PRIMARY KEY (membername, club))
    UNIQUE HASH ON (membername, club) PAGES = 100;

ハッシュ索引は、firstname列およびlastname列に作成されます(ともにauthors表の主キーであるため)。外部キーは、authors表の主キーを参照するbooks表のauthorfirstnameauthorlastname列に作成されます。

CREATE TABLE authors
    (firstname VARCHAR(255) NOT NULL,
        lastname VARCHAR(255) NOT NULL,
        description VARCHAR(2000),
        PRIMARY KEY (firstname, lastname))
    UNIQUE HASH ON (firstname, lastname) PAGES=20;
CREATE TABLE books
    (title VARCHAR(100),
    authorfirstname VARCHAR(255),
    authorlastname VARCHAR(255),
    price DECIMAL(5,2),
    FOREIGN KEY (authorfirstname, authorlastname) 
    REFERENCES authors(firstname, lastname));

次の文では、VARCHAR列のデフォルト文字を上書きし、1つのVARCHAR (10)列がNOT INLINEで、1つのVARCHAR (144)INLINEである表が作成されます。

CREATE TABLE t1
    (c1 VARCHAR(10) NOT INLINE NOT NULL,
    c2 VARCHAR(144) INLINE NOT NULL);

次の文では、本のタイトルのUNIQUE列を持つ表が作成されます。

CREATE TABLE books
    (title VARCHAR(100) UNIQUE,
        authorfirstname VARCHAR(255),
        authorlastname VARCHAR(255),
        price DECIMAL(5,2),
        FOREIGN KEY (authorfirstname, authorlastname)
        REFERENCES authors(firstname, lastname));

次の文では、列x1のデフォルト値が1で、列dのデフォルト値がSYSDATEである表が作成されます。

CREATE TABLE t1
    (x1 INT DEFAULT 1, d TIMESTAMP DEFAULT SYSDATE);

この例では、rangex表を作成し、主キーとしてcol1を定義します。デフォルトで範囲索引が作成されます。

Command> CREATE TABLE rangex (col1 TT_INTEGER PRIMARY KEY);
Command> INDEXES rangex;
Indexes on table SAMPLEUSER.RANGEX:
  RANGEX: unique range index on columns:
    COL1
  1 index found
1 index found on 1 table.

次の文は、HRスキーマの親表および子表におけるON DELETE CASCADE句の使用を示しています。外部キーを持つ表は、ON DELETE CASCADEが有効になるように変更されています。

ALTER TABLE countries
ADD CONSTRAINT countr_reg_fk
         FOREIGN KEY (region_id)
           REFERENCES regions(region_id) ON DELETE CASCADE;
ALTER TABLE locations
     ADD CONSTRAINT loc_c_id_fk
          FOREIGN KEY (country_id)
          	  REFERENCES countries(country_id) ON DELETE CASCADE;
ALTER TABLE departments
     ADD CONSTRAINT dept_loc_fk
         FOREIGN KEY (location_id)
           REFERENCES locations (location_id) ON DELETE CASCADE;
ALTER TABLE employees
     ADD CONSTRAINT     emp_dept_fk
         FOREIGN KEY (department_id)
           REFERENCES departments ON DELETE CASCADE;
ALTER TABLE employees
     ADD CONSTRAINT     emp_job_fk
         FOREIGN KEY (job_id)
           REFERENCES jobs (job_id);
ALTER TABLE job_history
     ADD CONSTRAINT     jhist_job_fk
         FOREIGN KEY (job_id)
           REFERENCES jobs;
ALTER TABLE job_history
     ADD CONSTRAINT     jhist_emp_fk
         FOREIGN KEY (employee_id)
           REFERENCES employees ON DELETE CASCADE;
ALTER TABLE job_history
     ADD CONSTRAINT     jhist_dept_fk
         FOREIGN KEY (department_id)
           REFERENCES departments ON DELETE CASCADE;
     ;

この例は、エージングにおいて、時間の単位がどのように機能するかを示しています。

存続時間が3 Daysの場合(単位はDay):

  • (SYSDATE - ColumnValue) <= 3の場合、エージ・アウトされません。

  • (SYSDATE - ColumnValue) > 3の場合、行はエージ・アウトの対象になります。

  • (SYSDATE - ColumnValue) = 3 days, 22 hoursの場合、存続期間を3 Daysに指定すると、行はエージ・アウトされません。存続期間が72 Hoursと指定されていた場合は、行はエージ・アウトされます。

この例では、LRUエージングを使用して表を作成します。エージング状態は、デフォルトでONになっています。

CREATE TABLE agingdemo
       (agingid NUMBER NOT NULL PRIMARY KEY,
        name  VARCHAR2 (20)
       )
       AGING LRU;
Command> DESCRIBE agingdemo;
Table USER.AGINGDEMO:
  Columns:
     *AGINGID NUMBER NOT NULL
     NAME VARCHAR2 (20) INLINE
     AGING LRU ON
1 table found.
(primary key columns are indicated with *)

この例では、時間ベースのエージングを使用する表を作成します。存続期間は3 Daysです。サイクルは指定されていないため、デフォルトで5分です。エージング状態はOFFです。

CREATE TABLE agingdemo2
       (agingid NUMBER NOT NULL PRIMARY KEY,
        name  VARCHAR2 (20),
        agingcolumn TIMESTAMP NOT NULL
        )
        AGING USE agingcolumn LIFETIME 3 DAYS OFF;
Command> DESCRIBE agingdemo2;
Table USER.AGINGDEMO2:
  Columns:
     *AGINGID NUMBER NOT NULL
     NAME VARCHAR2 (20) INLINE
     AGINGCOLUMN TIMESTAMP (6) NOT NULL
  Aging use AGINGCOLUMN lifetime 3 days cycle 5 minutes off
1 table found.
(primary key columns are indicated with *)

この例では、エラー・メッセージが生成されます。これは、エージング・ポリシーを一度作成すると、変更できないことを示しています。エージングを削除して、再定義する必要があります。

CREATE TABLE agingdemo2
        (agingid NUMBER NOT NULL PRIMARY KEY,
        name  VARCHAR2 (20),
        agingcolumn TIMESTAMP NOT NULL
        )
        AGING USE agingcolumn LIFETIME 3 DAYS OFF;
ALTER TABLE agingdemo2
        ADD AGING LRU;
 2980: Cannot add aging policy to a table with an existing aging policy. Have to
drop the old aging first
The command failed.
DROP aging on the table and redefine with LRU aging.
ALTER TABLE agingdemo2
        DROP AGING;
ALTER TABLE agingdemo2
        ADD AGING LRU;
Command> DESCRIBE agingdemo2;
Table USER.AGINGDEMO2:
  Columns:
   *AGINGID                         NUMBER NOT NULL
    NAME                            VARCHAR2 (20) INLINE
    AGINGCOLUMN                     TIMESTAMP (6) NOT NULL
  Aging lru on
1 table found.
(primary key columns are indicated with *)

時間ベースのエージングを指定して表を作成してみます。TT_DATEデータ型と3時間のLIFETIMEを指定してエージング列を定義します。LIFETIME単位はDAYSで指定する必要があるため、エラーが生成されます。

Command> CREATE TABLE aging1 (col1 TT_INTEGER PRIMARY KEY, 
         col2 TT_DATE NOT NULL) AGING USE col2 LIFETIME 3 HOURS;
 2977: Only DAY lifetime unit is allowed with a TT_DATE column
The command failed.

AS SelectQuery句を使用して、表empを作成します。employees表から、employee_idが100から105までのlast_nameを選択します。empに6行が挿入されたことが示されます。返される必要のある行を確認するために、最初にSELECT文を発行します。

Command> SELECT last_name FROM employees 
         WHERE employee_id BETWEEN 100 AND 105;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
< Austin >
6 rows found.
Command> CREATE TABLE emp AS SELECT last_name FROM employees
         WHERE employee_id BETWEEN 100 AND 105;
6 rows inserted.
Command> SELECT * FROM emp;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
< Austin >
6 rows found.

AS SelectQueryを使用して、表totalsalを作成します。salaryを合計して、結果をtotalsalaryに挿入します。SelectQuery式の別名sを定義します。

Command> CREATE TABLE totalsal AS SELECT SUM (salary) s FROM employees;
1 row inserted.
Command> SELECT * FROM totalsal;
< 691400 >
1 row found.

AS SelectQueryを使用して、commission_pct列で定義された表を作成します。デフォルト値を.3に設定します。最初に、commission_pct列がNUMBER (2,2)型であることを示すためにemployees表にDESCRIBEを実行します。c_pct表のcommission_pct列は、employees表のcommission_pct列からNUMBER (2,2)型を継承します。

Command> DESCRIBE employees;
Table SAMPLEUSER.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE UNIQUE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)

1 table found.
(primary key columns are indicated with *)
Command> CREATE TABLE c_pct (commission_pct DEFAULT .3) AS SELECT
         commission_pct FROM employees;
107 rows inserted.
Command> DESCRIBE c_pct;

Table SAMPLEUSER.C_PCT:
  Columns:
    COMMISSION_PCT                 NUMBER (2,2) DEFAULT .3

1 table found.
(primary key columns are indicated with *)

次の例では、job_idが圧縮されたemployees表を作成します。

Command> CREATE TABLE EMPLOYEES
          (EMPLOYEE_ID NUMBER (6) PRIMARY KEY, 
           FIRST_NAME VARCHAR2(20), 
           LAST_NAME VARCHAR2(25) NOT NULL, 
           EMAIL VARCHAR2(25) NOT NULL, 
           PHONE_NUMBER VARCHAR2(20),
           HIRE_DATE DATE NOT NULL, 
           JOB_ID VARCHAR2(10) NOT NULL, 
           SALARY NUMBER (8,2), 
           COMMISSION_PCT NUMBER (2,2), 
           MANAGER_ID NUMBER(6), 
           DEPARTMENT_ID NUMBER(4)) 
          COMPRESS (JOB_ID BY DICTIONARY);

Command> DESCRIBE EMPLOYEES;
 
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE NOT NULL
    EMAIL                           VARCHAR2 (25) INLINE NOT NULL
    PHONE_NUMBER                    VARCHAR2 (20) INLINE
    HIRE_DATE                       DATE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    SALARY                          NUMBER (8,2)
    COMMISSION_PCT                  NUMBER (2,2)
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
  COMPRESS ( JOB_ID BY DICTIONARY )
 
1 table found.
(primary key columns are indicated with *)

次の例では、ディクショナリ表に3つのサイズがあることを示します。エントリの最大数に指定した値は、次のサイズに丸められます。たとえば、役職IDの最大数として400を指定すると、最大で65535エントリのディクショナリ表が作成されます。デフォルトのサイズである232-1は、DESCRIBEの出力に表示されません。

Command> CREATE TABLE employees 
          (employee_id NUMBER(6) PRIMARY KEY, 
           first_name VARCHAR2(20), 
           last_name VARCHAR2(25), 
           email VARCHAR2(25) NOT NULL, 
           job_id VARCHAR2(10) NOT NULL, 
           manager_id NUMBER(6), 
           department_id NUMBER(4)) 
          COMPRESS (last_name BY DICTIONARY MAXVALUES=70000, 
             job_id BY DICTIONARY MAXVALUES=400, 
             department_id BY DICTIONARY MAXVALUES=100);

Command> DESCRIBE employees;
Table MYSCHEMA.EMPLOYEES:
  Columns:
   *EMPLOYEE_ID                     NUMBER (6) NOT NULL
    FIRST_NAME                      VARCHAR2 (20) INLINE
    LAST_NAME                       VARCHAR2 (25) INLINE
    EMAILS                          VARCHAR2 (25) INLINE NOT NULL
    JOB_ID                          VARCHAR2 (10) INLINE NOT NULL
    MANAGER_ID                      NUMBER (6)
    DEPARTMENT_ID                   NUMBER (4)
  COMPRESS ( LAST_NAME BY DICTIONARY,
             JOB_ID BY DICTIONARY MAXVALUES=65535,
             DEPARTMENT_ID BY DICTIONARY MAXVALUES=255 )
 
1 table found.
(primary key columns are indicated with *)

CREATE USER

CREATE USER文は、TimesTenデータベースでユーザーを作成します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE USER user IDENTIFIED BY {password | "password"}
  [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}] [PASSWORD EXPIRE]

または

CREATE USER user IDENTIFIED EXTERNALLY
  [PROFILE profile] [ACCOUNT {LOCK|UNLOCK}]

パラメータ

パラメータ 説明

user

ユーザーの名前。

IDENTIFIED BY {password | "password"}

内部ユーザーの識別句。内部ユーザーのパスワードを指定する必要があります。

指定できるパスワードは、ユーザーに割り当てられたプロファイルによって異なります。具体的には、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの値によって、パスワードの複雑さが決まります。この値がTT_VERIFY_FUNCTIONTT_STRONG_VERIFY_FUNCTIONまたはTT_STIG_VERIFY_FUNCTIONの場合、パスワードは特定のパスワード検証要件を満たしている必要があります。たとえば、この値がTT_VERIFY_FUNCTIONの場合は、パスワードにデータベースの名前を含めることはできません。詳細は、「パスワード複雑度チェッカの検証について」を参照してください。

IDENTIFIED EXTERNALLY

外部ユーザー(オペレーティング・システム・ユーザー)を識別します。外部ユーザーとしてデータベース操作を実行するには、外部ユーザー名がオペレーティング・システムまたはネットワークで認証されたユーザー名と一致する必要があります。ユーザーはログイン時にオペレーティング・システムで認証されているため、TimesTenではパスワードが要求されません。

PROFILE profile

PROFILE句を使用して、ユーザーに割り当てるプロファイルの名前を指定します(profileで指定)。このプロファイルによって、ユーザーのパスワード・パラメータの制限が設定されます。各パスワード・パラメータの詳細は、「CREATE PROFILE」を参照してください。PROFILE句を省略すると、TimesTenはユーザーにDEFAULTプロファイルを割り当てます。外部ユーザー(EXTERNALLYキーワードの指定で示される)を作成する場合は、PROFILE句を指定できますが、外部ユーザーにはパスワード・パラメータの効果がありません。また、外部ユーザーにPROFILE句を指定しなかった場合、TimesTenはユーザーにDEFAULTプロファイルを割り当てます(ただし、パスワード・パラメータの効果はありません)。

ACCOUNT [LOCK|UNLOCK]

ACCOUNT LOCKは、ユーザーのアカウントをロックして、データベースへの接続を禁止する場合に指定します。ACCOUNT UNLOCKは、ユーザーのアカウントのロックを解除して、データベースに接続できるようにする場合に指定します。デフォルトは、ACCOUNT UNLOCKです。

PASSWORD EXPIRE

PASSWORD EXPIREは、ユーザーのパスワードを期限切れにする場合に指定します。この設定により、ADMIN権限を持つユーザーは、データベースに接続する前にパスワードを変更するように強制されます。期限切れのパスワードを変更するには、ADMIN権限を持つユーザーが、IDENTIFIED BY句を含むALTER USER文を使用して、パスワードを変更する必要があります。パスワードが変更されると、ユーザーはデータベースに新しいパスワードでログインできます。新しく作成したユーザーにADMIN権限が付与されていても、新しく作成したユーザーはデータベースにログインできないため、最初はパスワードを変更できない点に注意してください。詳細は、「ALTER USER」を参照してください。この句は、外部で識別されるユーザー(IDENTIFIED EXTERNALLY句で示される)には無効です。

説明

  • データベース・ユーザーには、内部ユーザーまたは外部ユーザーを指定できます。

    • 内部ユーザーは、TimesTenデータベース用に定義されるユーザーです。

    • 外部ユーザーは、オペレーティング・システムで定義されています。外部ユーザーにTimesTenパスワードを割り当てることはできません。

  • パスワードの要件:
    • 30文字を超えることはできません。
    • 大文字と小文字が区別されます。
    • 先頭に文字を使用する必要があります。パスワードを二重引用符で囲まないかぎり、パスワードの先頭を数字または特殊文字にすることはできません。
    • 特殊文字を使用する場合は、パスワードを二重引用符で囲む必要があります。例外は、#@の特殊文字です。#または@の特殊文字を含むパスワードは、二重引用符で囲む必要がありません。
    • セミコロン(;)や二重引用符(")を含めることはできません。
  • ユーザーを作成すると、ユーザーにはPUBLICに付与されている権限が付与され、その他の権限は付与されません。

  • PROFILE句は、ユーザーにプロファイルを割り当てる場合に使用します。内部ユーザーにプロファイルを割り当てた場合、そのユーザーはプロファイルで指定された制限を超えることはできません。内部ユーザーにプロファイルを割り当てない場合は、そのユーザーにDEFAULTプロファイルが割り当てられます。詳細は、「CREATE PROFILE」を参照してください。

  • ACCOUNT LOCKまたはACCOUNT UNLOCKは、ユーザー・アカウントをロックまたはロック解除する場合に使用します。

  • PASSWORD EXPIRE句は、データベースに接続する前に、ユーザーのパスワードを期限切れにして、パスワードの変更を強制するために使用します。

  • 接続がTLSで暗号化されている場合は、クライアント/サーバー接続でユーザーを作成できます。詳細は、『Oracle TimesTen In-Memory Databaseセキュリティ・ガイド』TimesTen Client/ServerのTransport Layer Securityに関する項を参照してください。

  • TimesTenでは、ユーザーbradはユーザー"brad"と同じになります。いずれの場合も、ユーザーの名前はBRADと作成されます。

  • ユーザー名は、TT_CHARデータ型です。

  • この文はレプリケートされます。

ユーザーの作成およびパスワード検証の確認

この例では、user_pw1ユーザーを作成しますが、user1_pwユーザーにはプロファイルを割り当てません。このユーザーは、DEFAULTプロファイルの制限の対象になります。DEFAULTプロファイルでは、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータがNULLに設定されています。そのため、このユーザーのパスワードにはパスワード検証が実行されません。その後で、DEFAULTプロファイルを変更して、PASSWORD_COMPLEXITY_CHECKERの値をTT_VERIFY_FUNCTIONに変更します。user1_p1ユーザーは、それまでと同じように元のパスワードを使用してデータベースに接続できます。パスワード検証は、新しく作成したユーザーにのみ実行されます。

Command> CREATE USER user_pw1 IDENTIFIED BY user1_pw1;

User created.
dba_profilesシステム・ビューを問い合せることで、DEFAULTプロファイルのパスワード・パラメータの制限を確認します。PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータの値は、NULLになっています。
Command> SELECT * FROM dba_profiles WHERE profile = 'DEFAULT';
< DEFAULT, FAILED_LOGIN_ATTEMPTS, PASSWORD, 10 >
< DEFAULT, PASSWORD_LIFE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_REUSE_MAX, PASSWORD, UNLIMITED >
< DEFAULT, PASSWORD_COMPLEXITY_CHECKER, PASSWORD, NULL >
< DEFAULT, PASSWORD_LOCK_TIME, PASSWORD, .0034 >
< DEFAULT, PASSWORD_GRACE_TIME, PASSWORD, UNLIMITED >
< DEFAULT, TEMP_SPACE_PER_SESSION_MAX, MEMORY, UNLIMITED >
8 rows found.
DEFAULTプロファイルを変更して、PASSWORD_COMPLEXITY_CHECKERパラメータの値をTT_VERIFY_FUNCTIONに変更します。user_pw1ユーザーとして、データベースに接続してみます。パスワード検証は新しく作成したパスワードにのみ実行されるため、接続は成功します。
Command> ALTER PROFILE "DEFAULT" LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_VERIFY_FUNCTION;

Profile altered.

Command> connect adding "UID=user_pw1;PWD=user_pw1" as user1;
Connection successful: DSN=access1;UID=user_pw1;
DataStore=/scratch/user1/mydatabase1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)
user_pw2ユーザーを作成して、パスワードにuser_pw2を指定します。CREATE USER文は失敗します。user_pw2のパスワードは新しく作成したパスワードであるため、パスワード検証が実行されます。TT_VERIFY_FUNCTION関数の要件を満たしているパスワードを指定して、user_pw2ユーザーを再度作成します。CREATE USER文は正常に実行され、ユーザーが作成されます。TT_VERIFY_FUNCTION関数の詳細は、「TT_VERIFY_FUNCTION」を参照してください。
Command> CREATE USER user_pw2 IDENTIFIED BY user_pw2;
15186: Password complexity check for the specified password failed
15188: TT-20002: Password contains the username
The command failed.

Command> CREATE USER user_pw2 IDENTIFIED BY abc75#n4;

User created.

TT_STRONG_VERIFY_FUNCTIONのパスワード要件があるユーザーの作成

次の例では、TT_STRONG_VERIFY_FUNCTION関数のパスワード検証要件について説明します。profile_pw3プロファイルを作成して、PASSWORD_COMPLEXITY_CHECKERパスワード・パラメータにTT_STRONG_VERIFY_FUNCTIONの値を指定します。user_pw3ユーザーを作成して、このユーザーにprofile_pw3プロファイルを割り当てます。異なるパスワードを試してみて、パスワードがTT_STRONG_VERIFY_FUNCTION関数の要件を満たしていることを確認します。パスワードが要件を満たしている場合は、CREATE USER文が成功して、ユーザーが作成されます。TT_STRONG_VERIFY_FUNCTION関数の詳細は、「TT_STRONG_VERIFY_FUNCTION」を参照してください。
Command> CREATE PROFILE profile_pw3 LIMIT 
           PASSWORD_COMPLEXITY_CHECKER TT_STRONG_VERIFY_FUNCTION;

Profile created.
user_pw3ユーザーを作成して、様々なパスワードを試してみます。特殊文字(#@を除く)は、二重引用符で囲む必要があることに注意してください。
Command> CREATE USER user_pw3 IDENTIFIED BY abcABC1# 
           PROFILE profile_pw3;
15186: Password complexity check for the specified password failed
15188: TT-20001: Password length less than 9
The command failed.

Command> CREATE USER user_pw3 IDENTIFIED BY abcABCD1# 
           PROFILE profile_pw3;
15186: Password complexity check for the specified password failed
15188: TT-20001: Password must contain at least 2 digit(s)
The command failed.

Command> CREATE USER user_pw3 IDENTIFIED BY abcABCD11# 
           PROFILE profile_pw3;
15186: Password complexity check for the specified password failed
15188: TT-20001: Password must contain at least 2 special character(s)
The command failed.

Command> CREATE USER user_pw3 IDENTIFIED BY "!abcABCD11#" 
           PROFILE profile_pw3;

User created.

プロファイルを割り当てるユーザーの作成

この例では、user1ユーザーを作成して、そのユーザーにprofile1プロファイルを割り当てます。

Command> CREATE USER user1 IDENTIFIED BY user1 PROFILE profile1;
 
User created.

プロファイルを割り当てないユーザーの作成

この例では、user2ユーザーを作成して、プロファイルを割り当てません。user2ユーザーには、DEFAULTプロファイルのパスワード・パラメータの値が割り当てられます。

Command> CREATE USER user2 identified by user2;
 
User created.

dba_usersシステム・ビューを問い合せて、user2ユーザーにDEFAULTプロファイルが割り当てられていることを確認します。

Command> SELECT profile FROM dba_users WHERE username='USER2';
< DEFAULT >
1 row found.

ユーザーの作成とユーザー・アカウントのロック

この例では、user3ユーザーを作成して、user3アカウントをロックします。user3アカウントは、user3ユーザーがデータベースに接続する前に、ADMIN権限を持つユーザーがロック解除しておく必要があります。

Command> CREATE USER user3 IDENTIFIED BY user3 ACCOUNT LOCK;
 
User created.

user3CONNECT権限を付与します。

Command> GRANT CONNECT TO user3;

user3として、データベースに接続してみます。user3アカウントはロックされているため、接続に失敗します。

Command> connect adding "UID=user3;PWD=user3" as user3;
15179: the account is locked
The command failed.

インスタンス管理者としてデータベースに再接続し、ALTER USER文を使用してuser3アカウントのロックを解除します。

none: Command> use database1
database1: Command> ALTER USER user3 ACCOUNT UNLOCK;
 
User altered.

データベースに、user3ユーザーとして接続してみます。接続が成功します。

database1: Command> connect adding "UID=user3;PWD=user3" as user3;
Connection successful: DSN=database1;UID=user3;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

ユーザー・アカウントのロックとパスワードの変更の強制

この例では、user4ユーザーを作成します。user4ユーザーには、profile1プロファイルを割り当てます。user4アカウントをロックして、user4ユーザーがデータベースに接続する前にuser4のパスワードの変更が必要になるようにします。

Command> CREATE USER user4 identified by user4 PROFILE profile1 
         ACCOUNT LOCK PASSWORD EXPIRE;
 
User created.

user4として、データベースに接続してみます。user4アカウントをロックして、user4ユーザーがデータベースに接続する前にパスワードの変更が必要になるようにします。

Command>  connect adding "UID=user4;PWD=user4" as user4;
15179: the account is locked
The command failed.

インスタンス管理者としてデータベースに再接続し、ALTER USER文を使用してuser4アカウントのロックを解除します。

none: Command> use database1
database1: Command> ALTER USER user4 ACCOUNT UNLOCK;
 
User altered.

user4CONNECT権限を付与します。その次に、user4の期限切れのパスワードを変更します。(この例では、パスワードを太字で示したuser4_changedに変更します)。

database1: Command> GRANT CONNECT TO user4;
database1: Command> ALTER USER user4 IDENTIFIED BY user4_changed;
 
User altered.

user4ユーザーとして、データベースに接続してみます。接続が成功します。アカウントのロックが解除され、パスワードが変更されています。

database1: Command> connect adding "UID=user4;PWD=user4_changed" as user4;
Connection successful: DSN=database1;UID=user4;DataStore=/scratch/database1;
DatabaseCharacterSet=AL32UTF8;ConnectionCharacterSet=AL32UTF8;PermSize=128;
(Default setting AutoCommit=1)

外部ユーザーの作成

この例では、外部ユーザーとしてuser5ユーザーを作成します。

Command> CREATE USER user5 IDENTIFIED EXTERNALLY;
 
User created.

CREATE VIEW

CREATE VIEW文は、SelectQuery句で指定された表に対するビューを作成します。ビューとは、1つ以上のディテール表に基づいた論理表のことです。ビュー自体にデータは含まれていません。ビューは、ディテール表からすでに計算されたデータを含むマテリアライズド・ビューと区別するために、非マテリアライズド・ビューと呼ばれることがあります。

アクティブ・スタンバイ・ペアのレプリケートされた環境で、DDL_REPLICATION_LEVELが3以上の場合にアクティブ・データベースでCREATE VIEWを実行すると、ビューはレプリケーション・スキームのすべてのデータベースにレプリケートされます。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

必要な権限

文を実行するユーザーには、CREATE VIEW権限(所有者の場合)または別のユーザーのビューの場合はCREATE ANY VIEW(非所有者の場合)が必要です。

ビューの所有者には、ディテール表に対するSELECT権限が必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

CREATE VIEW [Owner.]ViewName AS SelectQuery

パラメータ

パラメータ 説明

[Owner.]ViewName

ビューの名前

SelectQuery

ビューで使用される、ディテール表の列を選択します。

ビューに対して索引を作成することもできます。

SELECT問合せの制限

ビューの定義に使用される問合せには、いくつかの制限があります。

  • ビュー定義のSELECT *問合せは、ビューの作成時に実行されます。ビューが作成された後に追加された列は、ビューに反映されません。

  • 次のものはビューの作成に使用するSELECT文で使用しないでください。

    • FIRST

    • ORDER BY

      使用した場合は、CREATE VIEWで無視されます。結果はソートされません。

    • 引数

  • SELECT構文のリストの各式には、一意の名前が必要です。列の別名が定義されていないかぎり、単純にその列の名前が使用されます。ROWIDは式とみなされるため、別名が必要です。

  • ビューを作成する場合にSELECT FOR UPDATEを使用しないでください。

  • 特定のTimesTen問合せ制限は、非マテリアライズド・ビューの作成時に確認されません。これらの制限に違反しているビューの作成が可能な場合がありますが、その後、実行した文でこのビューが参照されると、エラーが戻されます。

  • ビューがSELECT文のFROM句で参照されると、ビューの名前は、その定義によって解析時に導出表に置き換えられます。ビューのすべての句を元のSELECT問合せの同じ句にマージして、導出表なしでサポートされている問合せを形成できない場合、この導出表の内容が実体化されます。たとえば、ビューと参照元のSELECTで集計が指定されている場合は、その結果が選択の他の表に結合される前に、ビューがマテリアライズされます。

  • ビューを削除するには、DROP VIEW文を使用します。

  • ビューの変更にALTER TABLE文を使用することはできません。

  • ビューの参照は、ディテール表が削除または変更されているために失敗することがあります。

employees表から非マテリアライズド・ビューを作成します。

Command> CREATE VIEW v1 AS SELECT employee_id, email FROM employees;
Command> SELECT FIRST 5 * FROM v1;
< 100, SKING >
< 101, NKOCHHAR >
< 102, LDEHAAN >
< 103, AHUNOLD >
< 104, BERNST >
5 rows found.

t1の集計問合せから、列max1を持つ非マテリアライズド・ビューtviewを作成します。

CREATE VIEW tview (max1) AS SELECT MAX(x1) FROM t1;

DELETE

DELETE文は、表から行を削除します。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合は表に対するDELETEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DELETE [hint] [FIRST NumRows] FROM [Owner.]TableName [CorrelationName] 
[WHERE SearchCondition]
[RETURNING|RETURN Expression[,...]INTO DataItem[,...]]

パラメータ

パラメータ 説明

hint

DELETE文に文レベルのオプティマイザ・ヒントを指定します。オプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

FIRST NumRows

削除する行の数を指定します。FIRST NumRowsは、副問合せの文ではサポートされていません。NumRowsには、正のINTEGERか動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

[Owner.]TableName [CorrelationName]

検索条件を満たす行を削除する表を指定します。

[Owner.]TableNameは、削除する表を識別します。

CorrelationNameは、直前で指定した表の別名を指定します。相関名を使用して、DELETE文の他の場所で表を参照します。CorrelationNameの有効範囲は、それが使用されているSQL文です。基本名の構文ルールを満たしている必要があります。詳細は、「基本名」を参照してください。

SearchCondition

削除する行を指定します。検索条件に一致する行がない場合、表は変更されません。WHERE句を省略した場合は、すべての行が削除されます。検索条件には副問合せを含めることができます。

Expression

有効な式の構文。詳細は、「式」を参照してください。

DataItem

取得したExpression値を格納するホスト変数またはPL/SQL変数。

説明

  • 表の行をすべて削除した場合、表は空になりますが、DROP TABLE文を実行しないかぎり、表自体は削除されません。

  • 表にアウトライン列があり、削除する数百万の行がある場合、ttCompact組込みプロシージャを呼び出してメモリーを解放することを検討してください。

  • 外部キー制約に違反するDELETE処理はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。

  • DELETE文によって報告される行の総数には、ON DELETE CASCADEアクションの結果、子表から削除された行は含まれません。

  • 子表の外部キー制約でON DELETE CASCADEを指定している場合、ユーザーは、子表のDELETE権限を明示的に必要とせずに、DELETE権限を持つ親表から行を削除できます。

  • RETURNING句の制限:

    • Expressionは単純な式である必要があります。集計関数はサポートされません。

    • 順序番号はOUTパラメータに戻せません。

    • ROWNUMおよび副問合せは、RETURNING句では使用できません。

    • RETURNING句のパラメータは、DELETE文のいずれの場所とも重複できません。

    • RETURNING句を使用して複数行を戻すには、PL/SQL BULK COLLECT機能が必要です。BULK COLLECTの詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』FORALLおよびBULK COLLECT操作に関する項を参照してください。

    • PL/SQLでは、RETURNING句はWHERE CURRENT処理と一緒には使用できません。

発注件数が50未満の行をすべて削除します。

DELETE FROM purchasing.orderitems
WHERE quantity < 50;

idが主キーでない場合、次の問合せはすべての重複する注文を削除します。

DELETE FROM orders a
WHERE EXISTS (SELECT 1 FROM orders b
WHERE a.id = b.id and a.rowid < b.rowid);

次の順序で文を指定すると、外部キー違反が発生します。

CREATE TABLE master (name CHAR(30), id CHAR(4) NOT NULL PRIMARY KEY);
CREATE TABLE details
  (masterid CHAR(4),description VARCHAR(200), 
   FOREIGN KEY (masterid) REFERENCES master(id));
INSERT INTO master('Elephant', '0001');
INSERT INTO details('0001', 'A VERY BIG ANIMAL');
DELETE FROM master WHERE id = '0001';

ビジーな表を削除しようとするとエラーが発生します。この例では、t1はビジーな表であり、親表とそれに基づく外部キー制約となっています。

CREATE TABLE t1 (a INT NOT NULL, b INT NOT NULL,
       PRIMARY KEY (a));
CREATE TABLE t2 (c INT NOT NULL, 
       FOREIGN KEY (c) REFERENCES t1(a));
INSERT INTO t1 VALUES (1,1);
INSERT INTO t2 VALUES (1);
DELETE FROM t1;

次のエラーが返されます。

SQL ERROR (3001):  Foreign key violation [TTFOREIGN_0] a row in child table T2 
has a parent in the delete range.

employeesから従業員を削除します。empidおよびnameemployee_idおよびlast_nameと同じデータ型の変数として宣言します。行を削除し、employee_idおよびlast_nameを変数内に戻します。正しい行が削除されたことを確認します。

Command> VARIABLE empid NUMBER(6) NOT NULL;
Command> VARIABLE name VARCHAR2(25) INLINE NOT NULL;
Command> DELETE FROM employees WHERE last_name='Ernst'
           RETURNING employee_id, last_name INTO :empid,:name;
1 row deleted.
Command> PRINT empid name;
EMPID                : 104
NAME                 : Ernst

DROPACTIVE STANDBY PAIR

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

この文は、アクティブ・スタンバイ・ペア・レプリケーション・スキームを削除します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

DROP ACTIVE STANDBY PAIR

パラメータ

DROP ACTIVE STANDBY PAIRに、パラメータはありません。

説明

アクティブ・スタンバイ・ペアは削除されますが、表、キャッシュ・グループ、マテリアライズド・ビューなどのすべてのオブジェクトは、文が発行されたデータベースにまだ存在しています。

TimesTenでOracle Clusterwareを使用する場合は、DROP ACTIVE STANDBY PAIR文は実行できません。

DROP CACHE GROUP

この文はTimesTen Scaleoutでサポートされています。

TimesTen Classicの場合:

DROP CACHE GROUP文は、キャッシュ・グループに関連付けられている表を削除して、CACHE_GROUPシステム表からキャッシュ・グループの定義を削除します。

必要な権限

キャッシュ・グループの所有者に必要な権限はありません。

キャッシュ・グループの所有者でない場合は、DROP ANY CACHE GROUP

キャッシュ・グループの少なくとも1つの表が現在のユーザーによって所有されていない場合は、DROP ANY TABLEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

DROP CACHE GROUP [Owner.]GroupName

パラメータ

パラメータ 説明

[Owner.]GroupName

削除されるキャッシュ・グループの名前です。

説明

  • 使用中のキャッシュ・グループ表を削除しようとすると、エラーが返されます。

  • ASYNCHRONOUS WRITETHROUGHキャッシュ・グループは、レプリケーション・エージェントの実行中には削除できません。

  • 読取り専用キャッシュ・グループおよびAUTOREFRESH属性を持つキャッシュ・グループに対して自動的にインストールされるOracle Databaseオブジェクトは、キャッシュ・エージェントによってアンインストールされます。DROP CACHE GROUP操作時にキャッシュ・エージェントが実行中でない場合、Oracle Databaseオブジェクトは、キャッシュ・エージェントの次の起動時にアンインストールされます。

  • DROP CACHE GROUP文はシリアライズ可能分離レベルでは実行できません。実行しようとするとエラー・メッセージが返されます。

  • DROP CACHE GROUP文を実行し、現在実行中の自動リフレッシュ操作がある場合、次のような結果になります。

    • LockWaitの間隔が0の場合、DROP CACHE GROUP文はロックのタイムアウト・エラーで失敗します。

    • LockWaitの間隔が0以外の場合、現在のトランザクションは自動リフレッシュされず(ロールバックされ)、DROP文の処理が続行されます。これは、同じ自動リフレッシュ間隔を持つすべてのキャッシュ・グループに影響します。

DROP CACHE GROUP westerncustomers;

DROP FUNCTION

DROP FUNCTION文は、データベースからスタンドアロンのストアド・ファンクションを削除します。この文を使用してパッケージに含まれるファンクションを削除しないでください。

必要な権限

ファンクションの所有者に必要な権限はありません。

別のユーザーのファンクションの場合はDROP ANY PROCEDUREが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP FUNCTION [Owner.]FunctionName

パラメータ

パラメータ 説明

[Owner.]FunctionName

削除するファンクションの名前です。

説明

  • ファンクションを削除すると、削除されたファンクションに依存するオブジェクトは無効になります。その後、それらのいずれかのオブジェクトを参照すると、TimesTenではオブジェクトの再コンパイルが試行され、削除したファンクションを再作成していない場合、エラー・メッセージが返されます。

  • この文を使用してパッケージに含まれるファンクションを削除しないでください。パッケージを削除するか、またはOR REPLACE句を含むCREATE PACKAGE文を使用して、ファンクションを含まないパッケージを再定義します。

  • DROP FUNCTION文を使用するには、データベースでPL/SQLを有効にしておく必要があります。データベースでPL/SQLを有効にしていない場合、エラーがスローされます。

次の文は、ファンクションmyfuncを削除し、myfuncに依存するすべてのオブジェクトを無効にします。

Command> DROP FUNCTION myfunc;
 
Function dropped.

データベースでPL/SQLが無効になっている場合、TimesTenによって次のエラーが返されます。

Command> DROP FUNCTION myfunc;
 8501: PL/SQL feature not installed in this TimesTen database
The command failed.

関連項目

CREATE FUNCTION

DROP INDEX

DROP INDEX文は、指定した索引を削除します。索引はグローバル(TimesTen Scaleout)またはローカル(TimesTen ScaleoutまたはTimesTen Classic)を指定できます。

必要な権限

索引の所有者に必要な権限はありません。別のユーザーが所有する索引の場合には、DROP ANY INDEXが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。DROP INDEX文は、グローバル索引とローカル索引の両方を削除するために使用します。

SQL構文

DROP INDEX [Owner.]IndexName [FROM [Owner.]TableName]

パラメータ

パラメータ 説明

[Owner.]IndexName

削除する索引の名前です。その索引に対応する表の所有者名を指定できます。TimesTen Scaleoutの場合、索引はグローバルまたはローカルを指定できます。

[Owner.]TableName

索引を作成した表の名前です。

説明

  • ビジーな索引(使用中の索引、または外部キーを適用する索引)を削除しようとすると、エラーが発生します。外部キーを削除して、関連付けられた索引を削除するには、ALTER TABLE文を使用します。

  • 索引がUNIQUE列の制約で作成された場合は、その索引は制約を削除することでのみ削除できます。そのためには、ALTER TABLE DROP UNIQUE文を使用します。UNIQUE列の制約の詳細は、「CREATE TABLE」も参照してください。

  • コミットされていないトランザクションでのDROP INDEX操作がアクティブな(またはアクティブだった)場合、その索引にアクセスしないDML操作を実行している他のトランザクションはブロックされます。

  • 索引を削除した場合、その索引を使用する準備された文は、次にその文を実行する際に自動的に再準備されます。

  • 表名を指定しない場合、指定した所有者または暗黙的な所有者の索引名は一意である必要があります。

  • 索引の所有者を指定せずに表を指定した場合、表の所有者がデフォルトの所有者となります。

  • 表が指定されており、表の所有者が指定されていない場合は、現在のユーザーがデフォルトの表の所有者になります。

  • 表と索引の所有者は、同じである必要があります。

  • 他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表から索引を削除することはできません。

  • 索引がアクティブ・スタンバイ・ペア間でレプリケートされるときに、DDL_REPLICATION_LEVELが2以上の場合は、DROP INDEX文を使用して、レプリケーション・スキームのアクティブ・スタンバイ・ペアから索引を削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

次のいずれかの文を使用して、orderitems表で定義した索引partsorderedindexを削除します。

DROP INDEX partsorderedindex
   FROM purchasing.orderitems;

または

DROP INDEX purchasing.partsorderedindex;

関連項目

CREATE INDEX

DROP MATERIALIZED VIEW

DROP MATERIALIZED VIEW文は、指定されたマテリアライズド・ビューを、それに関連付けられたハッシュ索引および範囲索引とともに削除します。

必要な権限

ビューの所有者であるか、またはDROP ANY MATERIALIZED VIEW (非所有者の場合)および

表の所有者であるか、またはDROP ANY TABLE(非所有者の場合)および

ビューに索引がある場合は、索引の所有者であるか、またはDROP ANY INDEX(非所有者の場合)。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP MATERIALIZED VIEW [Owner.]ViewName

パラメータ

パラメータ 説明

[Owner.]ViewName

削除するマテリアライズド・ビューを指定します。

説明

DROP MATERIALIZED VIEW操作を実行すると、ディテール表が更新されてロックされます。ディテール表がすでに別のトランザクションによってロックされている場合は、エラーが発生することがあります。

次の文では、custorderマテリアライズド・ビューが削除されます。

DROP MATERIALIZED VIEW custorder;

DROP PACKAGE [BODY]

DROP PACKAGE文は、データベースからストアド・パッケージを削除します。仕様と本体の両方を削除します。DROP PACKAGE BODYは、パッケージの本体のみを削除します。

必要な権限

パッケージの所有者に必要な権限はありません。

別のユーザーのパッケージの場合はDROP ANY PROCEDUREが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP PACKAGE [BODY] [Owner.]PackageName

パラメータ

パラメータ 説明

PACKAGE [BODY]

BODYを指定すると、パッケージ本体のみを削除できます。パッケージの仕様と本体の両方を削除するには、BODYを省略します。

[Owner.]PackageName

削除するパッケージの名前です。

説明

  • パッケージの本体のみを削除した場合、依存するオブジェクトは無効になりません。ただし、パッケージ仕様で宣言されたいずれかのプロシージャまたはストアド・ファンクションは、パッケージ本体を再作成するまで実行できません。

  • パッケージ仕様に依存するオブジェクトはすべて無効になります。その後、それらのいずれかのオブジェクトを参照すると、TimesTenではオブジェクトの再コンパイルが試行され、削除したパッケージを再作成していない場合、エラーが戻されます。

  • この文を使用してパッケージから単一のオブジェクトを削除しないでください。かわりに、OR REPLACE句を含むCREATE PACKAGE文およびCREATE PACKAGE BODY文を使用して、オブジェクトを含まないパッケージを再作成します。

  • DROP PACKAGE [BODY]文を使用するには、データベースでPL/SQLを有効にしておく必要があります。データベースでPL/SQLを有効にしていない場合、エラーが返されます。

次の文は、パッケージsamplePackageの本体を削除します。

Command> DROP PACKAGE BODY SamplePackage;
Package body dropped.

パッケージsamplePackageの仕様と本体の両方を削除するには、次の文を使用します。

Command> DROP PACKAGE samplepackage;
Package dropped.

関連項目

CREATE PACKAGE

DROP PROCEDURE

DROP PROCEDURE文は、データベースからスタンドアロンのストアド・プロシージャを削除します。この文を使用してパッケージに含まれるプロシージャを削除しないでください。

必要な権限

プロシージャの所有者に必要な権限はありません。

別のユーザーのプロシージャの場合はDROP ANY PROCEDUREが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP PROCEDURE [Owner.]ProcedureName

パラメータ

パラメータ 説明

[Owner.]ProcedureName

削除するプロシージャの名前です。

説明

  • プロシージャを削除すると、削除されたプロシージャに依存するオブジェクトは無効になります。その後、それらのいずれかのオブジェクトを参照すると、TimesTenではオブジェクトの再コンパイルが試行され、削除したプロシージャを再作成していない場合、エラー・メッセージが返されます。

  • この文を使用してパッケージに含まれるプロシージャを削除しないでください。パッケージを削除するか、またはOR REPLACE句を含むCREATE PACKAGE文を使用して、プロシージャを含まないパッケージを再定義します。

  • DROP PROCEDURE文を使用するには、データベースでPL/SQLを有効にしておく必要があります。データベースでPL/SQLを有効にしていない場合、エラーがスローされます。

次の文は、プロシージャmyprocを削除し、myprocに依存するすべてのオブジェクトを無効にします。

Command> DROP PROCEDURE myproc;
Procedure dropped.

データベースでPL/SQLが無効になっている場合、TimesTenによって次のエラーが返されます。

Command> DROP PROCEDURE myproc;
 
 8501: PL/SQL feature not installed in this TimesTen databaseThe command failed.

関連項目

CREATE PROCEDURE

DROP PROFILE

DROP PROFILE文では、データベースからユーザーを削除します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP PROFILE profile [CASCADE]

パラメータ

パラメータ 説明

profile

削除するプロファイルの名前です。

CASCADE

CASCADEは、プロファイルが割り当てられているユーザーからプロファイルの割当てを解除する場合に指定します。TimesTenは、このようなユーザーにDEFAULTプロファイルを再割当てします。現在ユーザーに割り当てられているプロファイルを削除するには、CASCADEを指定する必要があります。

説明

  • この文は、既存のプロファイルを削除する場合に使用します。DEFAULTプロファイルは削除できません。DEFAULTプロファイルの詳細は、「CREATE PROFILE」を参照してください。

  • 現在ユーザーに割り当てられていないプロファイルを作成する場合は、プロファイルを削除するためのCASCADEを指定する必要はありません。ただし、プロファイルが現在ユーザーに割り当てられている場合は、CASCADEを指定して、そのプロファイルを削除する必要があります。

この例では、test_profileプロファイルとtest_profile_assign_to_userプロファイルを作成します。その後、test_userユーザーを作成して、そのユーザーにtest_profile_assign_to_userプロファイルを割り当てます。この例では、test_profileプロファイルを削除してみます。このプロファイルにはユーザーが割り当てられていないため、操作は成功します。その次に、test_profile_assign_to_userプロファイル削除してみます。CASCADEが指定されている場合、操作は成功します。test_profile_assign_to_userプロファイルが削除されると、test_userユーザーにはDEFAULTプロファイルが割り当てられます。

  1. test_profileプロファイルを作成します。FAILED_LOGIN_ATTEMPTS5の値に設定します。

    Command> CREATE PROFILE test_profile LIMIT FAILED_LOGIN_ATTEMPTS 5;
     
    Profile created.
    
  2. test_profile_assign_to_userプロファイルを作成します。FAILED_LOGIN_ATTEMPTS3の値に設定します。

    Command> CREATE PROFILE test_profile_assign_to_user 
             LIMIT FAILED_LOGIN_ATTEMPTS 3;
     
    Profile created.
    
  3. test_userユーザーを作成して、このユーザーにtest_profile_assign_to_userプロファイルを割り当てます。

    Command> CREATE USER test_user identified by test_user_pwd 
             PROFILE test_profile_assign_to_user;
     
    User created.
    
  4. test_profileプロファイルを削除します。DROP PROFILE操作は成功します。このtest_profileプロファイルが割り当てられたユーザーは存在しません。

    Command> DROP PROFILE test_profile;
     
    Profile dropped.
    
  5. test_profile_assign_to_userプロファイル削除してみます。DROP PROFILE操作は失敗します。このプロファイルが割り当てられているユーザーが存在します。DROP PROFILE操作を再度繰り返しますが、今回はCASCADEを指定します。DROP PROFILE操作は成功します。

    Command> DROP PROFILE test_profile_assign_to_user;
    15178: Profile TEST_PROFILE_ASSIGN_TO_USER has users assigned, cannot drop without CASCADE
    The command failed.
    
    Command> DROP PROFILE test_profile_assign_to_user CASCADE;
     
    Profile dropped.
    
  6. DBA_USERSシステム・ビューを問い合せて、test_userユーザーにDEFAULTプロファイルが割り当てられていることを確認します。

    Command> SELECT profile FROM dba_users WHERE username = 'TEST_USER';
     
    PROFILE
    < DEFAULT >
    1 row found.

DROP REPLICATION

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

DROP REPLICATION文は、クラシック・レプリケーション・スキームを破棄して、実行中のデータベースから削除します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

DROP REPLICATION [Owner.]ReplicationSchemeName

パラメータ

パラメータ 説明

[Owner.]ReplicationSchemeName

クラシック・レプリケーション・スキームに割り当てる名前です。

説明

データベースの最新のレプリケーション・スキームを削除しても、レプリケートされた表は削除されません。これらの表は、レプリケーション・スキームの定義の有無にかかわらず、データベース内に継続して保持されます。

次の文は、実行中のデータベースからクラシック・レプリケーション・スキームrの情報を削除します。

DROP REPLICATION r;

DROP SEQUENCE

DROP SEQUENCE文は、既存の順序番号ジェネレータを削除します。

順序がアクティブ・スタンバイ・ペア間でレプリケートされる場合で、DDL_REPLICATION_LEVELが3以上の場合は、DROP SEQUENCE文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアから順序を削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

必要な権限

順序の所有者に必要な権限はありません。

別のユーザーの順序の場合はDROP ANY SEQUENCEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP SEQUENCE [Owner.]SequenceName

パラメータ

パラメータ 説明

[Owner.]SequenceName

順序番号ジェネレータの名前です。

説明

  • 順序は、使用中でも削除できます。

  • TimesTen Scaleoutを使用している場合、ALTER SEQUENCE文でバッチ値を変更できます。それ以外の場合、順序を変更するには、DROP SEQUENCE文を使用してから、同じ名前の順序を新規作成します。たとえば、MINVALUEを変更する場合、順序を削除し、同じ名前で必要なMINVALUEを持つ順序を再度作成します。

  • 順序がレプリケーション・スキームに含まれている場合は、ALTER REPLICATION文を使用してレプリケーション・スキームから順序を削除します。次にDROP SEQUENCE文を使用して順序を削除します。

次の文は、mysequenceを削除します。

DROP SEQUENCE mysequence;

関連項目

CREATE SEQUENCE

DROP SYNONYM

DROP SYNONYM文は、データベースからシノニムを削除します。

シノニムがアクティブ・スタンバイ・ペア間でレプリケートされる場合で、DDL_REPLICATION_LEVELが2以上の場合は、DROP SYNONYM文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアからシノニムを削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

必要な権限

プライベート・シノニムをその所有者が削除する場合は、必要な権限はありません。別のユーザーのプライベート・シノニムを削除するには、DROP ANY SYNONYM権限が必要です。

PUBLICシノニムを削除するには、DROP PUBLIC SYNONYM権限が必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

プライベート・シノニムを削除するには、次の構文を使用します。

DROP SYNONYM [Owner.]SynonymName

パブリック・シノニムを削除するには、次の構文を使用します。

DROP PUBLIC SYNONYM SynonymName

パラメータ

パラメータ 説明

PUBLIC

PUBLICを指定すると、パブリック・シノニムを削除できます。

Owner

オプションで、プライベート・シノニムの所有者を指定します。所有者を省略する場合、プライベート・シノニムは現在のユーザーのスキーマに存在している必要があります。

SynonymName

削除するシノニムの名前を指定します。

パブリック・シノニムpubempを削除します。

DROP PUBLIC SYNONYM pubemp;
Synonym dropped.

プライベート・シノニムsynjobsを削除します。

DROP SYNONYM synjobs;
Synonym dropped.

DROP ANY SYNONYM権限を持つユーザーterryとして、ttuserが所有するプライベート・シノニムsyntabを削除します。

DROP SYNONYM ttuser.syntab;
Synonym dropped.

関連項目

CREATE SYNONYM

DROP TABLE

DROP TABLE文は、指定した表を、それに関連付けられたハッシュ索引および範囲索引とともに削除します。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合はDROP ANY TABLEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP TABLE [Owner.]TableName

パラメータ

パラメータ 説明

[Owner.]TableName

削除する表を指定します。

説明

  • 使用中の表を削除しようとすると、エラーが発生します。

  • コミットされていないトランザクションでのDROP TABLEがアクティブな場合(またはアクティブだった場合)、その表にアクセスしないDML操作を実行する他のトランザクションを続行できます。

  • 表がレプリケートされた表である場合、次のいずれかを実行できます。

    • DROP TABLE文を発行する前に、DROP REPLICATION文を使用してレプリケーション・スキームを削除します。

    • DDL_REPLICATION_LEVELが2以上の場合は、DROP TABLE文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアから表を削除します。

      DDL_REPLICATION_LEVELが1の場合は、レプリケーション・エージェントを停止し、ALTER ACTIVE STANDBY PAIR ... EXCLUDE TABLE文を使用してレプリケーション・スキームから表を除外します。次にDROP TABLE文を使用して表を削除します。

      詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

  • 他の接続が所有する空でないインスタンスが一時表にある場合、別の接続によって一時表を削除することはできません。

CREATE TABLE vendorperf
   (ordernumber INTEGER,
    delivday TT_SMALLINT,
    delivmonth TT_SMALLINT,
    delivyear TT_SMALLINT,
    delivqty TT_SMALLINT,
    remarks VARCHAR2(60));
CREATE UNIQUE INDEX vendorperfindex ON vendorperf (ordernumber);

次の文は、表および索引を削除します。

DROP TABLE vendorperf;

DROP USER

DROP USER文は、データベースからユーザーを削除します。

必要な権限

ADMIN

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP USER user

パラメータ

パラメータ 説明

user

データベースから削除されるユーザーの名前。

説明

ユーザーを削除するには、次の前提条件があります。

  • ユーザーがデータベースに内部的または外部的に存在している必要があります。

  • ユーザーが所有するオブジェクトを削除する必要があります。

  • レプリケーションが構成されている場合、この文はレプリケートされます。

データベースからユーザーterryを削除します。

DROP USER terry;
User dropped.

DROP VIEW

DROP VIEW文は、指定したビューを削除します。

ビューがアクティブ・スタンバイ・ペア間でレプリケートされる場合で、DDL_REPLICATION_LEVELが3以上の場合は、DROP VIEW文によって、レプリケーション・スキームのすべてのデータベースのアクティブ・スタンバイ・ペアからビューを削除します。詳細は、『Oracle TimesTen In-Memory Databaseレプリケーション・ガイド』アクティブ・スタンバイ・ペアでのDDL変更に関する項を参照してください。

必要な権限

ビューの所有者であるか、またはDROP ANY VIEW (非所有者の場合)

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

DROP VIEW [Owner.]ViewName

パラメータ

パラメータ 説明

[Owner.]ViewName

削除するビューを指定します。

次の文では、custorderビューが削除されます。

DROP VIEW custorder;

関連項目

FLUSH CACHE GROUP

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

FLUSH CACHE GROUP文は、TimesTenキャッシュ表のデータをOracle Database表にフラッシュします。この文は、ユーザー管理キャッシュ・グループでのみ使用できます。

この操作には、WHERE句を受け入れる操作およびWITH ID句を受け入れる操作の2つのタイプがあります。

FLUSH CACHE GROUPは、コミットの伝播(TimesTenからOracle Databaseへ)がオフになっているときに使用します。コミットのすべてのトランザクションを伝播するのではなく、変更をOracle Databaseに伝播する前に多数のトランザクションをコミットできます。Oracle Databaseにキャッシュ・インスタンスが存在する場合は、キャッシュ・インスタンスIDごとに更新操作が実行されます。Oracle Databaseにキャッシュ・インスタンスが存在しない場合は、TimesTenによって挿入されます。

この機能は、注文がマスターOracle Database表にコミットされる前に、高速キャッシュとしてTimesTenを使用する、カートへの変更が頻繁に行われるショッピング・カート・アプリケーションなどで役立ちます。

ノート:

通常、WHERE句を使用するより、WITH ID句を使用した方が高いシステム・パフォーマンスが得られます。

挿入と更新のみがフラッシュされます。挿入は、Oracle Database表にレコードが存在しない場合は挿入として、または(レコードがすでに存在する場合は)更新として伝播されます。削除をフラッシュすることはできません。つまり、TimesTenでレコードが削除された場合に、その削除をOracle Database表にフラッシュする方法はありません。削除は、手動で、またはコミット伝播をオンにすることで伝播する必要があります。削除されたレコードをフラッシュしようとすると、暗黙的に無視されます。エラーや警告は発行されません。READ ONLYまたはPROPAGATEとして指定されている表のレコードをOracle Database表にフラッシュすることはできません。

必要な権限

キャッシュ・グループの所有者に必要な権限はありません。

別のユーザーのキャッシュ・グループの場合はFLUSHまたはFLUSH ANY CACHE GROUPが必要です。

基礎となる表に対するINSERT権限、DELETE権限、UPDATE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

FLUSH CACHE GROUP [Owner.]GroupName
[WHERE ConditionalExpression]

または

FLUSH CACHE GROUP [Owner.]GroupName
WITH ID (ColumnValueList)

パラメータ

パラメータ 説明

[Owner.]GroupName

フラッシュされるキャッシュ・グループの名前。

WHERE ConditionalExpression

WHERE句を使用すると、キャッシュ処理のターゲット行を指定する検索条件を指定できます。WHERE句で複数の表を使用し、これらの表に同じ名前の列がある場合は、表名を完全修飾します。

WITH ID ColumnValueList

WITH ID句を使用すると、主キーの値を使用してキャッシュ・インスタンスをフラッシュできます。ColumnValueListを主キーの値を表すリテラルまたはバインディング・パラメータのリストとして指定します。

説明

  • 通常、WHERE句は、単一またはすべてのキャッシュ・インスタンスを対象に使用するものではなく、キャッシュ・インスタンスのセットに対して使用します。フラッシュ操作にWHERE句を使用して、Oracle Databaseに送信するキャッシュ・インスタンスを決定します。

  • 一般的には、FLUSH CACHE GROUP文のWHERE句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。所有者名を指定しない場合、キャッシュ・グループのWHERE句によって参照されるすべての表は、キャッシュ・グループ操作を実行している現在のログイン名が所有しています。

  • WHERE句を省略した場合、キャッシュ・グループの内容全体がOracle Database表にフラッシュされます。WHERE句を指定した場合、ルート表のみを含めることができます。

  • FLUSH CACHE GROUP文の実行後、ODBC関数SQLRowCount()、JDBCメソッドgetUpdateCount()、およびOCI_ATTR_ROW_COUNT引数を指定したOCI関数OCIAttrGet()によって、フラッシュされたキャッシュ・インスタンスの数が返されます。

  • WITH ID句を使用して、バインディング・パラメータを指定します。

制限

次をフラッシュするときには、WITH ID句を使用しないでください。

  • AUTOREFRESH属性を持つ静的ユーザー管理キャッシュ・グループ

  • AWTまたはSWTキャッシュ・グループ

FLUSH CACHE GROUP marketbasket;

FLUSH CACHE GROUP marketbasket
WITH ID(10);

関連項目

GRANT

GRANT文は、1つ以上の権限をユーザーに割り当てます。

必要な権限

システム権限を付与するには、ADMINが必要です。

オブジェクト権限を付与するには、ADMINが必要であるか、オブジェクト所有者である必要があります。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

GRANT {SystemPrivilege [,...] | ALL [PRIVILEGES]} [...] TO {user |PUBLIC} [,...]

または

GRANT {{ObjectPrivilege [,...] | ALL [PRIVILEGES]} ON {[Owner.]object}[,...]} TO
{user | PUBLIC} [,...]

パラメータ

システム権限を付与するためのパラメータは次のとおりです。

パラメータ 説明

SystemPrivilege

付与するシステム権限です。使用できる値のリストについては、「システム権限」を参照してください。

ALL [PRIVILEGES]

ユーザーにすべてのシステム権限を割り当てます。

user

権限が付与されるユーザーの名前。ユーザー名は、CREATE USER文を使用してTimesTenデータベースに設定しておく必要があります。

PUBLIC

すべてのユーザーに権限を付与することを指定します。

オブジェクト権限を付与するためのパラメータは次のとおりです。

パラメータ 説明

ObjectPrivilege

付与するオブジェクト権限です。使用できる値のリストについては、「オブジェクト権限」を参照してください。

ALL [PRIVILEGES]

ユーザーにすべてのオブジェクト権限を割り当てます。

[Owner.]object

objectは、権限が付与されるオブジェクトの名前です。Ownerは、オブジェクトの所有者です。Ownerが指定されていない場合は、権限を付与しているユーザーが所有者になります。

user

権限が付与されるユーザーの名前。ユーザーがデータベースに存在している必要があります。

PUBLIC

すべてのユーザーに権限を付与することを指定します。

説明

  • ADMIN権限を持つユーザーは、1つ以上のシステム権限をユーザーに付与できます。

  • オブジェクトの所有者は、そのオブジェクトに対する1つ以上のオブジェクト権限をユーザーに付与できます。

  • ADMIN権限を持つユーザーは、任意のオブジェクトに対する1つ以上のオブジェクト権限をユーザーに付与できます。

  • ユーザーから権限を削除するには、REVOKE文を使用してください。

  • システム権限とオブジェクト権限を1つの文で付与することはできません。

  • オブジェクト権限の文に指定できるオブジェクトの数は1つのみです。

  • レプリケーションが構成されている場合、この文はレプリケートされます。

ユーザーterryADMIN権限を付与します。

GRANT admin TO terry;

ADMIN権限を持っている権限付与者が、ユーザーpatが所有するcustomers表に対するSELECT権限をユーザーterryに付与します。

GRANT SELECT ON pat.customers TO terry;

ユーザーterryにオブジェクト権限を付与します。

GRANT SELECT ON emp_details_view TO terry;

INSERT

INSERT文は、表に行を追加します。

次の式は、INSERT文のVALUES句の中で使用できます。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合、INSERTが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

INSERT [hint] INTO [Owner.]TableName [(Column [,...])]
VALUES (SingleRowValues)
[RETURNING|RETURN Expression[,...] INTO DataItem[,...]]

SingleRowValuesパラメータの構文は、次のとおりです。

{NULL|{?|:DynamicParameter}|{Constant}| DEFAULT}[,...]

パラメータ

パラメータ 説明

hint

INSERT文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

Owner

データを挿入する表の所有者。

TableName

データを挿入する表の名前。

Column

このリストの各列には、SingleRowValuesから値が割り当てられます。

1つ以上の表の列をこのリストで省略した場合、挿入された行では、省略された列の値は、表の作成時または最終更新時に指定された列のデフォルト値になります。省略した列にNOT NULL制約が指定されており、その列にデフォルト値が定義されていない場合は、データベースによってエラーが返されます。

列のリストを完全に省略した場合は、表のすべての列に値を指定する必要があります。

?

:DynamicParameter

準備されたSQL文の動的パラメータのプレースホルダ。動的パラメータの値は、文の実行時に設定されます。

Constant

特定の値。定数の詳細は、「定数」を参照してください。

DEFAULT

列をデフォルト値で更新する必要があることを指定します。

Expression

有効な式の構文。式の詳細は、「式」を参照してください。

DataItem

取得したExpression値を格納するホスト変数またはPL/SQL変数。

説明

  • 表の列を列名リストで省略した場合は、INSERT文によって、省略された列にデフォルト値が割り当てられます。省略した列に表定義でNOT NULLが指定されている場合、その列にデフォルト値が定義されていなければ、INSERT文は失敗します。

  • BINARYおよびVARBINARYデータは、文字形式または16進形式に挿入できます。

    • 文字形式では、一重引用符が必要です。

    • 16進形式では、値の前に接頭辞0xが必要です。

  • 外部キー制約に違反するINSERT処理はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。

  • RETURNING句の制限:

    • Expressionは単純な式である必要があります。集計関数はサポートされません。

    • 順序番号はOUTパラメータに戻せません。

    • ROWNUMおよび副問合せは、RETURNING句では使用できません。

    • RETURNING句内のパラメータは、INSERT文で重複して使用できません。

    • PL/SQLでは、RETURNING句はWHERE CURRENT処理と一緒には使用できません。

purchasing.vendors表に新しい単一行を追加します。

INSERT INTO purchasing.vendors
VALUES (9016,
       'Secure Systems, Inc.',
       'Jane Secret',
       '454-255-2087',
       '1111 Encryption Way',
       'Hush',
       'MD',
       '00007',
       'discount rates are secret');

動的パラメータ:pnoおよび:pnameには、実行時に値が設定されます。

INSERT INTO purchasing.parts (partnumber, partname)
  VALUES (:pno, :pname);

新しい従業員の年間のsalaryおよびjob_idを返します。変数salおよびjobidを、salaryおよびjob_idと同じデータ型で宣言します。employeesに行を挿入します。確認用に変数を出力します。

Command> VARIABLE sal12 NUMBER(8,2);
Command> VARIABLE jobid VARCHAR2(10) INLINE NOT NULL;

Command> INSERT INTO employees(employee_id, last_name, email, hire_date, 
           job_id, salary)
         VALUES (211,'Doe','JDOE',sysdate,'ST_CLERK',2400)
         RETURNING salary*12, job_id INTO :sal12,:jobid;
1 row inserted.

PRINT sal12 jobid;
SAL12                 : 28800
JOBID                 : ST_CLERK

INSERT...SELECT

INSERT...SELECT文は、問合せの結果を表に挿入します。

必要な権限

オブジェクトの所有者に必要な権限はありません。

別のユーザーのオブジェクトの場合、INSERTSELECTが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

INSERT INTO [Owner.]TableName [(ColumnName [,...])] InsertQuery

パラメータ

パラメータ 説明

[Owner.]TableName

データを追加する表。

ColumnName

値を指定する列。表の列を列名リストで省略した場合は、INSERT...SELECT文によって、省略された列にデフォルト値が割り当てられます。省略した列に表定義でNOT NULLが指定されている場合、その列にデフォルト値が定義されていなければ、INSERT...SELECT文は失敗します。CREATE TABLE文で指定された順序と同じ順序で表のすべての列に対して値を指定する場合は、列名リストを省略できます。指定する値が少なすぎる場合は、その他の列にデフォルト値が割り当てられます。

InsertQuery

サポートされている任意のSELECT問合せ。「SELECT」を参照してください。SELECT動詞の後に文レベルのオプティマイザ・ヒントを指定できます。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

説明

  • 結果セットの列の型は、ターゲット表の列の型と互換性がある必要があります。

  • 値を挿入するときに、順序CURRVALまたはNEXTVALを指定できます。詳細は、「TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法」を参照してください。

  • InsertQueryORDER BY句を使用できます。ターゲット表に結果セットを挿入する際に、ORDER BY句を使用してソート順序が変更されますが、順序は保証されません。

  • InsertQueryにエラーがあると、INSERT操作は失敗します。

  • RETURNING句はINSERT...SELECT文では使用できません。

  • UNIONUNION ALLMINUSまたはINTERSECTSELECT副問合せは、同じ数の投影式が必要です。

20日以内に配送される部品を示すpurchasing.parts表に新しい行が追加されます。

INSERT INTO purchasing.parts
SELECT partnumber, deliverydays
FROM purchasing.supplyprice
WHERE deliverydays < 20;

LOAD CACHE GROUP

LOAD CACHE GROUP文は、Oracle Database表からTimesTenキャッシュ・グループにデータをロードします。

必要な権限

キャッシュ・グループの所有者に必要な権限はありません。

別のユーザーのキャッシュ・グループの場合、LOADまたはLOAD ANY CACHE GROUPが必要です。

基礎となる表に対するINSERT権限、DELETE権限、UPDATE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

LOAD CACHE GROUP [Owner.]GroupName 
[WHERE ConditionalExpression] 
COMMIT EVERY n ROWS
[PARALLEL NumThreads [READERS NumReaders]]

または

LOAD CACHE GROUP [Owner.]GroupName
WITH ID (ColumnValueList)

ノート:

WITH ID句は、TimesTen Scaleoutではサポートされていません。

パラメータ

パラメータ 説明

[Owner.]GroupName

キャッシュ・グループに割り当てられた名前。

WHERE ConditionalExpression

WHERE句を使用すると、キャッシュ処理のターゲット行を指定する検索条件を指定できます。WHERE句で複数の表を使用し、これらの表に同じ名前の列がある場合は、表名を完全修飾します。

COMMIT EVERY n ROWS

COMMIT EVERY n ROWS句を使用して、ロード操作中にコミットを発行する頻度(キャッシュ・グループにロードされる行数に基づく)を指定します。この句はWITH ID句を指定しない場合に必須です。

nは、トランザクションがコミットされる前にキャッシュ・グループにロードされる行数を示します。nは整数(n >= 0)で指定します。nに0を指定すると、LOAD CACHE GROUP文は、1つのトランザクションとして実行されます。

[PARALLEL NumThreads]

キャッシュ・グループ表のパラレル・ロードを実行します。同時にロードを実行するスレッドの数を指定します。1つのスレッドがOracle Databaseからのバルク・フェッチを実行し、その他のスレッド(NumThreads - 1個のスレッド)がTimesTenへの挿入を実行します。各スレッドで独自の接続またはトランザクションが使用されます。

NumThreadsの最小値は2です。最大値は10です。10より大きい値を指定すると、TimesTenは値10を割り当てます。

[READERS NumReaders]

このオプションでは、Oracle Databaseからのバルク・フェッチのために使用するNumThreadsパラメータからのスレッドの合計数を指定します。

たとえば、NumThreadsパラメータを8、リーダー・オプションを3に指定した場合、Oracle Databaseからデータをバルク・フェッチするために3つのスレッドが使用され、TimesTenデータベースにデータをロードするために5つのスレッドが使用されます。

NumReadersは整数(0 < NumReaders < NumThreads)で指定します。

WITH ID ColumnValueList

WITH ID句を使用すると、主キーの値を使用してキャッシュ・インスタンスをロードできます。ColumnValueListを主キーの値を表すリテラルまたはバインディング・パラメータのリストとして指定します。

WITH ID句は、TimesTen Scaleoutではサポートされていません。

説明

  • LOAD CACHE GROUPは、キャッシュ・グループの定義を満たし、キャッシュ・グループにまだ存在していないすべての新しいキャッシュ・インスタンスをOracle Databaseからロードします。

  • キャッシュ・グループがレプリケートされるか、またはAWTキャッシュ・グループである場合、LOAD CACHE GROUP文を発行する前に、レプリケーション・エージェントが実行中であることを確認してください。キャッシュ・エージェントが稼働していることを確認してください。

  • LOAD CACHE GROUPは、独自のトランザクション内で実行され、トランザクション内の最初の操作である必要があります。

  • LOAD CACHE GROUPは、Oracle Database表に対する新規(挿入)行のみを、対応するTimesTenキャッシュ表にロードします。

  • エラーが発生するとロールバックされます。キャッシュ・インスタンスが定期的にコミットされる場合、エラーが発生すると残りのロードは中止されます。ロードは直前にコミットした時点までロールバックされます。

  • COMMIT EVERY n ROWS (n >= 0)を指定しているときにLOAD CACHE GROUP文が失敗すると、ロードされた行の一部はすでにコミットされているために、ターゲット・キャッシュ・グループの内容が一貫性のない状態になる場合があります。一部のキャッシュ・インスタンスが部分的にしかロードされていない可能性があります。UNLOAD CACHE GROUP文を使用してキャッシュ・グループをアンロードしてから、キャッシュ・グループを再ロードします。

  • 一般的には、LOAD CACHE GROUP文のWHERE句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。

  • 読取り専用キャッシュ・グループをロードする場合、次の条件を満たしている必要があります。

    • AUTOREFRESHのSTATEは、PAUSEDにする必要があります。

    • LOAD CACHE GROUP文ではWHERE句を使用できません(動的キャッシュ・グループの場合を除く)。

    • キャッシュ・グループは空である必要があります。

  • キャッシュ・グループの自動リフレッシュ状態は、LOAD CACHE GROUP操作の完了後に変更されることがあります。詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』自動リフレッシュによる動的キャッシュ・グループのロードおよびリフレッシュに関する項を参照してください。

  • LOAD CACHE GROUP文の実行後、ODBC関数SQLRowCount()、JDBCメソッドgetUpdateCount()、およびOCI_ATTR_ROW_COUNT引数を指定したOCI関数OCIAttrGet()を実行すると、ロードされたキャッシュ・インスタンスの数が返されます。

  • 次の場合にWITH ID句を使用します。

    • キャッシュ・インスタンスのロード速度を上げる場合(WHERE句の中で使用)

    • バインディング・パラメータを指定する場合

    • 障害発生時にロード・トランザクションをロールバックする場合

制限

  • LOAD CACHE GROUP...WITH ID句は、TimesTen Scaleoutではサポートされていません。

  • WHERE句で子表を参照しないでください。

  • 次の場合にはPARALLEL句を指定しないでください。

    • WITH ID句が使用されている場合

    • COMMIT EVERY 0 ROWS句が使用されている場合

    • データベース・レベルのロックが有効な場合(接続属性LockLevelが1に設定されている場合)

  • 次のタイプのキャッシュ・グループをロードする場合は、WITH ID句を使用しないでください。

    • 静的読取り専用キャッシュ・グループ

    • 自動リフレッシュ属性が指定された静的ユーザー管理キャッシュ・グループ

    • AUTOREFRESHおよびPROPAGATE属性が指定されたユーザー管理キャッシュ・グループ

  • WITH ID句はCOMMIT EVERY n ROWS句と同時に使用しないでください。

CREATE CACHE GROUP recreation.cache
    FROM recreation.clubs (
        clubname CHAR(15) NOT NULL,
        clubphone SMALLINT,
        activity CHAR(18),
        PRIMARY KEY(clubname))
    WHERE (recreation.clubs.activity IS NOT NULL);

LOAD CACHE GROUP recreation.cache
    COMMIT EVERY 30 ROWS;

HRスキーマを使用して、PARALLEL句とLOAD CACHE GROUP文を同時に使用する例を示します。COMMIT EVERY n ROWS句が必要です。CACHEGROUPSコマンドを発行します。キャッシュ・グループcg2が定義され、自動リフレッシュの状態がPaused(一時停止中)であることが示されています。キャッシュ・グループcg2をアンロードしてから、LOAD CACHE GROUP文とPARALLEL句を指定してパラレル・ロードを実行します。25個のキャッシュ・インスタンスがロードされます。

Command> CACHEGROUPS;

Cache Group SAMPLEUSER.CG2:

  Cache Group Type: Read Only
  Autorefresh: Yes
  Autorefresh Mode: Incremental
  Autorefresh State: Paused
  Autorefresh Interval: 1.5 Minutes

  Root Table: SAMPLEUSER.COUNTRIES
  Table Type: Read Only

  Child Table: SAMPLEUSER.LOCATIONS
  Table Type: Read Only

  Child Table: SAMPLEUSER.DEPARTMENTS
  Table Type: Read Only

1 cache group found.

Command> UNLOAD CACHE GROUP cg2;
25 cache instances affected.
Command> COMMIT;
Command> LOAD CACHE GROUP cg2 COMMIT EVERY 10 ROWS PARALLEL 2;
25 cache instances affected.
Command> COMMIT;

次の例では、対応するOracle Database表からnew_customersキャッシュ・グループのTimesTenキャッシュ表に、顧客番号が5000以上の顧客のキャッシュ・インスタンスのみをロードします。

LOAD CACHE GROUP new_customers WHERE (oratt.customer.cust_num >= 5000) COMMIT
EVERY 256 ROWS;

MERGE

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

MERGE文を使用すると、1つまたは複数のソースから行を選択して、ターゲット表に対して更新や挿入ができます。ターゲット表に対してどの行を更新または挿入するかの評価に使用する条件を指定できます。

この文は、複数のINSERT文およびUPDATE文を組み合せるために使用します。

MERGEは、決定的な文であり、同一のMERGE文でターゲット表の同じ行を複数回更新できません。

必要な権限

ターゲット表およびソース表の所有者に必要な権限はありません。

別のユーザーが所有するターゲット表の場合はINSERTまたはUPDATE、別のユーザーが所有するソース表の場合はSELECTが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

MERGE [hint] INTO [Owner.]TargetTableName [Alias] USING
    {[Owner.]SourceTableName|(Subquery)}[Alias] ON (Condtion)
    {MergeUpdateClause MergeInsertClause |
     MergeInsertClause MergeUpdateClause |
     MergeUpdateClause | MergeInsertClause
    }

MergeUpdateClauseの構文は次のとおりです。

WHEN MATCHED THEN UPDATE SET SetClause [WHERE Condition1]

MergeInsertClauseの構文は次のとおりです。

WHEN NOT MATCHED THEN INSERT [Columns [,...]] VALUES
    ( {{Expression | DEFAULT|NULL} [,...] }) [WHERE Condition2]

パラメータ

パラメータ 説明

hint

MERGE文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

[Owner.]TargetTableName

ターゲット表の名前。これは、行の更新や挿入の対象となる表です。

[Alias]

オプションで、ターゲット表やソース表の別名を指定できます。

USING {[Owner.]SourceTableName | (Subquery)} [Alias]

USING句は、データのソースに使用する表の名前や副問合せを指定します。結合や集計を使用する場合は、副問合せを使用します。オプションで、表の名前や副問合せの別名を指定できます。

ON (Condition)

行に対してMerge InsertまたはMerge Updateのどちらを実行するかを決定するために、ターゲット表の各行の評価に使用する条件を指定します。評価時に条件がTRUEの場合、SourceTableNameの対応する行を使用して、ターゲット行に実行するのはMergeUpdateClauseであるとみなされます。ソース表の複数の行がターゲット表の同一行に対応している場合、エラーが発生します。評価時に条件がTRUEでない場合、その行に対して実行するのはMergeInsertClauseであるとみなされます。

SET SetClause

UPDATE文とともに使用する句。UPDATE文の詳細は、「UPDATE」を参照してください。

[WHERE Condition1]

ON (Condition)に一致する各行に対して、Condition1が評価されます。評価時に条件がTRUEの場合、その行は更新されます。この句では、ターゲット表またはソース表を参照できます。副問合せは使用できません。この句はオプションです。

INSERT [Columns[,...]]VALUES ({{Expression |DEFAULT|NULL} [,...]})

ターゲット表に挿入する列です。INSERT文の詳細は、「INSERT」を参照してください。

[WHERE Condition2]

指定すると、Condition2が評価されます。評価時に条件がTRUEの場合、その行はターゲット表に挿入されます。条件にはソース表のみ参照できます。副問合せは使用できません。

説明

  • MergeUpdateClauseMergeInsertClauseは、一緒に、または別々に指定できます。両方指定する場合は、どちらが先でもかまいません。

  • DUALが、USING句でのみ指定された表であり、MERGE文の他の場所では参照されない場合は、副問合せではDUALを使用するかわりに、単純な表として指定します。この単純な場合でパフォーマンスを向上させるには、ON句でターゲット表の一意索引にキー条件を指定します。

  • MergeUpdateClauseの制限:

    • ON condition句で参照する列は更新できません。

    • ソース表の列は更新できません。

  • MergeInsertClauseの制限:

    • ターゲット表の列の値は挿入できません。

  • その他の制限:

    • ソース表の副問合せで集合演算子は使用しないでください。

    • MergeUpdateClauseまたはMergeInsertClauseWHERE条件で、副問合せは使用しないでください。

    • ターゲット表は、マテリアライズド・ビューのディテール表には指定できません。

    • RETURNING句はMERGE文では使用できません。

この例では、dualは単純な表として指定されます。ON句に指定されたターゲット表のUNIQUE索引にキー条件があります。この例では、DuplicateBindMode属性は1に設定されます。(デフォルトは0です)。

Command> CREATE TABLE mergedualex (col1 TT_INTEGER NOT NULL, 
           col2 TT_INTEGER, PRIMARY KEY (col1));
Command> MERGE INTO mergedualex USING dual ON (col1 = :v1)
         WHEN MATCHED THEN UPDATE SET col2 = col2 + 1
         WHEN NOT MATCHED THEN INSERT VALUES (:v1, 1);
Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1  'V1' (TT_INTEGER) > 10
1 row merged.
Command> SELECT * FROM mergedualex;
< 10, 1 >
1 row found.

この例では、列employee_idおよびmanager_idを含むcontactsという名前の表が作成されます。employee_idおよびmanager_idにそれぞれ101とNULLの値を持つcontactsに、行が1つ挿入されます。MERGE文で、employees表のデータを使用してcontactsに行が挿入されます。SELECT FIRST 3の行では、employee_idが101の場合は、manager_idが100に更新されることを示しています。employees表の残りの106行がcontactsに挿入されます。

Command> CREATE TABLE contacts (employee_id NUMBER (6) NOT NULL PRIMARY KEY, 
                                manager_id NUMBER (6));
Command> SELECT employee_id, manager_id FROM employees WHERE employee_id =101;
< 101, 100 >
1 row found.
Command> INSERT INTO contacts VALUES (101,null);
1 row inserted.
Command> SELECT COUNT (*) FROM employees;
< 107 >
1 row found.
Command> MERGE INTO contacts c
         USING employees e
         ON (c.employee_id = e.employee_id)
         WHEN MATCHED THEN
         UPDATE SET c.manager_id = e.manager_id
         WHEN NOT MATCHED THEN
         INSERT (employee_id, manager_id)
         VALUES (e.employee_id, e.manager_id);
107 rows merged.
Command> SELECT COUNT (*) FROM contacts;
< 107 >
1 row found.
Command> SELECT FIRST 3 employee_id,manager_id FROM employees;
< 100, <NULL> >
< 101, 100 >
< 102, 100 >
3 rows found.
Command> SELECT FIRST 3 employee_id, manager_id FROM contacts;
< 100, <NULL> >
< 101, 100 >
< 102, 100 >
3 rows found.

REFRESH CACHE GROUP

REFRESH CACHE GROUP文は、TimesTenキャッシュ表のデータをキャッシュされたOracle Database表でコミットされた最新のデータに置き換えます。

必要な権限

Oracle DatabaseスキーマのCREATE SESSIONおよびOracle Database表のSELECT

キャッシュ・グループの所有者の場合、キャッシュ・グループに対して必要な権限はありません。

別のユーザーのキャッシュ・グループの場合、REFRESHまたはREFRESH ANY CACHE GROUPが必要です。

基礎となる表に対するINSERT権限、DELETE権限、UPDATE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

REFRESH CACHE GROUP [Owner.]GroupName 
[WHERE ConditionalExpression]
COMMIT EVERY n ROWS
[PARALLEL NumThreads]

または

REFRESH CACHE GROUP [Owner.]GroupName 
WITH ID (ColumnValueList)

ノート:

WITH ID句は、TimesTen Scaleoutではサポートされていません。

パラメータ

パラメータ 説明

[Owner.]GroupName

キャッシュ・グループに割り当てられた名前。

WHERE ConditionalExpression

WHERE句を使用すると、キャッシュ処理のターゲット行を指定する検索条件を指定できます。WHERE句で複数の表を使用し、これらの表に同じ名前の列がある場合は、表名を完全修飾します。

COMMIT EVERY n ROWS

COMMIT EVERY n ROWS句を使用して、リフレッシュ操作中にコミットを発行する頻度(キャッシュ・グループでリフレッシュされる行数に基づく)を指定します。この句はWITH ID句を指定しない場合に必須です。

nは、トランザクションがコミットされる前にリフレッシュされる行数を示します。nは整数(n >= 0)で指定します。nに0を指定すると、REFRESH CACHE GROUP文は、1つのトランザクションとして実行されます。

[PARALLEL NumThreads]

キャッシュ・グループ表のパラレル・ロードを実行します。同時にロードを実行するスレッドの数を指定します。1つのスレッドがOracle Databaseからのバルク・フェッチを実行し、その他のスレッド(NumThreads - 1個のスレッド)がTimesTenへの挿入を実行します。各スレッドで独自の接続またはトランザクションが使用されます。

NumThreadsの最小値は2です。最大値は10です。10より大きい値を指定すると、TimesTenは値10を割り当てます。

WITH ID ColumnValueList

WITH ID句を使用すると、主キーの値を使用してキャッシュ・インスタンスをリフレッシュできます。ColumnValueListを主キーの値を表すリテラルまたはバインディング・パラメータのリストとして指定します。

WITH ID句は、TimesTen Scaleoutではサポートされていません。

説明

  • REFRESH CACHE GROUP文は、独自のトランザクション内で実行する必要があります。

  • キャッシュ・グループがレプリケートされるか、またはAWTキャッシュ・グループである場合、REFRESH CACHE GROUP文を発行する前に、レプリケーション・エージェントが実行中であることを確認してください。キャッシュ・エージェントが稼働していることを確認してください。

  • REFRESH CACHE GROUP文は、TimesTenキャッシュ表のデータをキャッシュされたOracle Database表でコミットされた最新のデータ(TimesTenキャッシュ表にすでに存在するデータも含む)に置き換えます。明示的にロードされるキャッシュ・グループの場合、リフレッシュ処理は、UNLOAD CACHE GROUP文の後にLOAD CACHE GROUP文を続けて指定した場合と同じ処理を実行します。Oracle Database表のすべての行での挿入、更新、削除などの操作は、キャッシュ表に適用されます。動的キャッシュ・グループの場合、リフレッシュ処理は、更新または削除されたOracle Database表の行のみをキャッシュ表にリフレッシュします。明示的にロードされるキャッシュ・グループと動的なキャッシュ・グループの詳細は、『Oracle TimesTen In-Memory Databaseキャッシュ・ガイド』TimesTenとOracleのデータベース間での変更の伝送に関する項を参照してください。

  • 読取り専用キャッシュ・グループをリフレッシュする場合、次の条件を満たしている必要があります。

    • AUTOREFRESHのSTATEは、PAUSEDにする必要があります。

    • キャッシュ・グループが読取り専用動的キャッシュ・グループである場合、PARALLEL句を使用しないでください。

  • 明示的にロードされるキャッシュ・グループまたは動的キャッシュ・グループの自動リフレッシュ状態がPAUSEDの場合、キャッシュ・グループに対して発行された条件なしのREFRESH CACHE GROUP文が完了した後、状態はONに変更されます。

  • 動的キャッシュ・グループの自動リフレッシュ状態がPAUSEDの場合、REFRESH CACHE GROUP...WITH ID文が完了した後も状態はPAUSEDのままになります。

  • 一般的には、REFRESH CACHE GROUP文のWHERE句の列名を完全に修飾する必要はありません。ただし、同一キャッシュ・グループ内の複数の表を結合する問合せがTimesTenによって自動的に生成されるため、キャッシュ・グループ内に同じ名前の列を持つ表が複数ある場合は、列を完全に修飾する必要があります。

  • COMMIT EVERY n ROWS (n >= 0)を指定しているときにREFRESH CACHE GROUP文が失敗すると、ロードされた行の一部はすでにコミットされているために、ターゲット・キャッシュ・グループの内容が一貫性のない状態になる場合があります。一部のキャッシュ・インスタンスが部分的にしかロードされていない可能性があります。UNLOAD CACHE GROUP文を使用してキャッシュ・グループをアンロードしてから、LOAD CACHE GROUP文を使用してキャッシュ・グループを再ロードします。

  • REFRESH CACHE GROUP文の実行後、ODBC関数SQLRowCount()、JDBCメソッドgetUpdateCount()、およびOCI_ATTR_ROW_COUNT引数が指定されたOCI関数OCIAttrGet()を実行すると、リフレッシュされたキャッシュ・インスタンスの数が返されます。

  • 次の場合にWITH ID句を使用します。

    • キャッシュ・インスタンスのリフレッシュ速度を上げる場合(WHERE句の中で使用)

    • バインディング・パラメータを指定する場合

    • 障害発生時にリフレッシュ・トランザクションをロールバックする場合

制限

  • REFRESH CACHE GROUP...WITH ID句は、TimesTen Scaleoutではサポートされていません。

  • 次の場合はPARALLEL句を指定しないでください。

    • WITH ID句が使用されている場合

    • COMMIT EVERY n ROWS句が使用されている場合

    • データベース・レベルのロックが有効な場合(接続属性LockLevelが1に設定されている場合)

    • 読取り専用動的キャッシュ・グループの場合

  • 次のタイプのキャッシュ・グループをリフレッシュする場合は、WITH ID句を使用しないでください。

    • 静的読取り専用キャッシュ・グループ

    • 自動リフレッシュ属性が指定された静的ユーザー管理キャッシュ・グループ

    • 自動リフレッシュ属性および伝播属性が指定されたユーザー管理キャッシュ・グループ

  • WITH ID句はCOMMIT EVERY n ROWS句と同時に使用しないでください。

  • 動的または読取り専用キャッシュ・グループでWHERE句を使用しないでください。

REFRESH CACHE GROUP recreation.cache COMMIT EVERY 30 ROWS;

これは、次と同じです。

UNLOAD CACHE GROUP recreation.cache;
LOAD CACHE GROUP recreation.cache COMMIT EVERY 30 ROWS;

HRスキーマを使用して、PARALLEL句とREFRESH CACHE GROUP文を同時に使用する例を示します。COMMIT EVERY n ROWSが必要です。CACHEGROUPSコマンドを発行します。キャッシュ・グループcg2が定義され、自動リフレッシュの状態がPaused(一時停止中)であることが示されています。REFRESH CACHE GROUP文とPARALLEL句を指定してパラレル・ロードを実行します。25個のキャッシュ・インスタンスがリフレッシュされます。

Command> CACHEGROUPS;

Cache Group SAMPLEUSER.CG2:

  Cache Group Type: Read Only
  Autorefresh: Yes
  Autorefresh Mode: Incremental
  Autorefresh State: Paused
  Autorefresh Interval: 1.5 Minutes

  Root Table: SAMPLEUSER.COUNTRIES
  Table Type: Read Only

  Child Table: SAMPLEUSER.LOCATIONS
  Table Type: Read Only

  Child Table: SAMPLEUSER.DEPARTMENTS
  Table Type: Read Only

1 cache group found.
Command> REFRESH CACHE GROUP cg2 COMMIT EVERY 20 ROWS PARALLEL 2;
25 cache instances affected.

REVOKE

REVOKE文は、ユーザーから1つ以上の権限を削除します。

必要な権限

システム権限を削除するには、ADMINが必要です。

オブジェクト権限を削除するには、ADMINが必要であるか、またはオブジェクト所有者である必要があります。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

REVOKE {SystemPrivilege [,...] | ALL [PRIVILEGES]} FROM {User |PUBLIC} [,...]

または

REVOKE {{ObjectPrivilege [,...] | ALL [PRIVILEGES]} ON {[Owner.Object}} [,...]
FROM {user | PUBLIC}[,...]

パラメータ

システム権限を削除するためのパラメータは次のとおりです。

パラメータ 説明

SystemPrivilege

削除するシステム権限です。使用できる値のリストについては、「システム権限」を参照してください。

ALL [PRIVILEGES]

ユーザーからすべてのシステム権限を削除します。

User

権限が削除されるユーザーの名前。ユーザー名は、CREATE USER文を使用してTimesTenデータベースに設定しておく必要があります。

PUBLIC

すべてのユーザーの権限を削除することを指定します。

オブジェクト権限を削除するためのパラメータは次のとおりです。

パラメータ 説明

ObjectPrivilege

削除するオブジェクト権限です。使用できる値のリストについては、「オブジェクト権限」を参照してください。

ALL [PRIVILEGES]

ユーザーからすべてのオブジェクト権限を削除します。

User

権限が削除されるユーザーの名前。ユーザー名は、CREATE USER文を使用してTimesTenデータベースに設定しておく必要があります。

[Owner.]Object

Objectは、権限が削除される対象オブジェクトの名前です。Ownerは、オブジェクトの所有者です。Ownerを指定しない場合は、権限を削除しているユーザーが所有者とみなされます。

PUBLIC

すべてのユーザーの権限を削除することを指定します。

説明

  • オブジェクトの所有者から、そのオブジェクトの権限を削除することはできません。

  • 権限を付与できるユーザーは、自分以外のユーザーが付与した場合でもその権限を削除できます。

  • 権限は、付与されたときと同じレベルで削除する必要があります。ユーザーからオブジェクト権限を削除する場合、関連するシステム権限が付与されているユーザーからは削除できません。たとえば、あるユーザーにSELECT ANY TABLEを付与し、その後SELECT ON BOB.TABLE1を削除しようとすると、SELECT ANY TABLEに加えてSELECT ON BOB.TABLE1を明示的に付与していない場合は失敗します。

  • ユーザーにすべてのシステム権限が付与されている場合は、特定の権限を削除できます。たとえば、すべてのシステム権限が付与されているユーザーからALTER ANY TABLEを削除できます。

  • すべてのオブジェクト権限が付与されているユーザーからは、特定のオブジェクトの特定の権限を削除できます。たとえば、ユーザーTERRYにすべてのオブジェクト権限が付与されている場合でも、表CUSTOMERSに対するDELETE権限をTERRYから削除できます。

  • ユーザーにすべての権限が付与されていない場合でも、そのユーザーからすべての権限を削除できます。

  • 特定の権限を、その権限を付与されていないユーザーから削除することはできません。

  • ユーザーが所有するオブジェクトに対する権限は削除できません。

  • システム権限とオブジェクト権限を1つの文で削除することはできません。

  • オブジェクト権限の文に指定できるオブジェクトの数は1つのみです。

  • ディテール表に対するSELECT権限またはSELECT権限を含むシステム権限をuser1が所有するディテール表でuser2から削除すると、user2が所有する関連するマテリアライズド・ビューは無効と指定されます。

  • レプリケーションが構成されている場合、この文はレプリケートされます。

ADMINおよびDDL権限をユーザーterryから削除します。

REVOKE admin, ddl FROM terry;

ADMIN権限を持っている権限削除者が、patが所有するcustomers表に対するUPDATE権限をterryから削除します。

REVOKE update ON pat.customers FROM terry;

ROLLBACK

現行のトランザクションで行った処理を元に戻すには、ROLLBACK文を使用します。

必要な権限

なし

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

ROLLBACK [WORK]

パラメータ

ROLLBACK文では次のオプションのキーワードを使用できます。

パラメータ 説明

[WORK]

SQL標準に準拠するためにサポートされているオプションの句。ROLLBACKROLLBACK WORKは同等です。

説明

PassThrough接続属性が0(ゼロ)よりも大きい値で指定されている場合は、Oracle Databaseトランザクションもロールバックされます。

ロールバックによって、すべてのオープン・カーソルがクローズされます。

HRスキーマのregions表に行を1つ挿入し、トランザクションをロールバックします。最初に、AUTOCOMMITを0に設定します。

Command> SET AUTOCOMMIT 0;
Command> INSERT INTO regions VALUES (5,'Australia');
1 row inserted.
Command> SELECT * FROM regions;
< 1, Europe >
< 2, Americas >
< 3, Asia >
< 4, Middle East and Africa >
< 5, Australia >
5 rows found.
Command> ROLLBACK;
Command> SELECT * FROM regions;
< 1, Europe >
< 2, Americas >
< 3, Asia >
< 4, Middle East and Africa >
4 rows found.

関連項目

SELECT

SELECT文は、1つ以上の表からデータを取得します。取得されたデータは、結果表結果セットまたは問合せ結果と呼ばれる表の形式で表示されます。

必要な権限

オブジェクトの所有者に必要な権限はありません。

別のユーザーのオブジェクトの場合、SELECTが必要です。

別のユーザーのオブジェクトの場合、SELECT ... FOR UPDATEにはUPDATE権限も必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

SELECT文の一般的な構文は、次のとおりです。

[WithClause] SELECT [hint][FIRST NumRows | ROWS m TO n] [ALL | DISTINCT] SelectList
  FROM TableSpec [,...]
  [WHERE SearchCondition]
  [GROUP BY GroupByClause [,...] [HAVING SearchCondition]]
  [ORDER BY OrderByClause [,...]]
  [FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...]] 
    [NOWAIT | WAIT Seconds]]

集合演算子UNIONUNION ALLMINUSまたはINTERSECTを含むSELECT文の構文は、次のとおりです。

SELECT [hint] [ROWS m TO n] [ALL] SelectList
  FROM TableSpec [,...]
    [WHERE SearchCondition]
    [GROUP BY GroupByClause [,...] [HAVING SearchCondition] [,...]]
  {UNION [ALL] | MINUS | INTERSECT}
  SELECT [ROWS m TO n] [ALL] SelectList
    FROM TableSpec [,...]
     [WHERE SearchCondition]
     [GROUP BY GroupByClause [,...] [HAVING SearchCondition [,...] ] ]
     [ORDER BY OrderByClause [,...] ]

OrderByClauseの構文は次のとおりです。

{ColumnID|ColumnAlias|Expression} [ASC|DESC] [NULLS { FIRST|LAST }]

パラメータ

パラメータ 説明

[WithClause]

WITH句は、副問合せのファクタリングとも呼ばれ、副問合せブロックに名前を割り当てることができ、その後はその名前をトップレベルのSELECT文で複数回参照できます。WithClauseの構文の詳細は、「WithClause」を参照してください。

hint

SELECT文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

FIRST NumRows

取得する行の数を指定します。NumRowsには、正のINTEGER値か動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

ROWS m TO n

取得する行の範囲を指定し、mは選択する最初の行、nは選択する最後の行です。行のカウントは、行1から始まります。問合せが順序付けられ、nNumRowsの値が同じであれば、問合せSELECT ROWS 1 TO nは、SELECT FIRST NumRowsと同じ行を返します。

mおよびn値には、正のINTEGER値か動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

ALL

問合せ結果の重複する行が削除されないようにします。ALLDISTINCTも指定しない場合は、ALLがデフォルトです。

DISTINCT

問合せ結果の各行が一意となるようにします。この比較では、NULL値はすべて同じとみなされます。重複行は評価されません。

LOB列にはSELECT ...は使用できません。

SelectList

問合せ結果の列の導出方法を指定します。選択リストの構文の詳細は、「SelectList」を参照してください。

FROM TableSpec

SELECT文で参照される表を指定します。問合せごとの表の最大数は24です。

TableSpecは、行を選択する表を指定します。SELECT文のFROM句によって生成された導出表を指定することもできます。TableSpec構文の詳細は、「TableSpec」を参照してください。

WHERE SearchCondition

WHERE句は、取得される行のセットを決定します。通常、SearchConditionFALSEまたはNULLの行は処理から除外されますが、SearchConditionを使用して外部結合を指定でき、外部結合では、関連する内部表の行に関してSearchConditionTRUEと評価されない外部表の行も返され、内部表を参照する投影式はNULLに設定されます。

列およびROWID式に単項演算子(+)を使用して、外部結合を示すことができます。(+)演算子は、内部表を参照する結合条件のすべての列およびROWID式の後に指定する必要があります。(+)演算子を使用するにはいくつか条件があります。通常、これらの条件によって、作成できる外部結合問合せの種類は制限されます。(+)演算子はWHERE句に指定することができ、HAVING句には指定できません。2つの表を外部結合することはできません。外部結合条件をORで結ぶことはできません。

検索条件の詳細は、「検索条件」を参照してください。

GROUP BY GroupByClause [,...]

GROUP BY句には、1つ以上の式を指定して、SelectListに集計関数を指定したり、行のグループに関数を適用する場合のグループ化に使用します。GROUP BY句の構文の詳細は、「GROUP BY句」を参照してください。

HAVING SearchCondition

SELECT文でHAVING句を使用して、集計結果のグループをフィルタ処理できます。SELECT文にHAVING句が存在すると、問合せは集計問合せとなります。WHERE句を除く句の集計関数のソース以外で参照されるすべての列は、GROUP BY句に指定する必要があります。

副問合せは、HAVING句で指定できます。

(+)

単純な結合(内部結合とも呼ばれる)では、SearchConditionで指定された結合条件を満たす結合表の行の組合せごとに1行が返されます。外部結合はこの演算子の拡張機能であり、結合された内部表での一致する行の有無に関係なく、外部表のすべての行が返されます。一致する行がなかった場合は、内部表を参照する投影式にNULL値が与えられます。

ORDER BY OrderByClause [,...]

指定した列または式に基づいて、問合せの結果行をソートします。ソート・キーとして使用する列を、優先順位の高いものから順に指定します。

ORDER BY句は列の別名をサポートしており、列の別名はORDER BY 句でのみ参照できます。単一の問合せ内では、同じ名前を持つ、列の別名を複数宣言できますが、その別名を参照するとエラーが発生します。

ColumnID

選択リストの列に対応する必要があります。ソートする列を指定するには、その名前または序数を指定します。選択リストの最初の列の番号は1です。選択リストの列を参照する場合、それが単純な列でない場合は、列番号を使用する方が適切です。これには、集計関数、算術式、定数などが該当します。

ORDER BY句のColumnIDには、次の構文があります。

{ColumnNumber |[[Owner.]TableName.] ColumnName}

ColumnAlias

ORDER BY句で使用される列の別名は、SelectListの列に対応している必要があります。同じ別名で複数の列を指定できます。

{* | [Owner.]TableName.* |

{Expression | [[Owner.]TableName.]ColumnName |

[[Owner.]TableName.]ROWID

}

[[AS] ColumnAlias]} [,...]

ASC|DESC

ORDER BY句で指定する列ごとに、ソート順序を昇順または降順で指定できます。ASC(昇順)またはDESC(降順)のいずれも指定しない場合は、昇順が適用されます。すべての文字データ型は、NLS_SORTセッション・パラメータの現在の値に従ってソートされます。

NULLS { FIRST|LAST }

ORDER BY句を指定する場合にのみ有効であり、オプションです。ASCまたはDESCを指定する場合、NULLS FIRSTまたはNULLS LASTASCまたはDESCの後に指定する必要があります。

順序付けする問合せでNULL値の行が最初に返されるようにするには、NULLS FIRSTを指定します。順序付けする問合せでNULL値の行が最後に返されるようにするには、NULLS LASTを指定します。行が昇順で返される場合は、NULLS LASTがデフォルトです。行が降順で返される場合は、NULLS FIRSTがデフォルトです。

ORDER BY句を指定する際に、ASCまたはDESC句を指定せず、NULLS FIRSTまたはNULLS LAST句を指定しない場合、デフォルトの順序は、昇順のNULLS LASTです。

FOR UPDATE

[OF [[Owner.]

TableName.]

ColumnName [,...]]

[NOWAIT | WAIT Seconds]

FOR UPDATE

  • FOR UPDATEは、分離モードに関係なく、現在のトランザクションが終了するまで、行のロックを保持します。その行に対する他のすべてのトランザクションの操作は、トランザクションがコミットまたはロールバックされるまで実行されません。

  • FOR UPDATEは、結合、ORDER BYGROUP BYおよびDISTINCT句で使用されます。オプティマイザが選択した表/行のロック方法に応じて、表または行のいずれかの更新ロックが取得されます。

  • FOR UPDATE OF句が指定されていないかぎり、UPDATEモードでは、WHERE句の条件を満たすすべての表の行がロックされます。この句ではロックする表を指定します。

  • 行ロックを使用する場合、FROM句の表リストのすべての表で、条件を満たすすべての行が更新モードでロックされます。条件を満たす行とは、WHERE句を満たす行です。表ロックを使用する場合、条件を満たす行の有無にかかわらず、表は更新モードでロックされます。

  • シリアライズ可能な分離レベルと行ロックが有効になっている場合、条件を満たさない行は共有モードにダウングレードされます。コミット読取り分離レベルと行ロックが有効になっている場合、条件を満たさない行のロックは解除されます。

  • SELECT...FOR UPDATEのロックは、SELECTのロックによってはブロックされません。

FOR UPDATE [OF [[Owner.]TableName.]ColumnName [,...] ]

  • このモードでは、オプションで、更新のためにロックされる表の列名を含めます。

[NOWAIT | WAIT Seconds ]

  • これは、選択した行がロックされている場合の処理方法を指定します。表レベルのロックまたはデータベース・レベルのロックには適用されません。

  • NOWAITは、ロックの待機時間がないことを指定します。ロックを取得できない場合、エラーが返されます。

  • WAIT Secondsはロック・タイムアウト設定を指定します。

    指定された時間内にロックを取得できない場合、エラーが返されます。

    ロックのタイムアウト設定は、秒または小数秒単位で表されます。Secondsのデータ型はNUMBERです。0.0から1000000.0の値が有効です。

  • NOWAITおよびWAITのいずれも指定しない場合、トランザクションのロック・タイムアウト間隔が使用されます。

SelectQuery1

{UNION [ALL] | MINUS | INTERSECT}

SelectQuery2

SelectQuery1およびSelectQuery2の結果が結合されることを指定し、この場合、SelectQuery1およびSelectQuery2は、いくつかの制限を含む一般的なSELECT文です。

UNION演算子は、SelectListに互換性のある2つの問合せの結果を結合します。UNION ALLを指定した場合、両方のSELECT文から返された重複する行が保持されます。その他の場合、重複は削除されます。

MINUS演算子は、最初の問合せで返されたが2番目の問合せで返されなかった行を1つの結果に結合します。

INTERSECT演算子は、両方の問合せで返された行のみを1つの結果に結合します。

両方のSELECT文で選択された対応するエントリのデータ型には、互換性が必要です。データ型を変換するには、CAST演算子を使用します。NULL値可能かどうかは一致している必要はありません。

結果内の列の長さは、列に対応する選択値のうち長い方になります。最終的な結果の列名は、最も左側で選択された列の名前になります。

集合演算子UNIONUNION ALLMINUSINTERSECTを使用して、複数の問合せを組み合せることができます。

集合演算子の一方または両方のオペランドに集合演算子を指定できます。複数の集合演算子やネストされた集合演算子は、左から右に評価されます。

同じ問合せで集合演算子を同時に指定できます。

集合演算子を指定するSELECT文には、次の制限があります。

  • どちらのSELECT文でも、FIRST NumRowsは指定できません。

  • UNIONUNION ALLMINUSまたはINTERSECTSELECT副問合せは、同じ数の投影式が必要です。このことは、INSERT...SELECTにも該当します。

  • 最終結果をソートするためにORDER BYを指定することはできますが、集合演算子の各オペランドで使用することはできません。ORDER BY句で指定できるのは、最も左側のSELECT文の表の列名または列の別名のみです。

  • GROUP BYは、集合演算子の各SELECTオペランドをグループ化するために使用できますが、集合演算子の結果をグループ化するためには使用できません。

  • マテリアライズド・ビューや結合表では、集合演算子を使用できません。

説明

  • 相関名を使用する場合、相関名は基本名の構文ルールを満たしている必要があります。1つのSELECT文のすべての相関名は、一意である必要があります。相関名は、表をその表自体に結合する場合に役立ちます。FROM句内で表の相関名を複数回定義し、選択リストとWHERE句でその相関名を使用して、その表の列を指定します。相関名の詳細は、「TableSpec」を参照してください。

  • SELECT...FOR UPDATEは副問合せを指定するSELECT文で使用できますが、最も外側の問合せでのみ指定できます。

  • 問合せで、FIRST NumRowsまたはROWS m TO nが指定されている場合、返される行の数を制限するためにROWNUMを使用することはできません。

  • FIRST NumRowsROWS m TO nは、同じSELECT文で同時に使用することはできません。

  • PL/SQLでSELECT...INTO文を使用します。PL/SQLの外側でSELECT...INTO文を使用する場合、TimesTenでは構文は許容されますが、暗黙的に無視されます。

この例では、SELECT文での列の別名(max_salary)の使用方法を示します。

SELECT MAX(salary) AS max_salary 
FROM employees 
WHERE employees.hire_date > '2000-01-01 00:00:00';
< 10500 >
1 row found.

この例では、2つの表ordersおよびlineitemsを使用します。

orders表およびlineitems表は、次のように作成されます。

CREATE TABLE orders(orderno INTEGER, orderdate DATE, customer CHAR(20));

CREATE TABLE lineitems(orderno INTEGER, lineno INTEGER, 
  qty INTEGER, unitprice DECIMAL(10,2));

つまり、注文ごとにorders表に1つのレコードがあり、注文の各明細を示すレコードがlineitemsにあります。

年頭以降に入力されたすべての注文の合計を検索するには、HAVING句を使用して、2000年1月1日以降に入力された注文のみを選択します。

SELECT o.orderno, customer, orderdate, SUM(qty * unitprice)
FROM orders o, lineitems l
WHERE o.orderno=l.orderno
GROUP BY o.orderno, customer, orderdate
HAVING orderdate >= DATE '2000-01-01';

次の問合せについて考えてみます。

SELECT * FROM tablea, tableb
WHERE tablea.column1 = tableb.column1 AND tableb.column2 > 5
FOR UPDATE;

この問合せは、次の条件を満たすtableaのすべての行をロックします。

  • tablea.column1の値が、少なくとも1つのtableb.column1の値と同じ。このとき、tableb.column2は5より大きい。

この問合せは、次の条件を満たすtablebのすべての行もロックします。

  • tableb.column2の値が5よりも大きい。

  • tableb.column1の値が、少なくとも1つのtablea.column1の値と同じ。

WHERE句を指定しない場合、両方の表のすべての行がロックされます。

この例は、(+)結合演算子を示しています。

SELECT * FROM t1, t2
WHERE t1.x = t2.x(+);

外部結合条件はORで連結できないため、次の問合せはエラーとなります。

SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) OR t3.y = 5;

次の問合せは有効です。

SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) AND (t3.y = 4 OR t3.y = 5);

IN演算子を使用して(+)記号の付いた列を比較することはできません。たとえば、次の問合せはエラーとなります。

SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) AND t2.y(+) IN (4,5);

次の問合せは有効です。

SELECT * FROM t1, t2, t3
WHERE t1.x = t2.x(+) AND t1.y IN (4,5);

次の問合せは、内部結合になります。(+)演算子が指定されていない条件は、内部結合として扱われます。

SELECT * FROM t1, t2
WHERE t1.x = t2.x(+) AND t1.y = t2.y;

次の問合せのWHERE句には、外部結合の内部表の列と定数を比較する条件が含まれています。(+)演算子が指定されていないため、この条件は内部結合として扱われます。

SELECT * FROM t1, t2
WHERE t1.x = t2.x(+) AND t2.y = 3;

結合のその他の例は、「JoinedTable」を参照してください。

次の例は、student表の順序の現在の値を返します。

SELECT SEQ.CURRVAL FROM student;

次の問合せのFROM句にはSELECT文が含まれているため、導出表が生成されます。

SELECT * FROM t1, (SELECT MAX(x2) maxx2 FROM t2) tab2 
WHERE t1.x1 = tab2.maxx2;

次の問合せは、2つのSELECT文の結果を結合します。

SELECT * FROM t1 
WHERE x1 IN (SELECT x2 FROM t2) 
UNION 
SELECT * FROM t1 
WHERE x1 IN (SELECT x3 FROM t3);

次のように、カテゴリ内の最高価格と同じ価格のすべての注文を選択します。

SELECT * FROM orders WHERE price = (SELECT MAX(price) 
FROM stock WHERE stock.cat=orders.cat);

次の例では、INTERSECT集合演算子の使用方法を示します。employees表にNULLdepartment_id値があります。departments表では、department_idNOT NULLの主キーとして定義されます。INTERSECT集合演算子を使用して返される行には、department_id値がNULLdepartments表の行は含まれません。

Command> SELECT department_id FROM employees INTERSECT SELECT department_id 
         FROM departments;
< 10 >
< 20 >
< 30 >
< 40 >
< 50 >
< 60 >
< 70 >
< 80 >
< 90 >
< 100 >
< 110 >
11 rows found.
Command> SELECT DISTINCT department_id FROM employees;
< 10 >
< 20 >
< 30 >
< 40 >
< 50 >
< 60 >
< 70 >
< 80 >
< 90 >
< 100 >
< 110 >
< <NULL> >
12 rows found.

次の例では、最初の問合せでは返されるが、2番目の問合せでは返されない行を組み合せて、MINUS集合演算子の使用方法を示します。employees表にNULLdepartment_id値を含む行のみが返されます。

Command> SELECT department_id FROM employees 
         MINUS SELECT department_id FROM departments;
< <NULL> >
1 row found.

次の例では、GROUP BY句におけるSUBSTR式の使用方法およびHAVING句における副問合せの使用方法を示します。最初の10行が返されます。

Command> SELECT ROWS 1 TO 10 SUBSTR (job_id, 4,10), department_id, manager_id, 
         SUM (salary) FROM employees
         GROUP BY SUBSTR (job_id,4,10),department_id, manager_id
         HAVING (department_id, manager_id) IN
          (SELECT department_id, manager_id FROM employees x
           WHERE x.department_id = employees.department_id)
         ORDER BY SUBSTR (job_id, 4,10),department_id,manager_id;
< ACCOUNT, 100, 108, 39600 >
< ACCOUNT, 110, 205, 8300 >
< ASST, 10, 101, 4400 >
< CLERK, 30, 114, 13900 >
< CLERK, 50, 120, 22100 >
< CLERK, 50, 121, 25400 >
< CLERK, 50, 122, 23600 >
< CLERK, 50, 123, 25900 >
< CLERK, 50, 124, 23000 >
< MAN, 20, 100, 13000 >
10 rows found.

次の例では、更新のためにemployees表をロックし、ロックが取得できるまで10秒間待機します。ロックが10秒以内に取得できない場合、エラーが返されます。最初の5行が選択されます。

Command> SELECT FIRST 5 last_name FROM employees FOR UPDATE WAIT 10;
< King >
< Kochhar >
< De Haan >
< Hunold >
< Ernst >
5 rows found.

次の例では、更新のためにdepartments表をロックします。選択した行が別のプロセスにロックされており、ロックが取得できない場合はエラーが返されます。これは、NOWAITが指定されているためです。

Command> SELECT FIRST 5 last_name e FROM employees e, departments d 
         WHERE e.department_id = d.department_id 
         FOR UPDATE OF d.department_id NOWAIT;
< Whalen >
< Hartstein >
< Fay >
< Raphaely >
< Khoo >
5 rows found.

次のように、HRスキーマを使用して、副問合せとFOR UPDATE句を同時に使用する例を示します。

Command> SELECT employee_id, job_id FROM job_history 
         WHERE (employee_id, job_id) NOT IN (SELECT employee_id, job_id 
         FROM employees) 
         FOR UPDATE;
< 101, AC_ACCOUNT >
< 101, AC_MGR >
< 102, IT_PROG >
< 114, ST_CLERK >
< 122, ST_CLERK >
< 176, SA_MAN >
< 200, AC_ACCOUNT >
< 201, MK_REP >
8 rows found.

次のように、SELECT ROWS m TO nおよびSELECT FIRSTの動的パラメータのプレースホルダを使用します。

Command> SELECT ROWS ? TO ? employee_id FROM employees;

Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1 (TT_INTEGER) > 1
Enter Parameter 2 (TT_INTEGER) > 3
< 100 >
< 101 >
< 102 >
3 rows found.
Command> SELECT ROWS :a TO :b employee_id FROM employees;

Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1 (TT_INTEGER) > 1
Enter Parameter 2 (TT_INTEGER) > 3
< 100 >
< 101 >
< 102 >
3 rows found.
Command> SELECT FIRST ? employee_id FROM employees;

Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1 (TT_INTEGER) > 3
< 100 >
< 101 >
< 102 >
3 rows found.

次の例では、ORDER BY句でのNULLS LASTの使用方法を示します。employees表を問い合せて、コミッションの割合が.30より大きいかNULLである従業員を検索します。最初の7人の従業員を選択し、commission_pctlast_nameで順序付けします。commision_pctを降順で順序付けし、NULLS LASTを使用してNULL値の行を問合せの最後に表示します。commission_pctlast_nameを出力します。

Command> SELECT FIRST 7 commission_pct,last_name
         FROM employees where commission_pct > .30
         OR commission_pct IS NULL
         ORDER BY commission_pct DESC NULLS LAST,last_name;
< .4, Russell >
< .35, King >
< .35, McEwen >
< .35, Sully >
< <NULL>, Atkinson >
< <NULL>, Austin >
< <NULL>, Baer >
7 rows found.

WithClause

構文

WithClauseには、次の構文があります。

WITH QueryName AS ( Subquery ) [, QueryName AS ( Subquery )] ...

パラメータ

WithClauseには、次のパラメータがあります。

パラメータ 説明

QueryName AS (Subquery)

SELECT文で複数回使用できる副問合せの別名を指定します。

説明

副問合せのファクタリングによってWITH句が提供され、この句を使用して副問合せブロックに名前を割り当てることができ、その後はその名前をメインのSELECT問合せで複数回参照できます。問合せ名は、メインの問合せとメインの問合せに含まれる副問合せで参照できます。

WITH句は、メインのSELECT文の接頭辞としてのみ定義できます。

副問合せのファクタリングは、重複する、または複雑な副問合せブロックを1つ以上の場所で使用する複雑な問合せの簡素化に役立ちます。また、TimesTenでは、副問合せのファクタリングを使用し、副問合せブロックを一度評価およびマテリアライズして、その結果をSELECT文での各参照に提供することで、問合せを最適化します。

メインの問合せで集合演算子UNIONMINUS、およびINTERSECTを指定できます。

WITH句の使用制限:

  • ビューまたはマテリアライズド・ビュー定義でWITH句を使用しないでください。

  • 再帰的な副問合せのファクタリングはサポートされていません。

  • 副問合せまたは導出表ではWITH句を使用しないでください。

  • 問合せの別名に列パラメータ・リストを指定できません。たとえば、TimesTenではWITH w1(c1,c2) AS ...はサポートされません。

次の例では、初期問合せブロックに対して問合せ名dept_costsおよびavg_costを作成し、これらの名前をメインの問合せの本体で使用します。

Command> WITH dept_costs AS (
         SELECT department_name, SUM(salary) dept_total
         FROM employees e, departments d
         WHERE e.department_id = d.department_id
         GROUP BY department_name),
          avg_cost AS (
         SELECT SUM(dept_total)/COUNT(*) avg
         FROM dept_costs)
         SELECT * FROM dept_costs
         WHERE dept_total >
         (SELECT avg FROM avg_cost)
         ORDER BY department_name;

> DEPARTMENT_NAME DEPT_TOTAL
-------------------------------
Sales 304500
Shipping 156400

SelectList

SQL構文

SELECT文のSelectListパラメータには、次の構文があります。

{* | [Owner.]TableName.* | 
  { Expression | [[Owner.]TableName.]ColumnName |
    [[Owner.]TableName.]ROWID | NULL
  }
  [[AS] ColumnAlias] } [,...]

パラメータ

SELECT文のSelectListパラメータには、次のパラメータがあります。

パラメータ 説明

*

問合せ結果の列として、FROM句に指定されたすべての表のすべての列を含めます。

[Owner.]TableName.*

指定した表のすべての列を結果に含めます。

Expression

集計問合せに、GROUP BY句または集計関数が含まれます。

選択リストが集計問合せでない場合、列参照はFROM句内の表を参照する必要があります。

集計問合せの選択リスト内の列参照は、GROUP BY句内の列リストを参照する必要があります。GROUP BY句がない場合、列参照はFROM句内の表を参照する必要があります。GROUP BY句の詳細は、「GROUP BY句」を参照してください。

[[Owner.]Table.] ColumnName

指定された所有者の指定された表の特定の列を含めます。順序のCURRVALまたはNEXTVAL列も指定できます。詳細は、「TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法」を参照してください。

[[Owner.]Table.] ROWID

指定された所有者の指定された表のROWID擬似列を含めます。

NULL

NULLを指定した場合、デフォルトではVARCHAR(0)のデータ型が生成されます。結果を別のデータ型に変換するには、CAST関数を使用します。ORDER BY句にはNULLを指定できます。

ColumnAlias

ORDER BY句で使用される列の別名は、SelectListの列に対応している必要があります。同じ別名で複数の列を指定できます。

{*|[Owner.]TableName.*|

{Expression |[[Owner.]TableName.]ColumnName |

[[Owner.]TableName.]ROWID

}

[[AS] ColumnAlias]} [,...]

説明

  • 各句は、構文に示されたとおりの順序で指定する必要があります。

  • TimesTenでは、SelectListで副問合せはサポートされません。

  • 選択リストの結果列は、次のいずれかの方法で取得できます。

    • 結果列は、FROM句にリストされているいずれかの表から直接取得できます。

    • 結果列の値は、FROM句にリストされている表の特定の列の値を使用して、算術式を使用して計算できます。

    • 単一表の複数の列の値を算術式で結合して、結果列の値を生成できます。

    • 集計関数(AVGMAXMINSUMおよびCOUNT)を使用すると、行のグループの結果列の値を計算できます。集計関数は、単独で使用することも、式の中で使用することもできます。同じ表の複数の列を処理するDISTINCT修飾子を含む集計関数を指定できます。GROUP BY句を指定しない場合は、問合せを満たすすべての行に関数が適用されます。GROUP BY句を指定した場合は、GROUP BY句で定義された各グループに1回ずつ関数が適用されます。GROUP BY句とともに集計関数を使用する場合は、選択リストに集計関数、算術式、GROUP BY句の列を含めることができます。GROUP BY句の詳細は、「GROUP BY句」を参照してください。

    • 固定値を含む結果列は、定数を指定するか、または定数のみを含む式を使用して作成できます。

  • 選択リストを使用すると、結果列の取得方法を指定できるだけでなく、問合せ結果を表示する位置を制御できます。選択リストで最初に指定した結果列が問合せ結果の最も左側の列に表示され、残りの列も同様に表示されます。

  • SelectListの結果列は、左から右の順に番号が付けられます。左端の列の番号は1です。ORDER BY句内のこの列番号によって、結果列を参照できます。これは、算術式または集計関数で定義した列を参照する場合に特に便利です。

  • 表をその表自体と結合するには、FROM句内で表の相関名を複数回定義し、選択リストとWHERE句でその相関名を使用して、その表の列を指定します。

  • GROUP BY句を使用した場合、次のように、選択リストに従ってグループごとに1つの応答が返されます。

    • 行は、グループ化される前にWHERE句によって削除されます。

    • GROUP BY句は、結果行をグループ化します。詳細は、「GROUP BY句」を参照してください。

    • 選択リストの集計関数は、グループ単位で計算されます。

次の例では、部品が届くまでの平均日数の値のみが返されます。

SELECT AVG(deliverydays)
FROM purchasing.supplyprice;

次の文は、20日未満で配送されるすべての部品の部品番号および配送時刻を返します。

SELECT partnumber, deliverydays
FROM purchasing.supplyprice
WHERE deliverydays < 20;

単一の部品で複数行が返される場合があります。

次の文は、各部品の部品番号と平均価格を返します。

SELECT partnumber, AVG(unitprice)
FROM purchasing.supplyprice
GROUP BY partnumber;

次の例では、結合によってカリフォルニア州の業者の名前と住所が返されます。行は、partnumberの値の昇順で返されます。重複する部品番号を含む行は、vendornameの値の昇順で返されます。FROM句では、選択リストとWHERE句の両方で使用される、2つの相関名(vs)を定義しています。vendornumber列は、vendorssupplypriceで共通する唯一の列です。

SELECT partnumber, vendorname, s.vendornumber,vendorcity
  FROM purchasing.supplyprice s, purchasing.vendors v
  WHERE s.vendornumber = v.vendornumber AND vendorstate = 'CA'
ORDER BY partnumber, vendorname;

次の問合せでは、表purchasing.partsをそれ自体に結合して、シリアル番号が1133-P-01の部品と同じ販売価格の部品を特定します。

SELECT q.partnumber, q.salesprice
  FROM purchasing.parts p, purchasing.parts q
  WHERE p.salesprice = q.salesprice AND p.serialnumber = '1133-P-01';

次に、特定の行のROWIDを取得する方法の例を示します。取得したROWIDの値は、後で別のSELECT文、DELETE文またはUPDATE文で使用できます。

SELECT rowid
FROM purchasing.vendors
WHERE vendornumber = 123;

次に、列の別名を使用して、employees表からデータを取得する方法の例を示します。

SELECT MAX(salary) AS max_salary FROM employees;

TableSpec

SQL構文

SELECT文のTableSpecパラメータには、次の構文があります。

TableNameSyntax | JoinedTable | DerivedTable

TableNameSyntax::=  [Owner.]TableName  [CorrelationName] |
                   ([Owner.]TableName) [CorrelationName] |
                   ([Owner.]TableName  [CorrelationName])

単純な表指定の構文は、次のとおりです。

[Owner.]TableName or ([Owner.]TableName)

パラメータ

SELECT文のTableSpecパラメータには、次のパラメータがあります。

パラメータ 説明

TableNameSyntax

参照する表を指定します。カッコはオプションです。

CorrelationName

CorrelationNameは、直前で指定した表の別名を指定します。SELECT文の他の場所でその表の列にアクセスする際、文の中で実際の表名ではなく相関名を使用します。相関名の有効範囲は、それが使用されているSQL文です。相関名は、基本名の構文ルールを満たしている必要があります。詳細は、「基本名」を参照してください。

単一の文のすべての相関名は、一意である必要があります。

JoinedTable

表の結合を定義する問合せを指定します。詳細は、「JoinedTable」を参照してください。

DerivedTable

SELECT文の評価から導出された表を指定します。このSELECT文には、FIRST NumRowsまたはROWS m TO n句は指定できません。詳細は、「DerivedTable」を参照してください。

JoinedTable

JoinedTableパラメータには、CROSS JOININNER JOINLEFT OUTER JOINまたはRIGHT OUTER JOINから導出された表を指定します。

SQL構文

JoinedTableの構文は次のとおりです。

{CrossJoin | QualifiedJoin}

CrossJoinは、次のようになります。

TableSpec1 CROSS JOIN TableSpec2

また、QualifiedJoinは、次のようになります。

TableSpec1 [JoinType] JOIN TableSpec2 ON SearchCondition

QualifiedJoinパラメータでは、JoinTypeの構文は次のようになります。

{INNER | LEFT [OUTER] | RIGHT [OUTER]}

パラメータ

SELECT文のTableSpec句のJoinedTableパラメータには、次のパラメータがあります。

パラメータ 説明

CrossJoin

2つの表に相互結合を実行します。戻り値は、入力表のデカルト積となる結果表です。結果は、次の構文を持つ問合せと同じになります。

SELECT Selectlist FROM Table1, Table2

QualifiedJoin

結合がJoinTypeの種類になることを指定します。

TableSpec1

JOIN句の最初の表を指定します。

TableSpec2

JOIN句の2番目の表を指定します。

JoinType JOIN

実行する結合の種類を指定します。サポートされる結合の種類は、次のとおりです。

  • INNER

  • LEFT [OUTER]

  • RIGHT [OUTER]

INNER JOINは、SearchConditionを満たす2つの表の行を結合した結果表を返します。

LEFT OUTER JOINは、SearchConditionに一致する結合行と、SearchConditionがTRUEと評価されなかった最初の表の行および2番目の表のすべての行を返します。

RIGHT OUTER JOINは、SearchConditionに一致する結合行と、SearchConditionがTRUEと評価されなかった2番目の表の行および最初の表のすべての行を返します。

ON SearchCondition

JOINパラメータで使用する検索基準を指定します。SearchConditionが参照できるのは、現在条件を満たしている結合内で参照されている表のみです。

説明

  • FULL OUTER JOINはサポートされていません。

  • 結合表は、マテリアライズド・ビューを定義する文以外のすべての文で、FROM句内の表を置き換えるために使用できます。したがって、結合表は、UNIONMINUSINTERSECT、副問合せ、非マテリアライズド・ビューまたは導出表で使用できます。

  • 結合表のオペランドに副問合せは指定できません。たとえば、次の文はサポートされていません

    SELECT * FROM
      regions INNER JOIN (SELECT * FROM countries) table2
      ON regions.region_id=table2.region_id;
    
  • 結合表のオペランドとしてビューを指定できます。

  • 結合表のオペランドとして一時表は指定できません。

  • OUTER JOINは、WHERE句のSearchConditionでの(+)演算子の使用またはJOIN表操作の使用という2つの方法で指定できます。同じ文で2つの指定方式の両方を使用することはできません。

  • 結合順およびグループ化はJoinedTable演算と併用できますが、(+)演算子とは併用できません。たとえば、次の演算は(+)演算子と併用できません

    t LEFT JOIN (t2 INNER JOIN t3 ON x2=x3) ON (x1 = x2 - x3)

これらの例では、HRスキーマのregionsおよびcountries表を使用します。

次の例では、左外部結合を実行します。

SELECT * FROM regions LEFT JOIN countries
  ON regions.region_id=countries.region_id
  WHERE regions.region_id=3;

< 3, Asia, JP, Japan, 3 >
< 3, Asia, CN, China, 3 >
< 3, Asia, IN, India, 3 >
< 3, Asia, AU, Australia, 3 >
< 3, Asia, SG, Singapore, 3 >
< 3, Asia, HK, HongKong, 3 >
6 rows found.

次のように、左外部結合を(+)演算子とともに実行することもできます。

SELECT * FROM regions, countries
  WHERE regions.region_id=countries.region_id (+)
    AND regions.region_id=3;

次の例では、右外部結合を実行します。

SELECT * FROM regions RIGHT JOIN countries
  ON regions.region_id=wountries.region_id
  WHERE regions.region_id=3;

< AU, Australia, 3, 3, Asia >
< CN, China, 3, 3, Asia >
< HK, HongKong, 3, 3, Asia >
< IN, India, 3, 3, Asia >
< JP, Japan, 3, 3, Asia >
< SG, Singapore, 3, 3, Asia >
6 rows found.

次の例では、右外部結合を(+)演算子とともに実行します。

SELECT * FROM countries, regions
       WHERE regions.region_id (+)=countries.region_id
       AND countries.region_id=3;
< JP, Japan, 3, 3, Asia >
< CN, China, 3, 3, Asia >
< IN, India, 3, 3, Asia >
< AU, Australia, 3, 3, Asia >
< SG, Singapore, 3, 3, Asia >
< HK, HongKong, 3, 3, Asia >
6 rows found.

右結合方式では、同じ行が異なる表示順序で生成されることに注意してください。結合結果の行の順序は予期できません。

次の例では、内部結合を実行します。

SELECT * FROM regions INNER JOIN countries
  ON regions.region_id=countries.region_id
  WHERE regions.region_id=2;

< 2, Americas, US, United States of America, 2 >
< 2, Americas, CA, Canada, 2 >
< 2, Americas, BR, Brazil, 2 >
< 2, Americas, MX, Mexico, 2 >
< 2, Americas, AR, Argentina, 2 >
5 rows found.

次の例では、相互結合を実行します。

SELECT * FROM regions CROSS JOIN countries 
  WHERE regions.region_id=1;

< 1, Europe, AR, Argentina, 2 >
< 1, Europe, AU, Australia, 3 >
< 1, Europe, BE, Belgium, 1 >
< 1, Europe, BR, Brazil, 2 >
...
< 1, Europe, SG, Singapore, 3 >
< 1, Europe, UK, United Kingdom, 1 >
< 1, Europe, US, United States of America, 2 >
< 1, Europe, ZM, Zambia, 4 >
< 1, Europe, ZW, Zimbabwe, 4 >
25 rows found.

DerivedTable

導出表は、FROM句のSELECT文の結果で、別名を持ちます。

SQL構文

DerivedTableの構文は次のとおりです。

(Subquery) [CorrelationName]

パラメータ

SELECT文のTableSpec句のDerivedTableパラメータには、次のパラメータがあります。

パラメータ 説明

Subquery

副問合せの詳細は、「副問合せ」を参照してください。

CorrelationName

オプションで、CorrelationNameを使用して、導出表の別名を指定します。問合せで参照される表名とは異なる名前である必要があります。

説明

導出表を使用する場合は、次の制限が適用されます。

  • 別の表を参照しないSELECT文ではDUAL表を使用できますが、この場合は少なくとも1つの行を返す必要があります。DUALから選択することは、定数式(結果が定数値になる式)をSELECT文で計算する場合に便利です。 DUALには行が1つしかないため、定数が返されるのは1回のみです。

  • Subqueryは、別の導出表の列を参照できません。

  • 導出表は、結合表のソースとしては使用できません。

  • 導出表は、DELETE文またはUPDATE文のターゲットとしては使用できません。

GROUP BY句

GROUP BY句を指定すると、データベースで、選択した行を各行の式の値に基づいてグループ化し、各グループのサマリー情報を1行戻すことができます。GROUP BY句を省略した場合、問合せの結果全体が1つのグループとして扱われます。この句にCUBEまたはROLLUPを指定した場合、標準グループ化の他に超集合グループ化が結果に含まれます。

GROUP BY句の式では、次のことが可能です。

  • 1つまたは複数の列を指定します。

  • 算術演算、ROWID擬似列またはNULLを使用します。

  • 日付、定数または動的パラメータを使用します。

  • ROLLUPまたはCUBE句を使用すると、標準グループ化の他に超集合グループ化が結果で生成されます。超集合グループ化は、GROUP BY句で標準グループ化とともに返される、計算された小計および合計です。

  • GROUPING SETS句を使用して、生成する超集合グループ化を指定します。

GROUP BY句を使用する場合、SelectListには集計関数およびGROUP BY句で参照される列のみを含めることができます。選択リストに構成要素*TableName.*またはOwner.TableName.*が含まれている場合は、*に含まれているすべての列をGROUP BY句に含める必要があります。グループ化された行では、NULL値は同じ値とみなされます。他のすべての列が同じである場合、列中のすべてのNULL値は単一のグループにまとめられます。

ノート:

NULLグループ化を識別し、潜在的に超集合グループ化から削除するには、GROUPING関数を使用します。詳細は、「GROUPING」を参照してください。

SQL構文

GROUP BY句の一般的な構文は次のとおりです。

GROUP BY
 {Expression | RollupCubeClause | GroupingSetsClause }[,...]
 
GroupingSetsClause::=  GROUPING SETS 
 GroupingExpressionList | RollupCubeClause [,...]

RollupCubeClause
{ ROLLUP | CUBE } ( GroupingExpressionList ) }

GroupingExpressionList::=   
{ Expression | ExpressionList [, { Expression | ExpressionList } ] ...}
 
ExpressionList :: = ( Expression [, Expression ] ...)
パラメータ
パラメータ 説明

Expression

有効な式の構文。詳細は、「式」を参照してください。

RollupCubeClause

GROUP BY句には、1つ以上のROLLUPまたはCUBE句が含まれることがあります。

GroupingSetsClause

GROUP BY句には、1つ以上のGROUPING SETS句が含まれることがあります。GROUPING SETS句を使用すると、データベースが戻すデータのグループを明示的に指定できます。詳細は、「GROUPING SETS」を参照してください。

GroupingExpressionList

GROUP BY句には、複数の式または式リストを含めることができます。

ROLLUP GroupingExpressionList

ROLLUP句は、グループから超集合行を生成するために使用します。詳細は、「ROLLUP」を参照してください。

CUBE GroupingExpressionList

CUBE句は、CUBE句のグルーピング列の可能なすべての組合せの値に基づいて、選択された行をグループ化します。詳細は、「CUBE」を参照してください。

ExpressionList

カンマで区切られた、1つ以上の式のリスト。

次のGROUP BYの例では、employees表の従業員の給与を合計し、SUBSTR式を使用して、職務権限ごとにデータをグループ化します。

Command> SELECT SUBSTR (job_id, 4,10), SUM (salary) FROM employees
         GROUP BY SUBSTR (job_id,4,10);
< PRES, 24000 >
< VP, 34000 >
< PROG, 28800 >
< MGR, 24000 >
< ACCOUNT, 47900 >
< MAN, 121400 >
< CLERK, 133900 >
< REP, 273000 >
< ASST, 4400 >
9 rows found.

emp_details_viewを問い合せて、先頭の10部門およびその部門のマネージャを選択し、その部門で同じマネージャの管理下にある従業員の数をカウントします。GROUP BY句を使用して、結果を部門およびマネージャごとにグループ化します。

Command> columnlabels on;
Command> SELECT first 10 department_id AS DEPT, manager_id AS MGR,
         COUNT(employee_id) AS NUM_EMP
         FROM emp_details_view
         GROUP BY (department_id, manager_id)
         ORDER BY department_id, manager_id;

DEPT, MGR, NUM_EMP
< 10, 101, 1 >
< 20, 100, 1 >
< 20, 201, 1 >
< 30, 100, 1 >
< 30, 114, 5 >
< 40, 101, 1 >
< 50, 100, 5 >
< 50, 120, 8 >
< 50, 121, 8 >
< 50, 122, 8 >
10 rows found.
ROLLUP、CUBEおよびGROUPING SETS句

次の定義では、列をROLLUPCUBEおよびGROUPING SETS句でグループ化する方法を説明します。

  • グルーピング列: GROUP BY句で使用される1つの列。たとえば、次のGROUP BY句では、XYおよびZはグループ列です。

    GROUP BY X, GROUPING SETS(Y, Z)
    
  • 複合列: カッコ内のグルーピング列のリスト。たとえば、次の句では、(C1, C2)および(C3, C4)は複合列です。

    GROUP BY ROLLUP( (C1,C2), (C3,C4), C5);
    
  • グルーピング: グルーピングは、グルーピング・セット内の1つの集計レベルです。たとえば、次の文では、(C1)および(C2, C3)は個別のグルーピングです。

    GROUP BY GROUPING SETS(C1, (C2,C3));
    
  • グルーピング・セット: カッコ内のグルーピングのコレクション。たとえば、次の文では、(C1, (C2, C3))および(C2, (C4, C5))は、2つの個別のグルーピング・セットです。

    GROUP BY GROUPING SETS(C1, (C2,C3)), GROUPING SETS(C2, (C4, C5));
    
  • 連結グルーピング・セット: 複数のグルーピング・セットをカンマで区切ります。結果は、各グルーピング・セットからのグループ化のクロス積です。

  • 総計または空のセット列: 総計または空のセットのグルーピングは、すべての行を1つのグループとみなすことによって集計を計算します。ROLLUPおよびCUBE句では、総計は自動的に結果に含まれますが、GROUPING SETS句では、空のカッコ( )を指定することで要求します。

重複したグルーピング列をROLLUPCUBEまたはGROUPING SETSで使用できます。ただし、結果行は重複します。

ROLLUPCUBEおよびGROUPING SETS句は、マテリアライズド・ビュー定義ではサポートされていません。

次の項では、GROUPING SETSROLLUPおよびCUBE句について説明します。

GROUPING SETS

GROUPING SETS句を使用すると、データベースが戻すデータのグループを明示的に指定できます。目的の超集合サマリーのみが生成されるように、必要なグループのみをカッコで囲んで指定します。

次の文は3つのグループを生成し、1つのグループは各性別と年の列について結果を返し、2番目のグループは各月のサマリー超集合について結果を返し、最後のグループは総計について結果を返します。

SELECT GENDER, YEAR, MONTH,
   SUM (NUM_OF_STUDENTS) AS TOTAL
   FROM INSTRUCTOR_SUMMARY
   GROUP BY GROUPING SETS ((GENDER, YEAR),  -- 1ST GROUP
                           (MONTH), -- 2ND GROUP
                           ()); -- 3RD GROUP
 

複数のGROUPING SETSを組み合せて、複数のGROUPING SETS間の特定の組合せを生成できます。次の文には、2つのGROUPING SETS句があります。

GROUP BY GROUPING SETS (YEAR, MONTH),
         GROUPING SETS (WEEK, DAY);

これは、次のGROUPING SETS文と同等です。

GROUP BY GROUPING SETS (YEAR, WEEK), 
 (YEAR, DAY), 
 (MONTH, WEEK), 
 (MONTH, DAY);

次のように、GROUP BY句に通常のグルーピング列とGROUPING SETS句の両方がある場合、結果は通常のグルーピング列でグループ化されます。

GROUP BY a, b GROUPING SETS(c, d);

これは、次のルールと同等です。

GROUP BY GROUPING SETS((a, b, c), (a, b, d));

次の例は、(region_name, country_name)、state_provinceおよび総計のグルーピング・セットを指定します。

Command> SELECT region_name AS Region,
           country_name AS Country,
           state_province AS State,
            COUNT(employee_id) AS "Total Emp"
         FROM regions r, countries c, locations l, departments d, employees e
         WHERE r.region_id = c.region_id AND
           l.country_id = c.country_id AND
           d.location_id = l.location_id AND
           d.department_id = e.department_id
         GROUP BY grouping sets((region_name, country_name), state_province, ())
         ORDER BY region_name, state_province;
 
REGION, COUNTRY, STATE, TOTAL EMP
< Americas, Canada, <NULL>, 2 >
< Americas, United States of America, <NULL>, 68 >
< Europe, Germany, <NULL>, 1 >
< Europe, United Kingdom, <NULL>, 35 >
< <NULL>, <NULL>, Bavaria, 1 >
< <NULL>, <NULL>, California, 45 >
< <NULL>, <NULL>, Ontario, 2 >
< <NULL>, <NULL>, Oxford, 34 >
< <NULL>, <NULL>, Texas, 5 >
< <NULL>, <NULL>, Washington, 18 >
< <NULL>, <NULL>, <NULL>, 106 >
< <NULL>, <NULL>, <NULL>, 1 >
12 rows found.

ROLLUP

ROLLUPは、GROUP BY句で使用します。ROLLUPSUMとともに使用すると、最も詳細なレベルの小計(ROLLUP句で指定したすべての列)から総計レベルまでが、レベルごとに列を1つずつ削除して生成されます。これらは超集合行と呼ばれます。

ROLLUP句では次の項目が返されます。

  • ROLLUPを使用しないでGROUP BYによって生成される通常の集計行。

  • ROLLUP句で指定されたグルーピング・リストに基づく小計。ROLLUPは、その引数として、グルーピング列の順序付けリストを取ります。各小計は、グルーピング列の順序付けリストに対して、総計に達するまで最も右にあるグルーピング列を削除しながら作成されます。たとえば、GROUP BY ROLLUP(x, y, z)を指定した場合、返される超集合グループは(x,y,z)、(x,y)、(x)、( )のようになります。

    作成される小計の数はn+1個の集計レベルであり、nはグルーピング列の数です。たとえば、3つの式(n=3)がROLLUP句にある場合、n+1 = 3+1、つまり4個のグルーピングになります。

  • 総計行。

カッコ内の複合列を使用して列をグループ化できます。たとえば、次のような文があるとします。

GROUP BY ROLLUP( (a, b), (c, d), e);

(a, b)および(c, d)複合列は、データベースによってROLLUPの結果が生成される際に、1つの単位として処理されます。この例では、返されるグルーピング・セットは、((a, b), (c, d), e )((a, b), (c, d))(a, b)および()となります。

次のように、複数のROLLUP句をSELECT文で実行できます。

SELECT C1, COUNT(*)
FROM T
GROUP BY ROLLUP(a, b), ROLLUP(c, d);

これは、次の文と同じです。

SELECT C1, COUNT(*)
FROM T
GROUP BY GROUPING SETS((a, b),(a),()), 
 GROUPING SETS((c, d),(c), ());

この例では、employees表を問い合せて、先頭の10部門を選択し、各部門の各マネージャの管理下にある従業員数を戻します。ROLLUPを使用して、各部門の従業員数の小計を算出し、会社のすべての従業員の総計を戻します。

Command> SELECT first 10 department_id AS Dept,
          manager_id AS Mgr,
         COUNT(employee_id) AS "Total emp"
         FROM employees
         GROUP BY ROLLUP(department_id, manager_id)
         ORDER BY department_id, manager_id;
 
DEPT, MGR, TOTAL EMP
< 10, 101, 1 >
< 10, <NULL>, 1 >
< 20, 100, 1 >
< 20, 201, 1 >
< 20, <NULL>, 2 >
< 30, 100, 1 >
< 30, 114, 5 >
< 30, <NULL>, 6 >
< 40, 101, 1 >
< 40, <NULL>, 1 >
10 rows found.

次の問合せによって、各地域、国および州または都道府県の従業員数が返されます。ロールアップによって、各州または都道府県および各国の全従業員の小計の超集合行、および会社の全従業員の総計が返されます。地域と国を(カッコに入れて)独自の単位として組み合せることによって、ロールアップでは各地域の全従業員は返されません。

Command> SELECT region_name AS Region,
          country_name AS Country,
          state_province AS State,
          COUNT(employee_id) AS "Total Emp"
         FROM regions r, countries c, locations l, departments d, employees e
         WHERE r.region_id = c.region_id
         AND l.country_id = c.country_id
         AND d.location_id = l.location_id
         AND d.department_id = e.department_id
         GROUP BY rollup((region_name, country_name), state_province)
         ORDER BY region_name;

REGION, COUNTRY, STATE, TOTAL EMP
< Americas, Canada, Ontario, 2 > 
< Americas, United States of America, Texas, 5 > 
< Americas, United States of America, California, 45 > 
< Americas, United States of America, Washington, 18 > 
< Americas, Canada, <NULL>, 2 > 
< Americas, United States of America, <NULL>, 68 > 
< Europe, Germany, Bavaria, 1 > 
< Europe, United Kingdom, <NULL>, 1 > 
< Europe, United Kingdom, Oxford, 34 > 
< Europe, Germany, <NULL>, 1 > 
< Europe, United Kingdom, <NULL>, 35 > 
< <NULL>, <NULL>, <NULL>, 106 > 
12 rows found. 

CUBE

CUBE句は、CUBE句のグルーピング列の可能なすべての組合せの値に基づいて、選択された行をグループ化します。グループごとに1つのサマリー情報行が戻されます。たとえば、3つの式(n=3)がCUBE句にある場合、2n = 23、つまり8個のグルーピングになります。n個の式の値でグループ化した行を標準行、その他のすべてを超集合行といいます。複合列を使用してグループ化できます。たとえば、一般的に要求されるCUBE操作は、月、州および販売製品のすべての組合せに基づいた州の売上小計用です。

GROUP BY CUBE(a, b, c)を指定した場合、結果として生成される集計グルーピングは、(a,b,c)、(a,b)、(a,c)、(b,c)、a、b、c( )です。

この例では、各地域および国の従業員数を戻し、次の問合せを発行します。

Command> SELECT region_name AS Region,
          country_name AS Country,
          COUNT(employee_id) AS "Total Emp"
       FROM regions r, countries c, locations l, departments d, employees e
       WHERE r.region_id = c.region_id
       AND l.country_id = c.country_id
       AND d.location_id = l.location_id
       AND d.department_id = e.department_id
       GROUP BY CUBE(region_name, country_name)
       ORDER BY region_name;
 
REGION, COUNTRY, TOTAL EMP
< Americas, Canada, 2 >
< Americas, United States of America, 68 >
< Americas, <NULL>, 70 >
< Europe, Germany, 1 >
< Europe, United Kingdom, 35 >
< Europe, <NULL>, 36 >
< <NULL>, Canada, 2 >
< <NULL>, Germany, 1 >
< <NULL>, United Kingdom, 35 >
< <NULL>, United States of America, 68 >
< <NULL>, <NULL>, 106 >
11 rows found.

TRUNCATE TABLE

TRUNCATE TABLE文は、すべての行を削除するDELETE文と類似しています。

TimesTen Classicでは、DELETEは各行を個別に削除するため、TRUNCATE操作はほとんどの状況でDELETE操作より高速です。

TimesTen Scaleoutでは、TRUNCATE TABLEは、切り捨てられる表に依存するすべてのコマンドを無効にするDDL文に似ています。表内のすべての行を削除するには、DELETE文ではなくTRUNCATE文を使用することをお薦めします。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合、DELETEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

TRUNCATE TABLE [Owner.]TableName

パラメータ

パラメータ 説明

[Owner.]TableName

切り捨てる表を指定します。

説明

  • TRUNCATEはDDL文です。コミットは、TRUNCATE文の実行前後に実行されます。

  • 表にアウトライン列があり、切り捨てる数百万の行がある場合、ttCompact組込みプロシージャを呼び出してメモリーを解放することを検討してください。

  • 同時読取りのコミット読取り操作が可能であり、読取りセマンティックはDELETE文がある場合の読取りのコミット読取りと同じになります。

  • 子表がある場合でも、TRUNCATEを実行できます。ただし、TRUNCATEを実行するには、子表を空にする必要があります。いずれかの子表に行が含まれていると、子表が空でないことを示すエラーが返されます。

  • TRUNCATEは、マテリアライズド・ビューのディテール表、キャッシュ・グループに含まれる表または一時表ではサポートされていません。

  • 表に可変長の表外データが含まれている場合、TRUNCATE TABLEの実行結果は、表内のすべての行を削除するDELETE文と同じです。表外データの詳細は、「数値データ型」を参照してください。

  • 表をレプリケートしている場合にTRUNCATE文を使用すると、操作対象の行が存在しない場合でも、サブスクライバにレプリケートされます。

  • タイムスタンプ競合検出が有効な状態で表をレプリケートすると、競合はレポートされません。

  • 切り捨てられた表がコミットされていない場合は、この表のハッシュ・ページを変更するために、DROP TABLEおよびALTER TABLE操作を使用できません。

recreation.clubs表のすべての行を削除するには、次の文を使用します。

TRUNCATE TABLE recreation.clubs;

関連項目

UNLOAD CACHE GROUP

UNLOAD CACHE GROUP文は、キャッシュ・グループからデータを削除します。

必要な権限

キャッシュ・グループの所有者に必要な権限はありません。

別のユーザーのキャッシュ・グループの場合、UNLOADまたはUNLOAD ANY CACHE GROUPが必要です。

基礎となる表に対するINSERT権限、DELETE権限、UPDATE権限。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

UNLOAD CACHE GROUP [Owner.]GroupName 
  [WHERE ConditionalExpression]
  [COMMIT EVERY n ROWS]

または

UNLOAD CACHE GROUP [Owner.]GroupName 
WITH ID (ColumnValueList)

ノート:

WITH ID句は、TimesTen Scaleoutではサポートされていません。

パラメータ

パラメータ 説明

[Owner.]GroupName

キャッシュ・グループに割り当てられた名前。

WHERE ConditionalExpression

WHERE句を使用すると、キャッシュ処理のターゲット行を指定する検索条件を指定できます。WHERE句で複数の表を使用し、これらの表に同じ名前の列がある場合は、表名を完全修飾します。

COMMIT EVERY n ROWS

COMMIT EVERY n ROWS句を使用して、アンロード操作中にコミットを発行する頻度(アンロードされる行数に基づく)を指定します。

ROWSは、キャッシュ・グループから削除される行数を指します。たとえば、キャッシュ・グループに1つのキャッシュ・インスタンスがあり、そのキャッシュ・インスタンスが1つの親行と10の子行で構成されている場合で、COMMIT EVERY 2 ROWSを発行すると、TimesTenでは、キャッシュ・インスタンス全体が消去されてからコミットを1つ発行します。TimesTenでは、キャッシュ・インスタンスの消去中はコミットされません。そのため、アンロード操作がしきい値(この場合2行)に達すると、TimesTenでは、そのキャッシュ・インスタンスのすべての行が消去されてからコミットが発行されます。

この句を指定する場合は、キャッシュ・エージェントが稼働中で、トランザクションで実行されている操作がアンロードのみである必要があります。

nは整数(n >= 0)で指定します。nに0を指定すると、UNLOAD CACHE GROUP文は、1つのトランザクションとして実行され、キャッシュ・エージェントが削除を実行します。

パフォーマンスを高めるには、大量のデータに影響するキャッシュ・グループで操作を実行する際にこの句を使用します。

データが少量のキャッシュ・グループでは、この句を使用しないでください。

WITH ID ColumnValueList

WITH ID句を使用すると、主キーの値を使用してキャッシュ・インスタンスをアンロードできます。ColumnValueListを主キーの値を表すリテラルまたはバインディング・パラメータのリストとして指定します。

WITH ID句は、TimesTen Scaleoutではサポートされていません。

説明

  • UNLOAD CACHE GROUP文は、Oracle Database表のデータに影響することなく、TimesTenキャッシュ表から行を消去します。

  • 表にアウトライン列があり、数百万の行がある場合、ttCompact組込みプロシージャを呼び出してメモリーを解放することを検討してください。

  • キャッシュ・グループがレプリケートされている場合、UNLOAD CACHE GROUP文によって、レプリケートされたキャッシュ・グループの内容全体も削除されます。

  • AWTキャッシュ・グループに対するUNLOAD CACHE GROUP文の実行は、行に対する更新がOracle Databaseに伝播されるまで待機します。

  • UNLOAD CACHE GROUP文は、すべての種類のキャッシュ・グループに使用できます。キャッシュ・グループの詳細は、「CREATE CACHE GROUP」を参照してください。

  • AUTOREFRESH属性を持つキャッシュ・グループでは、UNLOAD CACHE GROUP文を慎重に使用してください。Oracle Databaseで行または子行が更新されると、自動リフレッシュ操作の結果として、アンロードされた行がキャッシュ・グループに再表示されることがあります。

  • UNLOAD CACHE GROUP文の実行後、ODBC関数SQLRowCount()、JDBCメソッドgetUpdateCount()、およびOCI_ATTR_ROW_COUNT引数が指定されたOCI関数OCIAttrGet()を実行すると、アンロードされたキャッシュ・インスタンスの数が返されます。

  • COMMIT EVERY n ROWS句を指定する場合は、キャッシュ・エージェントはアンロード処理を実行し、データのアンロード後にトランザクションをコミットします。キャッシュ・エージェントが稼働していることを確認してください。COMMIT EVERY n ROWS句を指定しない場合は、アンロード処理はアプリケーションによって実行されます。

  • COMMIT EVERY n ROWS句を指定する場合は、アンロード操作をロールバックできません。COMMIT EVERY n ROWS句(n >= 0)を指定しているときにアンロード操作が失敗すると、アンロードされた行の一部はすでにコミットされているために、キャッシュ・グループが一貫性のない状態になる可能性があります。そのため、一部のキャッシュ・インスタンスが部分的にしかアンロードされていない可能性があります。その場合は、キャッシュ・グループを再度アンロードします。

  • WITH ID句を使用して、バインディング・パラメータを指定します。

  • UNLOAD CACHE GROUP操作は独自のトランザクションで実行されます。

制限

  • UNLOAD CACHE GROUP...WITH ID句は、TimesTen Scaleoutではサポートされていません。

  • WHERE句で子表を参照しないでください。

  • 静的読取り専用キャッシュ・グループのまたは自動リフレッシュ属性が指定された静的ユーザー管理キャッシュ・グループには、WITH ID句を使用しないでください。

  • WITH ID句はCOMMIT EVERY n ROWS句と同時に使用しないでください。

キャッシュ表からデータをアンロードする場合はUNLOAD CACHE GROUP... COMMIT EVERY n ROWSを使用します。COMMIT EVERY n ROWS句が使用されるため、キャッシュ・エージェントはデータをアンロードします。

Command> UNLOAD CACHE GROUP testcache WHERE sampleuser.orders.order_id > 100
         COMMIT EVERY 100 ROWS;
2 cache instances affected.

キャッシュ・グループをCREATEおよびUNLOADします。COMMIT EVERY n ROWS句が使用されないため、アプリケーションはアンロードを実行します。

CREATE CACHE GROUP recreation.cache
    FROM recreation.clubs (
        clubname CHAR(15) NOT NULL,
        clubphone SMALLINT,
        activity CHAR(18),
        PRIMARY KEY(clubname))
    WHERE (recreation.clubs.activity IS NOT NULL);
UNLOAD CACHE GROUP recreation.cache;

UPDATE

UPDATE文は、表のすべての行または検索条件を満たす行の1つ以上の列値を更新します。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合、UPDATEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

UPDATE [hint] [FIRST NumRows] 
{[Owner.]TableName [CorrelationName]}
SET {ColumnName =
{Expression1 | NULL | DEFAULT}} [,...]
[ WHERE SearchCondition ]
RETURNING|RETURN Expression2[,...] INTO DataItem[,...]

パラメータ

パラメータ 説明

hint

UPDATE 文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

FIRST NumRows

更新する行の数を指定します。FIRST NumRowsは、副問合せの文ではサポートされていません。NumRowsには、正のINTEGER値か動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

[Owner.]TableName [CorrelationName]

[Owner.]TableNameは、更新される表を示します。

CorrelationNameは表の別名を指定します。また、基本名の構文ルールを満たしている必要があります。詳細は、「基本名」を参照してください。UPDATE文の他の場所でその表の列にアクセスする際、実際の表名ではなく相関名を使用します。相関名の有効範囲は、それが使用されているSQL文です。

単一の文のすべての相関名は、一意である必要があります。

SET ColumnName

ColumnNameとは、更新する列を指定します。単一のUPDATE文で同じ表の複数の列を更新できます。主キー列の値が変更されないかぎり、更新する列のリストに主キー列を含めることができます。

Expression1

集計関数を含まない式。式は、更新操作に指定した行ごとに評価されます。式のデータ型は、更新する列のデータ型と互換性がある必要があります。値を更新する場合、Expression1には列や順序CURRVALまたはNEXTVAL参照を指定できます。詳細は、「TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法」を参照してください。

NULL

WHERE句を満たす各行の指定した列にNULL値を挿入します。NULL値可能な列である必要があります。

DEFAULT

列をデフォルト値で更新する必要があることを指定します。

WHERE SearchCondition

検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、SET句の指定に従って更新されます。検索条件に一致しない行に影響はありません。検索条件に一致する行がない場合、表は変更されません。

Expression2

有効な式の構文。詳細は、「式」を参照してください。

DataItem

取得したExpression2値を格納するホスト変数またはPL/SQL変数。

説明

  • TimesTen Scaleoutでは、分散キー列は、列を同じ値に更新する以外の更新はできません。

  • 主キー列は、列を元の値に更新する以外の更新はできません。

  • WHERE句を省略した場合、表のすべての行はSET句の指定に従って更新されます。

  • UPDATE操作中に文字またはバイナリ文字列が切り捨てられた場合、TimesTenによって警告が生成されます。

  • 制約違反(UNIQUEFOREIGN KEYNOT NULL)が発生すると、UPDATE文は失敗します。

  • 外部キー制約に違反するUPDATE操作はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。

  • RETURNING句の制限:

    • Expression2は単純な式である必要があります。集計関数はサポートされません。

    • 順序番号はOUTパラメータに戻せません。

    • ROWNUMおよび副問合せは、RETURNING句では使用できません。

    • RETURNING句に使用されているパラメータは、UPDATE文で重複して使用できません。

    • RETURNING句を使用して複数行を戻すには、PL/SQL BULK COLLECT機能が必要です。『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』FORALLおよびBULK COLLECT操作に関する項を参照してください。

    • PL/SQLでは、RETURNING句はWHERE CURRENT処理と一緒には使用できません。

UPDATE文を使用してdepartment_id = 110のemployeesを更新します。department_id = 110のemployeesの場合は、manager_idjob_id = 'FI_ACCOUNT'のemployeesmanager_idに更新します。SET句の副問合せでDISTINCT修飾子を使用します。

job_id = 'FI_ACCOUNT'のemployeesmanager_idを検索します。

Command> SELECT manager_id FROM employees WHERE job_id = 'FI_ACCOUNT';
< 108 >
< 108 >
< 108 >
< 108 >
< 108 >
5 rows found.

次に、department_id = 110のemployeesmanager_idを検索します。

Command> SELECT manager_id FROM employees WHERE department_id = 110;
< 101 >
< 205 >
2 rows found.

ここで、department_id = 110のemployeesmanager_idを更新します。SET副問合せでSELECT DISTINCTを使用します。UPDATEの後に、department_id = 110のemployeesmanager_idが更新されたことを確認します。

Command> UPDATE employees SET manager_id =
          (SELECT DISTINCT employees.manager_id
           FROM employees
           WHERE employees.job_id = 'FI_ACCOUNT')
         WHERE employees.department_id = 110;
2 rows updated.

Command> SELECT manager_id FROM employees WHERE department_id = 110;
< 108 >
< 108 >
2 rows found.

UPDATE文のSET句で副問合せを使用します。location_id = 1700またはlocation_id = 2400のemployeesを更新します。これらの従業員のdepartment_idlocation_id = 2500のdepartment_idに設定します。(これはdepartment_id 80です)。これらの従業員の給与を所属する部門の最大給与に設定します。

最初の5人の従業員に対して問合せを実行してdepartment_idと給与を確認します。

Command> SELECT FIRST 5 employee_id, department_id, salary
         FROM employees
         ORDER BY employee_id, department_id, salary;
< 100, 90, 24000 >
< 101, 90, 17000 >
< 102, 90, 17000 >
< 103, 60, 9000 >
< 104, 60, 6000 >
5 rows found.

ここでUPDATE文を使用して従業員を更新します。

Command> UPDATE employees e1
         SET department_id =
              (SELECT department_id FROM departments
               WHERE location_id = 2500),
             salary =
              (SELECT MAX(salary) FROM employees e2
                WHERE e1.department_id = e2.department_id)
         WHERE department_id IN
           (SELECT department_id FROM departments
            WHERE location_id = 2400 OR location_id = 1700);
19 rows updated.

最初の5人の従業員を再度問合せて、元のdepartment_idが90の従業員が更新されていることを確認します。department_idは80になり、給与は24000になっています。

Command> SELECT FIRST 5 employee_id, department_id, salary
         FROM employees
         ORDER BY employee_id, department_id, salary;
< 100, 80, 24000 >
< 101, 80, 24000 >
< 102, 80, 24000 >
< 103, 60, 9000 >
< 104, 60, 6000 >
5 rows found.

次の例は、コストが$500を超える部品の価格を25%引き上げます。

UPDATE purchasing.parts
SET salesprice = salesprice * 1.25
WHERE salesprice > 500.00;

次の例は、順序seqNEXTVAL値を使用して列を更新します。

UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';

次の問合せは、1つでも未出荷注文のあるすべての顧客のステータスを更新します。

UPDATE customers SET customers.status = 'unshipped'
WHERE customers.id = ANY
    (SELECT orders.custid FROM orders
        WHERE orders.status = 'unshipped');

idが主キーでない場合、次の文はすべての重複する注文を更新します。

UPDATE orders a SET orders.status = 'shipped'
    WHERE EXISTS (SELECT 1 FROM orders b
        WHERE a.id = b.id AND a.rowid < b.rowid);

次の例は、employees表内の'Jones'という姓の従業員について、job_idsalaryおよびdepartment_idを更新します。salarylast_nameおよびdepartment_idの値が変数に返されます。

Command> VARIABLE bnd1 NUMBER(8,2);
Command> VARIABLE bnd2 VARCHAR2(25) INLINE NOT NULL;
Command> VARIABLE bnd3 NUMBER(4);
Command> UPDATE employees SET job_id='SA_MAN', salary=salary+1000,
          department_id=140 WHERE last_name='Jones'
         RETURNING salary*0.25, last_name, department_id
         INTO :bnd1, :bnd2, :bnd3;
1 row updated.
Command> PRINT bnd1 bnd2 bnd3;
BND1                 : 950
BND2                 : Jones
BND3                 : 140

結合更新

TimesTenでは、結合更新文がサポートされています。結合更新を使用すると、副問合せの結果を使用して、表の列を1つ以上更新できます。

構文

UPDATE [Owner.]TableName
SET ColumnName=Subquery
 [WHERE SearchCondition]

または

UPDATE [Owner.]TableName
SET (ColumnName[,...])=Subquery
 [WHERE SearchCondition]

パラメータ

結合更新文には、次のパラメータがあります。

パラメータ 説明

[Owner.]TableName

更新する表を指定します。

SET (ColumnName[,...])= Subquery

更新する列を指定します。単一のUPDATE文で同じ表の複数の列を更新できます。SET句に含めることができる副問合せは1つのみですが、この副問合せはネストできます。

副問合せの選択リストの値の数は、SET句で指定された列数と同じである必要があります。副問合せが更新する行に対して2行以上返す場合は、エラーが返されます。

WHERE SearchCondition

検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、SET句の指定に従って更新されます。検索条件に一致しない行に影響はありません。検索条件に一致する行がない場合、表は変更されません。

説明

結合更新のSET句内で副問合せを使用しても、更新されるターゲット表の行数は削減されません。削減は、WHERE句を使用して指定する必要があります。したがって、WHERE句内でターゲット表の行が指定されているにもかかわらず、副問合せがこの行に対していずれの行も返さない場合、この行の更新対象列はNULL値に更新されます。

この例では、t1の行がt2と一致しない場合、最初のSELECTx1の値と2番目のSELECTx1およびy1の値はNULLに設定されます。

UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2);
UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2);

t2と一致するt1の行のみを更新するようにUPDATE文を制限するには、副問合せを含むWHERE句を次のように指定する必要があります。

UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2) 
  WHERE id1 IN (SELECT id2 FROM t2);
UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2) 
  WHERE id1 IN (SELECT id2 FROM t2);

関連項目

SELECT