ヘッダーをスキップ
Oracle® TimesTen In-Memory Databaseオペレーション・ガイド
11gリリース2 (11.2.2)
B66441-07
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

6 ttIsqlユーティリティの使用方法

TimesTenのttIsqlユーティリティは、TimesTenデータソースを処理するための一般的なツールです。ttIsqlコマンドライン・インタフェースを使用して、SQL文および組込みttIsqlコマンドを実行して様々なタスクを実行します。通常ttIsqlを使用して行う処理は次のとおりです。

次の項では、ttIsqlユーティリティを使用してこれらのタスクを実行する方法について説明します。

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

バッチ・モードおよび対話モード

ttIsqlユーティリティは、バッチ・モードまたは対話モードで使用できます。ttIsqlを対話モードで使用する場合、ユーザーはコンソールからttIsqlに直接コマンドを入力します。ttIsqlをバッチ・モードで使用する場合は、コマンドを含むファイルの名前を指定して、事前に準備したttIsqlコマンドのスクリプトを実行します。

通常、バッチ・モードは、次のようなタスクで使用します。

  • 表統計の更新、データベースの圧縮、ログ・ファイルのパージなどの定期的なメンテナンス処理の実行。

  • 表、索引、およびキャッシュ・グループを作成し、その表にデータを移入することによるデータベースの初期化。

  • 一般的な問合せを実行することによる簡単なレポートの作成。

対話モードは、次のような処理に適しています。

  • TimesTen機能の検証、代替設計のテストおよび問合せパフォーマンスの向上。

  • データベース統計の調査による、データベース問題の解決。

  • 通常どおりには実行されないその他のデータベース・タスク。

デフォルトでは、シェルからttIsqlを起動すると、ttIsqlは対話モードになります。ttIsqlユーティリティは、Command>プロンプトを表示することによって、有効なttIsql組込みコマンドまたはSQL文の入力を求めます。次の例では、ttIsqlを対話モードで開始し、connectコマンドをMY_DSN DSNを使用して実行し、TimesTenデータベースに接続します。

C:\>ttIsql

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

Command> connect MY_DSN;
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN; 
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)

Command>

ttIsqlを使用してデータベースに接続する際には、ttIsqlコマンドラインでDSNまたは接続文字列を指定することも可能です。connectコマンドが暗黙的に実行されます。

C:\>ttIsql -connstr "DSN=MY_DSN"

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN; 
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)

Command>

バッチ・モードは、2つの異なる方法で使用できます。最も一般的な方法は、ttIsqlコマンドラインで、実行するファイルの名前を-fオプションの後に指定する方法です。

たとえば、CREATE TABLE文を含むファイルを実行する場合は次のようになります。

C:\>ttIsql -f create.sql -connstr "DSN=MY_DSN"

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

connect "DSN=MY_DSN"
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN; 
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)

run "create.sql"

CREATE TABLE LOOKUP (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64))

exit;
Disconnecting...
Done.

C:\>

バッチ・モードを使用するもう1つの方法は、対話形式のコマンド・プロンプトからrunコマンドを直接入力する方法です。実行するttIsql組込みコマンドおよびSQL文を含むファイルの名前をrunコマンドの後に指定します。

Command> run "create.sql";

CREATE TABLE LOOKUP (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64))
Command>

TTISQL環境変数を使用したデフォルト設定の定義

コマンド・プロンプトからttIsqlセッションが開始されるたびに、一連のコマンドライン・オプションが自動的に実行されるように、ttIsqlユーティリティをカスタマイズできます。これは、TTISQLという環境変数を適切なttIsqlコマンドラインの値に設定して行うことができます。次に、ttIsqlコマンドライン・オプションの概要を示します。ttIsqlコマンドライン・オプションの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。

Usage: ttIsql [-h | -help | -helpcmds | -helpfull | -V]
        ttIsql [-f <filename>] 
               [-v <verbosity>] 
               [-e <commands>]
               [-interactive] 
               [-N <ncharEncoding>] 
               [-wait]
               [{<DSN> | -connstr <connection_string>}]

TTISQL環境変数には、ttIsqlコマンドラインと同じ構文要件があります。ttIsqlは、起動時にTTISQL環境変数の値を読み取り、現行のttIsqlセッションに対する変数で指定されたすべてのオプションを適用します。特定のコマンドライン・オプションがTTISQL環境変数およびコマンドラインの両方に指定されている場合は、コマンドラインに指定されているオプションが常に優先されます。

環境変数の値を設定する手順は、プラットフォーム、およびttIsqlが起動されるシェルによって異なります。たとえば、WindowsでTTISQL環境変数を設定する場合は、次のように入力します。

C:\>set TTISQL=-connStr "DSN=MY_DSN" -e "autocommit 0;dssize;"

この例では、次に示すように、ttIsqlMY_DSNというDSNに自動的に接続し、自動コミットを無効にし、データベースのサイズを表示します。

C:\>ttIsql

Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

Command> connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)
Command> autocommit 0;
Command> dssize;
The following values are in KB:
 
  PERM_ALLOCATED_SIZE:      40960
  PERM_IN_USE_SIZE:         9453
  PERM_IN_USE_HIGH_WATER:   9453
  TEMP_ALLOCATED_SIZE:      32768
  TEMP_IN_USE_SIZE:         9442
  TEMP_IN_USE_HIGH_WATER:   9885
Command>

ttIsqlコマンド・プロンプトのカスタマイズ

ttIsqlコマンド・プロンプトは、prompt属性を指定してsetコマンドを使用するとカスタマイズできます。

Command> set prompt MY_DSN;
MY_DSN

現行の接続の名前を戻す文字列書式(%c)を指定できます。

Command> set prompt %c;
con1

空白を埋め込む場合は、文字列を引用符で囲む必要があります。

Command> set prompt "MY_DSN %c> ";
MY_DSN con1>

ttIsqlオンライン・ヘルプの使用

ttIsqlユーティリティには、オンライン・バージョンのttIsql組込みコマンドのコマンド構文の定義および説明が用意されています。ttIsql内からこのオンライン・ヘルプにアクセスするには、helpコマンドを使用します。ttIsql組込みコマンドの詳細を表示するには、ヘルプを表示する1つ以上のttIsqlコマンドをhelpコマンドの後に入力します。次に、connectおよびdisconnectコマンドのオンライン・ヘルプの表示例を示します。

Command> help connect disconnect
 
Arguments in <> are required.
Arguments in [] are optional.
 
Command Usage: connect [DSN|connection_string] [as <connection_id>]
Command Aliases: (none)
Description: Connects to the data source specified by the optional DSN or 
connection string argument. If an argument is not given, then the DSN or 
connection string from the last successful connection is used. A connection ID 
may optionally be specified, for use in referring to the connection when multiple 
connections are enabled. The DSN is used as the default connection ID. If that ID 
is already in use, the connection will be assigned the ID "conN", where N is some 
number larger than 0.
Requires an active connection: NO
Requires autocommit turned off: NO
Reports elapsed execution time: YES
Works only with a TimesTen data source: NO
Example: connect; -or- connect RunData; -or- connect "DSN=RunData";
-or- connect RunData as rundata1;
 
Command Usage: disconnect [all]
Command Aliases: (none)
Description: Disconnects from the currently connected data source or all 
connections when the "all" argument is included. If a transaction is active when 
disconnecting then the transaction will be rolled back automatically. If a 
connection exists when executing the "bye", "quit" or "exit" commands then the 
"disconnect" command will be executed automatically.
Requires an active connection: NO
Requires autocommit turned off: NO
Reports elapsed execution time: YES
Works only with a TimesTen data source: NO
Example: disconnect;

すべてのttIsql組込みコマンドの簡単な説明を表示するには、引数を指定しないでhelpコマンドを入力します。すべてのttIsql組込みコマンドの詳細を表示するには、helpコマンドの後にall引数を入力します。

ttIsqlを使用して設定または表示可能な属性のリストを表示するには、次のように入力します。

Command> help attributes

ttIsqlのeditline機能の使用(UNIXのみ)

UNIXシステムでは、editlineライブラリを使用して、emacs(デフォルト)またはviバインディングを設定すると、前のttIsqlコマンドをスクロールしたり、編集して再送信することができます。この機能は、Windowsでは使用不可および不要です。

ttIsqlのeditline機能を無効にするには、ttIsqlコマンドのset editline offを使用します。

設定およびキーストロークに関する情報を、エディタのタイプごとに説明します。

emacsバインディング

emacsバインディングを使用するには、~/.editrc ファイルを作成し、そのファイルの最後の行にbindを挿入してttIsqlを実行します。editline libによって、現行のバインディングが表示されます。

emacsバインディングでttIsqlを使用する場合のキーストロークは、次のとおりです。

キーストローク アクション
<[←]> 挿入点を左に移動します。後退します。
<[→]> 挿入点を右に移動します。前進します。
<[↑]> 表示されているコマンドの1つ前のコマンドにスクロールします。カーソルは行末に移動します。
<[↓]> 最新のコマンド履歴項目までスクロールします。カーソルは行末に移動します。
<[Ctrl] + [A]> 挿入点を行の先頭まで移動します。
<[Ctrl] + [E]> 挿入点を行末まで移動します。
<[Ctrl] + [K]> コマンドライン上の現在の位置から行末までの文字を保存して削除(Kill)します。
<[Ctrl] + [Y]> 以前保存した文字をリストア(Yank)して現在の挿入点に挿入します。
<[Ctrl] + [F]> 右に1文字移動します([→]を参照)。
<[Ctrl] + [B]> 左に1文字移動します([←]を参照)。
<[Ctrl] + [P]> 前の履歴に移動します([↑]を参照)。
<[Ctrl] + [N]> 次の履歴に移動します([↓]を参照)。

viバインディング

viバインディングを使用するには、${HOME}/.editrcファイルを作成し、そのファイルにbind-vを挿入してttIsqlを実行します。現在の設定を取得するには、${HOME}/.editrc ファイルを作成し、そのファイルの最後の行にbindを挿入します。ttIsqlを実行すると、editline libによって現在のバインディングが表示されます。

viバインディングでttIsqlを使用する場合のキーストロークは、次のとおりです。

キーストローク アクション
[←]、[h] 挿入点を左に移動します(後退)。
[→]、[l] 挿入点を右に移動します(前進)。
[↑]、[k] 履歴内の前のコマンドにスクロールします。カーソルは行末に移動します。
[↓]、[j] 履歴内の次のコマンドにスクロールします。カーソルは行末に移動します。
[Esc] viコマンド・モード。
0, $ 挿入点を行の先頭に移動します。カーソルは行末に移動します。
[i]、[I] 挿入モード。行の先頭の挿入モードです。
[a]、[A] 追加(後ろに挿入)モード。行末に追加します。
[R] 置換モード。
[C] 行末まで変更します。
[B] 前の単語まで移動します。
[e] 単語末まで移動します。
<[Ctrl] + [P]> 前の履歴に移動します([↑]を参照)。
<[Ctrl] + [N]> 次の履歴に移動します([↓]を参照)。

ttIsqlのコマンド履歴の使用

ttIsqlユーティリティでは、現行のttIsqlセッションで最後に実行した100個のコマンドのリストが保存されます。このリスト内のコマンドは、コマンド全体を入力せずに再度参照または実行できます。履歴リストには、SQL文およびttIsql組込みコマンドの両方が保存されます。historyコマンド(h)を使用すると、以前に実行したコマンドを参照できます。次に例を示します。

Command> h;
8 INSERT INTO T3 VALUES (3)
9 INSERT INTO T1 VALUES (4)
10 INSERT INTO T2 VALUES (5)
11 INSERT INTO T3 VALUES (6)
12 autocommit 0
13 showplan
14 SELECT * FROM T1, t2, t3 WHERE A=B AND B=C AND A=B
15 trytbllocks 0
16 tryserial 0
17 SELECT * FROM T1, t2, t3 WHERE A=B AND B=C AND A=B
Command>

historyコマンドによって、最後に実行された10個のSQL文またはttIsql組込みコマンドが表示されます。この最後10個以外のコマンドを表示するには、historyコマンドに引数として表示最大数を指定します。

履歴リストの各エントリは、一意の番号で識別されています。コマンド番号を!の後に指定すると、そのコマンドを再度実行できます。次に例を示します。

Command>
Command> ! 12;

autocommit 0
Command>

最後のコマンドを実行するには、2つの!を連続して入力します。

Command> !!;

autocommit 0
Command>

特定の文字列で始まっている最後のコマンドを実行するには、そのコマンドの最初の数文字を!の後に入力します。次に例を示します。

Command> ! auto;

autocommit 0
Command>

ttIsqlのコマンド履歴の保存および消去

savehistoryコマンドを使用すると、ttIsqlによって保存されるコマンドのリストを保存できます。

Command> savehistory history.txt;

出力ファイルがすでに存在している場合は、-aオプションを使用してこのファイルに新しいコマンド履歴を追加するか、または-fオプションを使用してこのファイルを上書きします。次の例では、既存のファイルに新しいコマンド履歴を追加する方法を示します。

Command> savehistory -a history.txt;

clearhistoryコマンドを使用すると、ttIsqlによって保存されるコマンドのリストを消去できます。

Command> clearhistory;

ttIsqlのeditコマンドの使用

ttIsql editコマンドを使用してファイルを編集するか、テキスト・エディタでttIsqlコマンドを編集できます。ttIsql editコマンドは、emacsgeditviなどのテキスト・エディタを起動します。デフォルトのテキスト・エディタの変更方法の詳細は、「ttIsqlのeditコマンドのデフォルトのテキスト・エディタの変更」を参照してください。

ttIsql editコマンドの構文は次のとおりです。

Command> edit [ file | !history_search_command ]

一度に1つのパラメータのみを使用できます。history_search_commandパラメータは、!文字の後にコマンドの数または検索文字列を続けたもので定義します。!文字を指定しないと、ttIsql editコマンドはパラメータをfileとして解釈します。fileは編集するファイルの名前です。パラメータまたは!!を指定しない場合は、最後のttIsqlコマンドが編集されます。

fileパラメータを指定した場合は、エディタによって指定されたファイルが編集されます。TimesTenが現在の作業ディレクトリに指定されたfileパラメータと完全に一致するファイルを見つけられない場合、file.sqlを検索します。どちらのファイルも存在しない場合は、エディタによって指定されたファイルが現在の作業ディレクトリに作成されます。fileパラメータにはパスを指定できます。

次の例では、new.sqlファイルを編集します。

Command> edit new.sql;

次の例では、/scriptsディレクトリのnew.sqlファイルを編集します。

Command> edit /scripts/new.sql;

fileパラメータを指定してttIsql editコマンドを実行した場合、ttIsqlは、エディタの終了後にファイルの内容を実行しません。

現在のttIsqlセッションの履歴リストに格納されているSQL文を編集できます。ttIsql editコマンドをコールする場合は、!文字に続けてコマンドの数または検索文字列を指定します。一時ファイル(任意の場所に保存可能)にあるttIsqlコマンドがエディタによって開かれます。ttIsql historyコマンドの使用方法の詳細は、「ttIsqlのコマンド履歴の使用」を参照してください。

次の例では、ttIsqlコマンド2を編集します。

Command> edit !2;

次の例では、検索文字列createが含まれている最後のttIsqlコマンドを検索して編集します。

Command> edit !create;

次の例では、CREATE TABLE文を実行した後に、editコマンドを使用してテキスト・エディタでCREATE TABLE文を編集します。

Command> CREATE TABLE t1 
(c1 VARCHAR(10) NOT INLINE NOT NULL, c2 VARCHAR(144) INLINE NOT NULL);
Command> edit;

前の例は、!!パラメータを指定してttIsql editコマンドを使用したものに相当します。

Command> CREATE TABLE t1 
(c1 VARCHAR(10) NOT INLINE NOT NULL, c2 VARCHAR(144) INLINE NOT NULL);
Command> edit !!;

ttIsql editコマンドをhistory_search_commandパラメータを指定して実行した場合、ttIsqlは、エディタの終了後にファイルの内容を実行します。ファイルの内容は、1つのttIsqlコマンドとして実行されます。ファイルの内容を実行しない場合は、ファイルの内容を削除し、エディタを終了する前にファイルを保存します。

ttIsqlのeditコマンドのデフォルトのテキスト・エディタの変更

ttIsql _EDITOR定義の別名を定義することによってデフォルトのエディタを指定できます。次の例では、デフォルトのエディタをviに設定します。

Command> DEFINE _EDITOR=vi

_EDITOR定義の別名を定義しない場合は、ttIsqlVISUAL環境変数で指定されているエディタを使用します。_EDITOR定義の別名およびVISUAL環境変数が設定されていない場合は、ttIsqlEDITOR環境変数で指定されているエディタを使用します。_EDITORVISUALおよびEDITORが設定されていない場合は、UNIXではviが、Windowsではnotepad.exeが使用されます。

キャラクタ・セットの処理

ttIsqlユーティリティでは、『Oracle TimesTen In-Memory Databaseリファレンス』のサポートされているキャラクタ・セットの項に記載されているキャラクタ・セットがサポートされています。ttIsqlで文字を表示する機能は、ttIsqlを使用している端末のネイティブ・オペレーティング・システムのロケール設定によって異なります。

ロケール・ベースの出力書式を上書きするには、ncharencodingオプションまたは-Nオプションを使用します。これらのオプションの有効な値は、LOCALE(デフォルト)およびASCIIです。ASCIIを選択した場合にttIsqlでUnicode文字が検出されると、Unicode文字はエスケープされた書式で表示されます。

出力方法を変更する場合、アクティブな接続は必要ありません。

データベース構造情報の表示

データベース構造に関する情報を表示するいくつかのttIsqlコマンドが用意されています。次に、最も有効なコマンドの概要を示します。

  • describe: データベース・オブジェクトに関する情報を表示します。

  • cachegroups: キャッシュ・グループの属性を表示します。

  • dssize - 永続メモリー領域および一時メモリー領域の現在のサイズをレポートします。

  • tablesize: ttComputeTabSizesツールを使用して分析された表のサイズが表示されます。

  • monitor: データベースの現在の状態のサマリーを表示します。

ttIsqlのdescribeコマンドの使用

describeコマンドを使用して、各データベース・オブジェクトに関する情報を表示します。準備済のSQL文および組込みプロシージャに関するパラメータを表示します。describeコマンドの引数として、表、キャッシュ・グループ、ビュー、マテリアライズド・ビュー、マテリアライズド・ビュー・ログ、順序、シノニムなどの名前、組込みプロシージャ、SQL文、事前に準備済のSQL文のコマンドID、PL/SQL関数、PL/SQLプロシージャまたはPL/SQLパッケージを指定できます。

describeコマンドを終了するには、セミコロンを指定する必要があります。

Command> CREATE TABLE T1 (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64));
Command> describe T1
       > ;

Table USER.T1:
  Columns:
   *KEY                            NUMBER NOT NULL
    VALUE                          CHAR (64)
1 table found.

(primary key columns are indicated with *)
Command> describe SELECT * FROM T1 WHERE KEY=?;

Prepared Statement:
  Parameters:
    Parameter 1                    NUMBER
  Columns:
    KEY NUMBER                     NOT NULL
    VALUE                          CHAR (64)
Command> describe ttOptUseIndex;

Procedure TTOPTUSEINDEX:
  Parameters:
    Parameter INDOPTION            VARCHAR (1024)
  Columns:
    (none)

1 procedure found.
Command>

ttIsqlのcachegroupsコマンドの使用

cachegroupsコマンドを使用すると、現行のデータベースで定義されているキャッシュ・グループの詳細が表示されます。キャッシュ・グループに関連付けられているWHERE句のみでなく、キャッシュ・グループに定義されているroot表および子表の属性も表示されます。cachegroupsコマンドには、情報を表示するキャッシュ・グループの名前を引数として指定します。

Command> cachegroups;
Cache Group CACHEUSER.READCACHE:
 Cache Group Type: Read Only
 Autorefresh: Yes
 Autorefresh Mode: Incremental
 Autorefresh State: Paused
 Autorefresh Interval: 5 Seconds
 Autorefresh Status: ok
 Aging: No aging defined
 Root Table: ORATT.READTAB
 Table Type: Read Only
Cache Group CACHEUSER.WRITECACHE:
 Cache Group Type: Asynchronous Writethrough global (Dynamic)
 Autorefresh: No
 Aging: LRU on
 Root Table: ORATT.WRITETAB
 Table Type: Propagate
2 cache groups found.

ttIsqlのdssizeコマンドの使用

dssizeコマンドを使用すると、データベースの最大サイズ、割当てサイズおよび使用中サイズのみでなく、永続パーティションおよび一時メモリー領域の現在のメモリー・ステータスがレポートされます。

次の例では、kオプションを使用して、データベース・サイズ情報をKB単位で出力します。

Command> dssize k;
The following values are in KB:
 
  PERM_ALLOCATED_SIZE:      40960
  PERM_IN_USE_SIZE:         9742
  PERM_IN_USE_HIGH_WATER:   9742
  TEMP_ALLOCATED_SIZE:      32768
  TEMP_IN_USE_SIZE:         9442
  TEMP_IN_USE_HIGH_WATER:   9505

dssizeコマンドの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する説明を参照してください。

ttIsql tablesizeコマンドの使用

tablesizeコマンドでは、表の領域使用量の詳細な分析が表示されます。指定された表の表サイズを分析するttComputeTabSizes組込みプロシージャを一度コールすると、tablesizeコマンドでは分析されたすべての表の合計サイズのデータが表示されます。


注意:

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

引数なしでtablesizeコマンドを実行すると、ttComputeTabSizesの計算がすでに実行された、すべての表に対する最大使用可能サイズ指定情報が表示されます。表を引数として指定すると、tablesizeによって、指定した表に対する使用可能サイズ指定のみが表示されます。

tablesizeの構文は次のとおりです。

tablesize [[owner_name_pattern.]table_name_pattern]

次の例では、ttComputeTabSizes組込みプロシージャを起動し、employees表の表サイズが計算されます。次に、tablesizeコマンドによってemployees表のために収集されたサイズ指定情報が表示されます。

Command> call ttComputeTabSizes('employees');
Command> tablesize employees;
 
Sizes of USER1.EMPLOYEES:
 
  INLINE_ALLOC_BYTES:   60432
  NUM_USED_ROWS:        107
  NUM_FREE_ROWS:        149
  AVG_ROW_LEN:          236
  OUT_OF_LINE_BYTES:    0
  METADATA_BYTES:       1304
  TOTAL_BYTES:          61736
  LAST_UPDATED:         2011-06-29 12:55:28.000000
 
1 table found.

これらの値から、オーバーヘッドおよび総領域における該当の表の使用状況を把握できます。

次に例を示します。

  • NUM_FREE_ROWS値は、表に割り当てられた、現在使用されていない行数を表します。システムでは、空行に占有される領域をその他のシステム・オブジェクトまたは構造の保存に使用できません。

  • 表が占有する永続領域を計算するには、TOTAL_BYTES値を使用します。

  • LAST_UPDATEDは、サイズの最終計算時刻になります。より最近の計算が必要な場合は、ttComputeTabSizesを再実行し、新しい出力を表示します。

各計算値の説明は、『Oracle TimesTen In-Memory Databaseシステム表およびビュー・リファレンス』のSYS.ALL_TAB_SIZESに関する項を参照してください。

ttIsqlのmonitorコマンドの使用

monitorコマンドを使用すると、dssizeコマンドで戻されるすべての情報およびデータベースがメモリーにロードされてから収集された接続数、チェックポイント、ロック・タイムアウト、コミット、ロールバックなどに関する追加の統計情報が表示されます。

Command> monitor; 
TIME_OF_1ST_CONNECT: Wed Apr 20 10:34:17 2011
DS_CONNECTS: 11 
DS_DISCONNECTS: 0 
DS_CHECKPOINTS: 0 
DS_CHECKPOINTS_FUZZY: 0 
DS_COMPACTS: 0 
PERM_ALLOCATED_SIZE: 40960 
PERM_IN_USE_SIZE: 5174 
PERM_IN_USE_HIGH_WATER: 5174 
TEMP_ALLOCATED_SIZE: 18432 
TEMP_IN_USE_SIZE: 4527 
TEMP_IN_USE_HIGH_WATER: 4527 
SYS18: 0 
TPL_FETCHES: 0 
TPL_EXECS: 0 
CACHE_HITS: 0 
PASSTHROUGH_COUNT: 0 
XACT_BEGINS: 2 
XACT_COMMITS: 1 
XACT_D_COMMITS: 0 
XACT_ROLLBACKS: 0 
LOG_FORCES: 0 
DEADLOCKS: 0 
LOCK_TIMEOUTS: 0 
LOCK_GRANTS_IMMED: 17 
LOCK_GRANTS_WAIT: 0 
SYS19: 0 
CMD_PREPARES: 1 
CMD_REPREPARES: 0 
CMD_TEMP_INDEXES: 0 
LAST_LOG_FILE: 0 
REPHOLD_LOG_FILE: -1 
REPHOLD_LOG_OFF: -1 
REP_XACT_COUNT: 0 
REP_CONFLICT_COUNT: 0 
REP_PEER_CONNECTIONS: 0 
REP_PEER_RETRIES: 0 
FIRST_LOG_FILE: 0 
LOG_BYTES_TO_LOG_BUFFER: 64 
LOG_FS_READS: 0 
LOG_FS_WRITES: 0 
LOG_BUFFER_WAITS: 0 
CHECKPOINT_BYTES_WRITTEN: 0 
CURSOR_OPENS: 1 
CURSOR_CLOSES: 1 
SYS3: 0 
SYS4: 0 
SYS5: 0 
SYS6: 0 
CHECKPOINT_BLOCKS_WRITTEN: 0 
CHECKPOINT_WRITES: 0 
REQUIRED_RECOVERY: 0 
SYS11: 0 
SYS12: 1 
TYPE_MODE: 0 
SYS13: 0 
SYS14: 0 
SYS15: 0 
SYS16: 0 
SYS17: 0 
SYS9: 

オブジェクト・タイプ別のデータベース・オブジェクトのリスト

ttIsqlを使用して、データベース内の表、索引、ビュー、順序、シノニム、PL/SQL関数、プロシージャおよびパッケージを表示できます。先頭にallの付いたコマンドでは、このタイプのオブジェクトがすべて表示されます。たとえば、functionsコマンドではユーザーが所有するPL/SQL関数が表示されますが、allfunctionsでは、すべてのPL/SQL関数が表示されます。

オプションで、オブジェクト所有者およびオブジェクト名のパターンを指定することもできます。

データベース・オブジェクトを表示するには、次のコマンドを使用します。

  • tablesおよびalltables: 表を表示します。

  • indexesおよびallindexes: 索引を表示します。

  • viewsおよびallviews: ビューを表示します。

  • sequencesおよびallsequences: 順序を表示します。

  • synonymsおよびallsynonyms: シノニムを表示します。

  • functionsおよびallfunctions: PL/SQL関数を表示します。

  • proceduresおよびallprocedures: PL/SQLプロシージャを表示します。

  • packagesおよびallpackages: PL/SQLパッケージを表示します。


注意:

これらの各コマンドの詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。

次の例に、proceduresおよびallproceduresコマンドを示します。ユーザーTERRYが、myDSNへの接続中にproc1という名前のプロシージャを作成します。PL/SQL文に続く新しい行には、スラッシュ(/)が入力されています。

proceduresコマンドおよびallproceduresコマンドでは、これがデータベース内の唯一のPL/SQLプロシージャであることが示されます。

$ ttisql myDSN
Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
connect "DSN=myDSN";
Connection successful: 
DSN=myDSN;UID=terry;DataStore=/scratch/terry/myDSN;DatabaseCharacter 
Set=AL32UTF8;ConnectionCharacterSet=US7ASCII;PermSize=32;TypeMode=0;
(Default setting AutoCommit=1)
Command> create or replace procedure proc1 as begin null; end;
       > /
Procedure created.
Command> procedures;
  TERRY.PROC1
1 procedure found.
Command> allprocedures;
  TERRY.PROC1
1 procedure found.

次に、同じDSNにPatとして接続し、qという名前のプロシージャを作成します。allproceduresコマンドでは、Terryとpatによって作成されたPL/SQLプロシージャが表示されます。

$ ttisql "dsn=myDSN;uid=PAT"
Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
connect "dsn=myDSN;uid=PAT";
Connection successful: DSN=myDSN;UID=PAT;
DataStore=/scratch/terry/myDSN;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=US7ASCII;PermSize=32;TypeMode=0;
(Default setting AutoCommit=1)
Command> create or replace procedure q as begin null; end;
       > /
Procedure created.
Command> procedures;
  PAT.Q
1 procedure found.
Command> allprocedures;
  TERRY.PROC1
  PAT.Q
2 procedures found.

接続属性の表示および設定

ttIsqlshowおよびsetコマンドを使用すると、接続属性を表示および設定できます。ttIsqlを使用して表示および設定できる属性のリストは、『Oracle TimesTen In-Memory Databaseリファレンス』の接続属性に関する説明を参照してください。

Passthrough属性の設定を表示するには、次のように入力します。

Command> show passthrough;
PassThrough = 0

Passthrough設定を変更するには、次のように入力します。

Command> set passthrough 1;

トランザクションの処理

ttIsqlユーティリティには、トランザクションを管理するためのいくつかの組込みコマンドが用意されています。次に、これらのコマンドの概要を示します。

  • autocommit: 自動コミット機能を有効または無効にします。これは、setコマンドの属性としても設定できます。

  • commit: 現行のトランザクションをコミットします。

  • commitdurable: 現行のトランザクションをコミットし、データベース障害の場合にコミット済の作業をリカバリできるようにします。

  • rollback: 現行のトランザクションをロールバックします。

  • isolation - トランザクションの分離レベルを変更します。これは、setコマンドの属性としても設定できます。

  • sqlquerytimeout: アプリケーションに戻されるまでのSQL文の実行待機時間(秒)を指定します。これは、setコマンドの属性としても設定できます。

デフォルトでは、ttIsqlを起動すると、SQLスクリプト内でも自動コミット機能が有効になります。このモードでは、データベースに対するすべてのSQL操作が自動的にコミットされます。自動コミットが有効な場合、自動コミットは、DDLCommitBehavior接続属性の設定、およびDDLを実行するユーザーに依存します。詳細は、「自動コミットとDDLCommitBehaviorの間の関係」を参照してください。

自動コミット機能を無効にするには、引数0を指定してttIsqlautocommitコマンドを実行します。自動コミットが無効になっている場合は、ttIsqlcommitコマンド、commitdurableコマンドまたはrollbackコマンドを実行して、トランザクションを手動でコミットまたはロールバックする必要があります。commitdurableコマンドを実行すると、データベース障害が発生した場合でも、トランザクションの結果が保持されます。ttIsqlが終了していて自動コミットが無効な場合、コミットされていない文は、ttIsqlによってロールバックされ報告されます。

ttIsqlisolationコマンドを使用すると、現行の接続のトランザクション独立性プロパティを変更できます。独立性は、トランザクションの開始時にのみ変更できます。isolationコマンドには、READ_COMMITTEDまたはSERIALIZABLEのいずれかを定数として指定できます。isolationコマンドを引数を指定しないで変更すると、現在の分離レベルがレポートされます。

ttIsqlsqlquerytimeoutコマンドでは、SQL文のタイムアウト間隔を設定します。SQL文の実行時間がsqlquerytimeoutコマンドで設定した秒数を超えると、SQL文は実行されず、6111エラーが生成されます。詳細は、『Oracle TimesTen In-Memory Database Java開発者ガイド』の「SQL文のタイムアウト期間の設定」に関する説明および『Oracle TimesTen In-Memory Database C開発者ガイド』の「SQL文のタイムアウト期間の設定」に関する説明を参照してください。


注意:

TimesTenのロールバック機能および問合せタイムアウト機能を使用しても、Oracle Databaseで処理中のTimesTen Cache操作が停止されることはありません。このような操作には、PassThrough文、フラッシング、手動ロード、手動リフレッシュ、SYNCHRONOUS WRITETHROUGH、伝播および動的ロードが含まれます。

次に、ttIsqlの組込みトランザクション管理コマンドの一般的な使用例を示します。

E:\>ttIsql
Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.

Command> connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)
Command> autocommit 0;
Command> CREATE TABLE LOOKUP (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64));
Command> commit;
Command> INSERT INTO LOOKUP VALUES (1, 'ABC');
1 row inserted.
Command> SELECT * FROM LOOKUP;
< 1, ABC >
1 row found.
Command> rollback;
Command> SELECT * FROM LOOKUP;
0 rows found.
Command> isolation;
isolation = READ_COMMITTED
Command> commitdurable;
Command> sqlquerytimeout 10;
Command> sqlquerytimeout;
Query timeout = 10 seconds
Command> disconnect;
Disconnecting...
Command> exit;
Done.

準備済およびパラメータ化済のSQL文の処理

TimesTenアプリケーションでは、SQL文を1回のみ準備してそれを複数回実行する方が、実行のたびに文を繰り返し準備するより効率的です。ttIsqlには、準備済のSQL文を使用するための一連の組込みコマンドが用意されています。次に、これらのコマンドの概要を示します。

  • prepare: SQL文を準備します。SQLPrepare ODBCコールに対応します。

  • exec - 事前に準備済の文を実行します。SQLExecute ODBCコールに対応します。

  • execandfetch: 事前に準備済の文を実行し、すべての結果行をフェッチします。1つ以上のSQLFetchコールの前に実行されるSQLExecuteコールに対応します。

  • fetchall - 以前に実行した文のすべての結果行をフェッチします。1つ以上のSQLFetchコールに対応します。

  • fetchone - 以前に実行した文の1行のみをフェッチします。1つのみのSQLFetchコールに対応します。

  • close - 結果セットが生成された以前に実行済の文に対する結果セットのカーソルをクローズします。SQL_CLOSEオプションが指定されたSQLFreeStmtコールに対応します。

  • free: 事前に準備済の文をクローズします。SQL_DROPオプションが指定されたSQLFreeStmtコールに対応します。

  • describe - 入力パラメータおよび結果列を含む準備済の文を表示します。

ttIsqlユーティリティの準備済の文コマンドは、SQL文のパラメータ・マーカーも処理します。準備済のSQL文にパラメータ・マーカーが含まれている場合は、ttIsqlの実行時に、文の各パラメータに値を入力するように自動的に求められます。

次の例では、ttIsqlユーティリティの準備済の文コマンドを使用して、NUMBERおよびCHAR列を含む表のINSERT文を準備します。文が準備された後、文の2つのパラメータに対してそれぞれ異なる値を使用して2回実行されます。また、ttIsqlユーティリティのtimingコマンドを使用して、各コマンドに関連付けられている主要ODBC関数コールの実行に必要な経過時間を表示します。

Command> connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;DRIVER=
E:\WINNT\System32\TTdv1122.dll;
(Default setting AutoCommit=1)

Command> timing 1;
Command> create table t1 (key number not null primary key, value char(20));
Execution time (SQLExecute) = 0.007247 seconds.
Command> prepare insert into t1 values (:f, :g);
Execution time (SQLPrepare) = 0.000603 seconds.

Command> exec;
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 'F' (NUMBER) > 1;
Enter Parameter 2 'G' (CHAR) > 'abc';
1 row inserted.
Execution time (SQLExecute) = 0.000454 seconds.

Command> exec;
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 help command.
Enter Parameter 1 'F' (NUMBER) > 2;
Enter Parameter 2 'G' (CHAR) > 'def';
1 row inserted.
Execution time (SQLExecute) = 0.000300 seconds.

Command> free;
Command> select * from t1;
< 1, abc                  >
< 2, def                  >
2 rows found.
Execution time (SQLExecute + Fetch Loop) = 0.000226 seconds.

Command> disconnect;
Disconnecting...
Execution time (SQLDisconnect) = 2.911396 seconds. 
Command>

前述の例では、準備するSQL文がprepareコマンドの直後に指定されています。ttIsqlでSQL文を準備すると、常に、一意のコマンドIDが準備済の文に割り当てられます。ttIsqlユーティリティでは、複数の準備済の文の追跡にこのIDが使用されます。ttIsqlセッションには、最大256の準備済の文が同時に存在できます。freeコマンドを実行すると、準備済のSQL文に対するコマンドIDの関連付けが自動的に解除されます。

準備済の文コマンドを使用した場合にttIsqlによって生成されるコマンドIDを表示するには、文を準備する前にverbosityコマンドを使用して冗長性レベルを4に設定するか、またはdescribe *コマンドを使用して準備済のすべての文をそれらのIDとともに表示します。

コマンドIDは、ttIsqlの準備済の文コマンドを使用する場合に明示的に参照できます。ttIsqlの準備済の文コマンドの構文の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlの項を参照するか、またはttIsqlコマンド・プロンプトでhelpと入力してください。

次の例では、1つのNUMBERパラメータを含む述語が指定されているSELECT文を準備および実行します。fetchoneコマンドは、この文によって生成された結果行をフェッチするために使用します。showplanコマンドは、この文の実行時にTimesTen問合せオプティマイザで使用される実行計画を表示するために使用します。また、冗長性レベルは、準備済の文を追跡するためにttIsqlで使用されるコマンドIDが表示されるように4に設定します。

Command> connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\Sys tem32\TTdv1122.dll;
(Default setting AutoCommit=1)
The command succeeded.
Command> CREATE TABLE T1 (KEY NUMBER NOT NULL PRIMARY KEY, VALUE CHAR (64));
The command succeeded.
Command> INSERT INTO T1 VALUES (1, 'abc');
1 row inserted.
The command succeeded.
Command> autocommit 0;
Command> showplan 1;
Command> verbosity 4;
The command succeeded.
Command> prepare SELECT * FROM T1 WHERE KEY=?;
Assigning new prepared command id = 0.

Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           RowLkRangeScan
  TBLNAME:             T1
  IXNAME:              T1
  INDEXED CONDITION:   T1.KEY = _QMARK_1
  NOT INDEXED:         <NULL>
 
The command succeeded.
Command> exec;

Executing prepared command id = 0.
 
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 '_QMARK_1' (NUMBER) > 1
The command succeeded.
Command> fetchone;
Fetching prepared command id = 0.
< 1, abc                                                              >
1 row found.
The command succeeded.
Command> close;
Closing prepared command id = 0.
The command succeeded.
Command> free;
Freeing prepared command id = 0.
The command succeeded.
Command> commit;
The command succeeded.
Command> disconnect;
Disconnecting...
The command succeeded.
Command>

注意:

PL/SQLホスト変数を指定したttIsqlの使用方法については、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のTimesTenデータベースでのPL/SQLに関する概要の説明を参照してください。

変数の使用、宣言、構成方法

次の項では、ttIsqlでバインド変数を宣言、構成および使用する方法について説明します。

バインド変数の宣言および設定

ttIsqlで、SQL文、SQLスクリプトまたはPL/SQLブロックから参照可能な変数および配列を宣言および構成できます。variableおよびsetvariableコマンドを使用して宣言した変数は、NUMBERCHARNCHARVARCHAR2NVARCHAR2CLOBNCLOBBLOBREFCURSORのデータ型の1つである必要があります。ただし、配列をバインドする場合、TimesTenでは、NUMBERCHARNCHARVARCHAR2NVARCHAR2データ型の配列のバインドのみをサポートしています。


注意:

宣言したすべての変数は、ttIsqlのセッションの間存続します。ただし、同じ名前の新しい変数を宣言すると、新しい変数が古い変数に置き換えられます。

次の例では、数値、文字列、配列のバインド変数をvariableまたはvarコマンドで宣言しています。それぞれは、宣言時またはsetvariableまたはsetvarコマンドを使用して、値に割り当てられます。


注意:

これらのコマンドの構文の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する説明を参照してください。

Command> VARIABLE house_number NUMBER := 268;
Command> PRINT house_number;
HOUSE_NUMBER            : 268

Command> VARIABLE street_name VARCHAR2(15);
Command> SETVARIABLE street_name := 'Oracle Parkway'; 

Command> VARIABLE occupants[5] VARCHAR2(15);
Command> SETVARIABLE occupants[1] := 'Pat'; 
Command> SETVARIABLE occupants[2] := 'Terry';
Command> PRINT occupants;
OCCUPANTS            : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat
OCCUPANTS[2] : Terry

次に、配列に複数の値をバインドする例を示します(大カッコは値の記述用に使用し、カンマは配列内の各値を区切るために使用します)。

Command> VARIABLE occupants[5] VARCHAR2(15) := ['Pat', 'Terry'];
Command> PRINT occupants;
OCCUPANTS : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat
OCCUPANTS[2] : Terry

バインド配列を使用する場合、PL/SQLでは、次の宣言で各変数をPL/SQL変数にバインドできます(ここで、TypeNameはPL/SQLデータ型を一意に識別し、DataTypeには、CHARNCHARVARCHAR2またはNVARCHAR2を指定できます)。

TYPE TypeName IS TABLE OF DataType(<precision>) INDEX BY BINARY_INTEGER;
 

変数がNUMBERの配列として宣言された場合、NUMBERINTEGERFLOATまたはDOUBLE PRECISIONのデータ型のPL/SQL変数にバインドすることが可能です。これを行うには、次の適切な宣言を行います。

TYPE TypeName IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF FLOAT INDEX BY BINARY_INTEGER;
TYPE TypeName IS TABLE OF DOUBLE PRECISION INDEX BY BINARY_INTEGER;

次の例は、その後PL/SQLブロックで宣言され使用されるoccupants VARCHAR2配列を宣言します。

Command> VARIABLE occupants[5] VARCHAR2(15);
Command> SETVARIABLE occupants[1] := 'Pat';
Command> SETVARIABLE occupants[2] := 'Terry';
Command> DECLARE
       > TYPE occuname IS TABLE OF VARCHAR2(15) INDEX BY BINARY_INTEGER;
       > x occuname;
       > BEGIN
       > x := :occupants;
       > FOR LROW IN x.FIRST..x.LAST LOOP
       >   x(LROW) := x(LROW) || ' Doe';
       > END LOOP;
       > :occupants := x;
       > END;
       > /
 
PL/SQL procedure successfully completed.
 
Command> PRINT occupants;
OCCUPANTS            : ARRAY [ 5 ] (Current Size 2)
OCCUPANTS[1] : Pat Doe
OCCUPANTS[2] : Terry Doe

取得した列のバインド変数の自動作成

ttIsqlにautovariablesを構成すると、TimesTenでは、最後にフェッチした行の各列名を使用したバインド変数を自動作成します。自動バインド変数は、他のすべてのバインド変数と同様に使用できます。

次の例では、employees表からすべての行が選択されます。すべての列が取得されるので、自動変数が作成され、各列に名前が付けられます。このバインド変数には、各列で取得した最後の値が含まれます。

Command> SET AUTOVARIABLES ON;
Command> SELECT * FROM employees;
...
< 204, Hermann, Baer, HBAER, 515.123.8888, 1994-06-07 00:00:00, PR_REP, 10000,
 <NULL>, 101, 70 >
< 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 1994-06-07 00:00:00, AC_MGR, 
12000, <NULL>, 101, 110 >
< 206, William, Gietz, WGIETZ, 515.123.8181, 1994-06-07 00:00:00, AC_ACCOUNT, 
8300, <NULL>, 205, 110 >

Command> PRINT;
EMPLOYEE_ID          : 206
FIRST_NAME           : William
LAST_NAME            : Gietz
EMAIL                : WGIETZ
PHONE_NUMBER         : 515.123.8181
HIRE_DATE            : 1994-06-07 00:00:00
JOB_ID               : AC_ACCOUNT
SALARY               : 8300
COMMISSION_PCT       : <NULL>
MANAGER_ID           : 205
DEPARTMENT_ID        : 110

列名として別名を渡すと、自動バインド変数名に列名ではなくその別名が使用されます。

Command> SET AUTOVARIABLES ON;
Command> SELECT employee_id ID, First_name SURNAME, last_name LASTNAME 
 FROM employees;
 
ID, SURNAME, LASTNAME
...
< 204, Hermann, Baer >
< 205, Shelley, Higgins >
< 206, William, Gietz >
107 rows found.
Command> PRINT;
ID                   : 206
SURNAME              : William
LASTNAME             : Gietz

既知の列名を指定せずにデータをフェッチする問合せでは、列名を表示するようにcolumnlabels onを設定します。次の例では、ttConfiguration組込みプロシージャによって、paramnameおよびparamvalueの列が返されています。

Command> SET AUTOVARIABLES ON;
Command> SET COLUMNLABELS ON;

Command> call TTCONFIGURATION('PLSQL');

PARAMNAME, PARAMVALUE
< PLSQL, 1 >
1 row found.

Command> IF :paramvalue = 1 THEN "e:PLSQL is enabled";
PLSQL is enabled
Command> IF NOT  :paramvalue = 1 THEN "e:PLSQL is not enabled";

また、describeを使用すると列名を表示することもできます。次の例では、describeコマンドを使用し、ttConfiguration組込みプロシージャの列名を表示します。

Command> DESCRIBE TTCONFIGURATION;
 
Procedure TTCONFIGURATION:
  Parameters:
    PARAMNAME                       TT_VARCHAR (30)
  Columns:
    PARAMNAME                       TT_VARCHAR (30) NOT NULL
    PARAMVALUE                      TT_VARCHAR (1024)
 
1 procedure found.

PL/SQLブロックの作成および実行

PL/SQLブロックは、ttIsqlコマンドラインから作成および実行できます。

PL/SQLブロックから生成された結果を表示するには、serveroutputをonに設定します。

Command> set serveroutput on

出力バッファにテキスト行を挿入する無名ブロックを作成します。ブロックはスラッシュ(/)で終了する必要があります。

Command> BEGIN
       > DBMS_OUTPUT.put_line(
       >   'Welcome!');
       > END;
       > /
Welcome!
PL/SQL procedure successfully completed.
Command>

その他の例は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』を参照してください。PL/SQLオブジェクト用のttIsqlにおけるエラー処理の詳細は、『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』のttIsqlにおけるエラー表示に関する項を参照してください。

OUTパラメータを使用したPL/SQLからのデータの受渡し

OUTパラメータを使用して、PL/SQLからアプリケーションにデータを戻すことができます。次の例では、TimesTenデータベースの空き状況に関する情報を戻します。

tt_space_info PL/SQLプロシージャを作成し、SQLを使用してpermpctpermmaxpcttemppctおよびtempmaxpctの各パラメータに値を入力します。

Command> CREATE OR REPLACE PROCEDURE tt_space_info
       >   (permpct    OUT PLS_INTEGER,
       >    permmaxpct OUT PLS_INTEGER,
       >    temppct    OUT PLS_INTEGER,
       >    tempmaxpct OUT PLS_INTEGER) AS
       >    monitor    sys.monitor%ROWTYPE;
       > BEGIN
       >   SELECT * INTO monitor FROM sys.monitor;
       >   permpct := monitor.perm_in_use_size * 100 / 
                 monitor.perm_allocated_size;
       >   permmaxpct := monitor.perm_in_use_high_water * 100 / 
                 monitor.perm_allocated_size;
       >   temppct := monitor.temp_in_use_size * 100 / 
                 monitor.temp_allocated_size;
       >   tempmaxpct := monitor.temp_in_use_high_water * 100 / 
                 monitor.temp_allocated_size;
       > END;
       >/

Procedure created.

変数を宣言し、tt_space_infoをコールします。出力できるように、パラメータ値がttIsqlに戻されます。

Command> VARIABLE permpct NUMBER
Command> VARIABLE permpctmax NUMBER
Command> VARIABLE temppct NUMBER
Command> VARIABLE temppctmax NUMBER
Command> BEGIN
       >   tt_space_info(:permpct, :permpctmax, :temppct, :temppctmax);
       > END;
       >/

PL/SQL procedure successfully completed.

Command> PRINT permpct;
PERMPCT              : 4

Command> PRINT permpctmax;
PERMPCTMAX           : 4

Command> PRINT temppct;
TEMPPCT              : 11

Command> PRINT temppctmax;
TEMPPCTMAX           : 11

また、PL/SQL文で実行可能な文ハンドルを、OUT参照カーソル・パラメータで戻すこともできます。PL/SQL文はカーソルに関連付けられている問合せを選択できます。次の例は、昇順と降順をランダムに選択する参照カーソルをオープンします。

Command> VARIABLE ref REFCURSOR;
Command> BEGIN
    >    IF (mod(dbms_random.random(), 2) = 0) THEN
    >     open :ref for select object_name from SYS.ALL_OBJECTS order by 1 asc;
    >    ELSE
    >     open :ref for select object_name from SYS.ALL_OBJECTS order by 1 desc;
    >    end if;
    >   END;
    >   /

PL/SQL procedure successfully completed.

参照カーソルから結果セットをフェッチするには、PRINTコマンドを使用します。

Command> PRINT ref 
REF           : 
< ACCESS$ >
< ALL_ARGUMENTS >
< ALL_COL_PRIVS >
< ALL_DEPENDENCIES >
...
143 rows found.

または、結果セットが降順になっている場合、次のように出力されます。

Command> PRINT ref
REF          : 
< XLASUBSCRIPTIONS >
< WARNING_SETTINGS$ >
< VIEWS >
...
143 rows found.

IF-THEN-ELSEコマンド構成を使用した条件制御

IF-THEN-ELSEコマンド構成を使用すると、ttIsqlセッションに条件ブランチ・ロジックを実装できます。IFコマンドによって条件がテストされ、THEN句内またはオプションのELSE句内のコマンドを実行するかが決定されます。SQL文、SQLスクリプト、PL/SQLブロックまたはTimesTenユーティリティのコマンドを実行できます。


注意:

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

次の例では、PL/SQLが有効であるかを確認するバインド変数を作成およびテストします。これでは、autovariablesコマンドを使用し、ttConfigurationに対するコールの結果からバインド変数が作成されます。この値はparamvalue変数をテストすることによってIF-THEN-ELSE条件内でテストできます。


注意:

autovariablesコマンドの詳細は、「取得した列のバインド変数の自動作成」を参照してください。

Command> SET AUTOVARIABLES ON;
Command> CALL TTCONFIGURATION('PLSQL');
PARAMNAME, PARAMVALUE
< PLSQL, 1 >
1 row found.
Command> IF :paramvalue = 1 THEN "e:PLSQL is enabled"
> ELSE "e:PLSQL is not enabled";
PLSQL is enabled

次の例では、employees表の存在の有無が確認されます。存在しない場合、employees表を作成するSQLスクリプトが実行されます(存在する場合はメッセージが表示されます)。

Command> IF 0 = "SELECT COUNT(*) FROM SYS.TABLES 
       > WHERE TBLNAME LIKE 'employees';"
       > THEN "e:EMPLOYEES table already exists"
       > ELSE "@HR_CRE_TT.SQL;";
EMPLOYEES table already exists

Oracle DatabaseからTimesTen表へのデータのロード

結果を含めるためのキャッシュ・グリッド、キャッシュ・グループおよびキャッシュ表を作成しないで、バックエンドOracle DatabaseからのSQL問合せの結果をTimesTenの単一表にロードできます。TimesTenでは、Oracle Databaseでユーザーが指定したSELECT文を実行し、その結果セットをTimesTenの表にロードするツールが提供されます。

次は、このタスクを実行するために行う主要な手順です。

  1. 適切な列とデータ型を備えた表をTimesTenに作成します。

  2. Oracle Databaseで実行されて目的の結果セットを生成するSELECT文を指定します。

  3. 結果セットをTimesTenの表にロードします。

TimesTenには、これらのタスクを実行するために2通りの方法があります。

  • ttIsqlユーティリティは、createandloadfromoraqueryコマンドを備えており、このコマンドではTimesTen表名およびSELECT文が指定されると自動的にTimesTen表を作成し、SELECT文をOracle Databaseで実行して、結果セットをTimesTen表にロードします。このコマンドの詳細は、「ttIsqlを使用した表の作成およびSQL問合せ結果のロード」を参照してください。

  • ttTableSchemaFromOraQueryGet組込みプロシージャは、ユーザー指定のSELECT文を評価して、TimesTenに表を作成するために実行できるCREATE TABLE文を生成します。この文は、SELECT文からの結果セットを適切に受け取ります。ttLoadFromOracle組込みプロシージャは、Oracle DatabaseでSELECT文を実行し、結果セットをTimesTen表にロードします。これらの組込みプロシージャの詳細は、「TimesTen組込みプロシージャを使用した表の推奨およびSQL問合せ結果のロード」を参照してください。

両方の方法では、次のことが必要です。

  • 関係するTimesTenデータベースとOracle Databaseの両方が同じ各国語データベース・キャラクタ・セットで構成されている必要があります。

  • TimesTenデータベースに接続する場合、接続は、次のようにキャッシュ・グループを使用するときに必要な同じ接続属性を含んでいる必要があります。

    • TimesTenデータベースとOracle Databaseの両方で同じである必要があるユーザー名


      注意:

      SQL文がそのために実行されるように、データベースごとにユーザーに適切な権限が付与されている必要があります。

    • PWDおよびOraclePWD接続属性で適切な各ユーザーの適切なパスワード

    • Oracle Databaseインスタンスを識別するOracleNetServiceName接続属性

  • いずれの方法でも、ユーザーは次のものを指定します。

    • SQL問合せの結果がロードされるTimesTenデータベースの表名。表の所有者を指定しない場合、現行のユーザーが所有者として表が作成されます。表名は、SQL文が実行されるOracle Databaseの表名と同じである必要はありません。この表は主キーを必要としません。表がすでに存在している場合は、警告が発行され、取得された行が表に追加されます。

    • オプションで、表に結果セットをロードする際に並行して使用されるパラレル・スレッドの数。このデフォルトは4です。

    • 必要な行を取得するためにOracle Databaseに対して実行されるSQL SELECT文。このSELECT文内に指定する表は、表が現行のOracle Databaseユーザーのスキーマ内にある場合を除き、完全修飾する必要があります。問合せはパラメータ・バインディングを持つことができません。

      SELECTリストには、単一の列参照または列エイリアスを含める必要があります。たとえば、SELECTリスト内の式は、列エイリアスとともに指定する必要があります。結果表内で列の重複を避けるために、列エイリアスを使用することもできます。たとえば、SELECT C1+1 FROM T1を使用するかわりに、SELECT C1 + 1 C2 FROM T1を使用します。これは、C2という列を作成します。

TimesTenは、SELECT文を評価し、列名、データ型およびNULL値可能情報を使用して、結果セットをロードする表をTimesTenに作成します。列名およびデータ型(同じまたはマップ済)は、SELECT文に関係するOracle Databaseの表から取得されます。ただし、その他のOracle Database表定義情報(DEFAULT値、主キー、外部キー関係など)は、TimesTen表にCREATE TABLE文を作成する場合には使用されません。


注意:

サポートされていないデータ型が評価によって返される場合、または構文エラーなどでOracle Databaseで問合せが実行できない場合、警告がログに記録され、出力中のサポートされていない行にコメントが表示されます。ただし、データ型がTimesTenでサポートされていない場合、SELECTリストでデータ型を、TimesTenでサポートされているデータ型にキャストできます。

ロード・プロセスでは、TimesTen表の列のデータ型とサイズが結果セットのデータ型とサイズに一致することを確認しません。かわりに、挿入が試行され、列のデータ型がマップできない場合、またはSQL問合せからのOracle DatabaseデータがTimesTenの列サイズを超える場合は、TimesTenによってエラーが返されます。

256行ごとにロードは自動的にコミットされます。ロード時にエラーが発生した場合、ロードは終了しますが、コミットされたトランザクションはロールバックされません。Oracle Databaseから返されるエラーは、キャッシュ・グループを使用する場合と同じ方法で報告されます。

createandloadfromoraqueryコマンドおよびttLoadFromOracle組込みプロシージャを使用して既存のTimesTen表にロードできるため、次の制限事項が適用されます。

  • システム表、ディクショナリ表、一時表、ビューのディテール表、マテリアライズド・ビュー表、マテリアライズド・ビュー・ログ表、またはキャッシュ・グループ内にすでにある表にはロードできません。また、表名にシノニムは使用できません。

  • 外部キー制約の参照表(子表)である既存の表に結果セットをロードする場合、その制約は検証されません。その結果、親行を失っている行がロードされることがあります。そのかわり、表がロードされた後ですべての外部キーを確認する必要があります。

次の項では、個々の方法の詳細について説明します。

ttIsqlを使用した表の作成およびSQL問合せ結果のロード

ttIsqlユーティリティは、createandloadfromoraqueryコマンドを提供します。これは、表名、パラレル・スレッドの数、および入力パラメータとしてOracle Databaseで実行できるSELECT文を取得します。これらのパラメータで、TimesTenは次のことを実行します。

  1. SQL問合せを評価し、適切な表を作成します(まだ作成されていない場合)。そのとき、この表は提供された表名を持ち、列名はSQL問合せで指定された名前を使用し、結果データの取得元のOracle Database表と同じ(またはマップされた)データ型を持ちます。

  2. Oracle Databaseで実行されるSQL問合せの結果をこの表にロードします。コールは、ロードされる行数を示す単一の数を返します。このコマンドに対する後続のコールは、取得された行を表に追加します。


注意:

構文、要件、制限および必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttIsql」のcreateandloadfromoraqueryコマンドを参照してください。

次のttIsqlの例では、DSN、ユーザー名、このユーザーのTimesTenでのパスワード、およびOracle Databaseでの同じユーザー名のパスワードを指定して接続します。次に、createandloadfromoraqueryコマンドを実行して、SELECT文を評価します。取得された行の列とデータ型と同じ列名とデータ型のemployees表がTimesTenに作成されます。この表には、2つのパラレル・スレッドによってOracle Databaseから返された結果セットが移入されます。

ttisql -connstr "DSN=cachedb1_1122;UID=oratt;PWD=timesten;OraclePWD=oracle"
 
Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql
connect -connstr "DSN=mydb;UID=oratt;PWD=timesten;OraclePWD=oracle";
Connection successful: DSN=mydb;UID=oratt;
DataStore=/timesten/install/info/DemoDataStore/mydb;DatabaseCharacterSet=US7ASCII;
ConnectionCharacterSet=US7ASCII;DRIVER=/timesten/install/lib/libtten.so;
PermSize=40;TempSize=32;TypeMode=0;OracleNetServiceName=inst1;

(Default setting AutoCommit=1)
Command> createandloadfromoraquery employees 2 SELECT * FROM hr.employees;
Mapping query to this table:
    CREATE TABLE "ORATT"."EMPLOYEES" (
    "EMPLOYEE_ID" number(6,0) NOT NULL,
    "FIRST_NAME" varchar2(20 byte),
    "LAST_NAME" varchar2(25 byte) NOT NULL,
    "EMAIL" varchar2(25 byte) NOT NULL,
    "PHONE_NUMBER" varchar2(20 byte),
    "HIRE_DATE" date NOT NULL,
    "JOB_ID" varchar2(10 byte) NOT NULL,
    "SALARY" number(8,2),
    "COMMISSION_PCT" number(2,2),
    "MANAGER_ID" number(6,0),
    "DEPARTMENT_ID" number(4,0)
     )
Table employees created
107 rows loaded from oracle.

DESCRIBEコマンドを実行して、新しい表を表示します。


注意:

この例では表の所有者が指定されていないため、デフォルトで現行のユーザーになります。この例では、現行のユーザーはorattです。

Command> DESCRIBE employees;
 
Table ORATT.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)
 
1 table found.
(primary key columns are indicated with *)
 
Command> SELECT * FROM employees;
< 114, Den, Raphaely, DRAPHEAL, 515.127.4561, 2002-12-07 00:00:00, PU_MAN, 
11000, <NULL>, 100, 30 >
< 115, Alexander, Khoo, AKHOO, 515.127.4562, 2003-05-18 00:00:00, PU_CLERK, 
3100, <NULL>, 114, 30 >
…
< 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 2002-06-07 00:00:00, 
AC_MGR, 12008, <NULL>, 101, 110 >
< 206, William, Gietz, WGIETZ, 515.123.8181, 2002-06-07 00:00:00, 
AC_ACCOUNT, 8300, <NULL>, 205, 110 >
107 rows found. 

次の例は、createandloadfromoraqueryコマンドを使用してTimesTenにoratt.emp表を作成し、この表に、Oracle Databaseのhr.employees表のデータ(employee_idが200未満)を、4つのスレッドによりパラレルに移入します。

Command> createandloadfromoraquery emp 4 SELECT * FROM hr.employees 
 WHERE employee_id < 200;
Mapping query to this table:
    CREATE TABLE "ORATT"."EMP" (
    "EMPLOYEE_ID" number(6,0) NOT NULL,
    "FIRST_NAME" varchar2(20 byte),
    "LAST_NAME" varchar2(25 byte) NOT NULL,
    "EMAIL" varchar2(25 byte) NOT NULL,
    "PHONE_NUMBER" varchar2(20 byte),
    "HIRE_DATE" date NOT NULL,
    "JOB_ID" varchar2(10 byte) NOT NULL,
    "SALARY" number(8,2),
    "COMMISSION_PCT" number(2,2),
    "MANAGER_ID" number(6,0),
    "DEPARTMENT_ID" number(4,0)
     )
 
Table emp created
100 rows loaded from oracle.

そして、次のcreateandloadfromoraqueryは、idが200より大きいすべての従業員を取得し、結果セットはTimesTenの既存の表に追加されます。警告によって、表がすでに存在していて、6行がこの表に追加されたことが伝えられます。

Command> createandloadfromoraquery emp 4 SELECT * FROM hr.employees 
 WHERE employee_id > 200;
Warning  2207: Table ORATT.EMP already exists
6 rows loaded from oracle.

パラレル・ロード処理は実行時間が長くなる場合があるため、処理を取り消す必要がある場合があります。パラレル・ロード処理の取消し方法の詳細は、「パラレル・ロード処理の取消し」を参照してください。

TimesTen組込みプロシージャを使用した表の推奨とSQL問合せ結果のロード

createandloadfromoraqueryコマンドが、TimesTen表を作成しOracle Databaseからの結果セットをこの表にロードするためのすべてのタスクを自動的に実行する一方で、次の2つの組込みプロシージャは同じ機能を次の2つの手順に分離します。

  1. ttTableSchemaFromOraQueryGet組込みプロシージャは、SQL問合せを評価し、実行を選択できるCREATE TABLE SQL文を生成します。この文を実行するには、Oracle Databaseで問合せを実行するために必要なすべての権限をユーザーが持つ必要があります。これにより、実行なしで表構造を表示することができます。ただし、推奨されたCREATE TABLE文を自分で実行する必要があります。

  2. ttLoadFromOracle組込みプロシージャは、バックエンドOracle DatabaseでSQL問合せを実行し、次に結果セットをTimesTen表にロードします。これは、結果をロードするTimesTen表名、必要な行を取得するためのOracle Database SQL SELECT文、および表に結果セットをロードする際に並行して使用するパラレル・スレッドの数を必要とします。

    コールは、ロードされる行数を示す単一の数を返します。後続のコールは、取得された行を表に追加します。


注意:

構文、要件、制限および必要な権限の詳細は、『Oracle TimesTen In-Memory Databaseリファレンス』の「ttTableSchemaFromOraQueryGet」および「ttLoadFromOracle」を参照してください。

次の例は、DSN、ユーザー名、このユーザーのTimesTenでのパスワード、Oracle Databaseでの同じ名前のユーザーのパスワード、およびOracle DatabaseインスタンスのOracleNetServiceNameを指定して接続します。次に、ttTableSchemaFromOraQueryGet組込みプロシージャをコールして、SELECT文を評価し、employees表用に推奨されたCREATE TABLE文を返します。最後に、この例では、ttLoadFromOracle組込みプロシージャをコールして、Oracle Databaseからの結果セットをemployees表にロードします。ロードは、4つのスレッドによりパラレルに実行されます(デフォルト)。


注意:

autocommitがoffに設定されている場合、表のロード後に、ユーザーは手動でコミットまたはロールバックを行う必要があります。

$ ttisql "DSN=mydb;uid=oratt;pwd=timesten;
OraclePwd=oracle;OracleNetServiceName=inst1"
Copyright (c) 1996-2013, Oracle.  All rights reserved.
Type ? or "help" for help, type "exit" to quit ttIsql.
connect "DSN=mydb;uid=oratt;pwd=timesten;
OraclePwd=oracle;OracleNetServiceName=inst1";
Connection successful: DSN=mydb;UID=oratt;
DataStore=/timesten/install/info/DemoDataStore/mydb;
DatabaseCharacterSet=US7ASCII;ConnectionCharacterSet=US7ASCII;
DRIVER=/timesten/install/lib/libtten.so;PermSize=40;TempSize=32;
TypeMode=0;OracleNetServiceName=inst1;
(Default setting AutoCommit=1)

Command> call ttTableSchemaFromOraQueryGet('hr','employees',
 'SELECT * FROM hr.employees');
< CREATE TABLE "HR"."EMPLOYEES" (
"EMPLOYEE_ID" number(6,0) NOT NULL,
"FIRST_NAME" varchar2(20 byte),
"LAST_NAME" varchar2(25 byte) NOT NULL,
"EMAIL" varchar2(25 byte) NOT NULL,
"PHONE_NUMBER" varchar2(20 byte),
"HIRE_DATE" date NOT NULL,
"JOB_ID" varchar2(10 byte) NOT NULL,
"SALARY" number(8,2),
"COMMISSION_PCT" number(2,2),
"MANAGER_ID" number(6,0),
"DEPARTMENT_ID" number(4,0)
 ) >
1 row found.

Command> CALL ttLoadFromOracle ('HR','EMPLOYEES','SELECT * FROM HR.EMPLOYEES');
< 107 >
1 row found.

Command> SELECT * FROM hr.employees;
< 100, Steven, King, SKING, 515.123.4567, 2003-06-17 00:00:00, AD_PRES, 24000,
<NULL>, <NULL>, 90 >
< 101, Neena, Kochhar, NKOCHHAR, 515.123.4568, 2005-09-21 00:00:00, AD_VP, 17000, 
<NULL>, 100, 90 >
...
< 205, Shelley, Higgins, SHIGGINS, 515.123.8080, 2002-06-07 00:00:00, AC_MGR, 
12008, <NULL>, 101, 110 >
< 206, William, Gietz, WGIETZ, 515.123.8181, 2002-06-07 00:00:00, AC_ACCOUNT, 
8300, <NULL>, 205, 110 >
107 rows found.

次の例では、Oracle Databaseに表を作成しますが、ここでemployee_idPRIMARY KEY制約のある列で、emailUNIQUE制約のある列です。

SQL> CREATE TABLE employees    ( employee_id    NUMBER(6) PRIMARY KEY
    , first_name     VARCHAR2(20)
    , last_name      VARCHAR2(25) NOT NULL
    , email          VARCHAR2(25) NOT NULL UNIQUE
    , 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)    ) ;

Table created.

次に、次のttTableSchemaFromOraQueryGet組込みプロシージャがSQL問合せを評価し、CREATE TABLE SQL文を生成します。推奨されたCREATE TABLE SQL文では、PRIMARY KEY制約およびUNIQUE制約はOracle Databaseから継承されないことに注意してください。NULL値可能制約はOracle Databaseから継承されます。これはcreateandloadfromoraqueryコマンドにも適用されます。

Command> call ttTableSchemaFromOraQueryGet ('oratt', 'employees', 'select * from oratt.employees');
< CREATE TABLE "ORATT"."EMPLOYEES" ( 
"EMPLOYEE_ID" number(6,0) NOT NULL,
"FIRST_NAME" varchar2(20 byte),
"LAST_NAME" varchar2(25 byte) NOT NULL,
"EMAIL" varchar2(25 byte) NOT NULL,
"PHONE_NUMBER" varchar2(20 byte),
"HIRE_DATE" date NOT NULL,
"JOB_ID" varchar2(10 byte) NOT NULL,
"SALARY" number(8,2),
"COMMISSION_PCT" number(2,2),
"MANAGER_ID" number(6,0),
"DEPARTMENT_ID" number(4,0)
 ) >
1 row found.

パラレル・ロード処理は実行時間が長くなる場合があるため、処理を取り消す必要がある場合があります。パラレル・ロード処理の取消し方法の詳細は、「パラレル・ロード処理の取消し」を参照してください。

パラレル・ロード処理の取消し

SQLCancel(hstmt) ODBC関数を使用して、またはttIsqlユーティリティで[Ctrl]キーを押したまま[C]キーを押すことによって、パラレル・ロード処理を実行しているすべてのスレッドを取り消して、完全に停止できます。詳細は、『Oracle TimesTen In-Memory Database C開発者ガイド』のサポートされているODBC関数に関する説明およびこのマニュアルの「ODBC関数の取消し」を参照してください。

パラレル・ロード処理は定期的にコミットされるため、成功した処理はロールバックされません。cancelコマンドを発行すると、次の時点でTimesTenは処理を取り消します。

  • 挿入スレッドが生成される前。

  • 挿入バッチのコミット後(256行ごと)。

  • メイン・スレッドがOracle Databaseからのフェッチを完了した後。

取り消したパラレル・ロード処理を再試行するには、重複行を避けるためにTimesTenデータベースから前回挿入した行を削除します。

問合せオプティマイザ計画の参照および変更

次の項では、問合せオプティマイザ計画、SQLコマンド・キャッシュ内のコマンド、またはSQLコマンド・キャッシュ内のコマンドに関する問合せ計画を表示する方法について説明します。

showplanコマンドの使用

組込みshowplanコマンドを使用すると、TimesTen Data Managerで問合せの実行に使用される問合せオプティマイザ計画が表示されます。また、ttIsqlには、この問合せオプティマイザ計画を変更するための組込み問合せオプティマイザ・ヒント・コマンドが用意されています。showplanコマンドと、次に示すttIsqlコマンドを組み合せて使用すると、最適な実行計画を設計できます。TimesTen問合せオプティマイザの詳細は、「TimesTen問合せオプティマイザ」を参照してください。

  • optprofile - 現行のオプティマイザ・ヒントの設定および結合順序を表示します。

  • setjoinorder - 結合順序を設定します。

  • setuseindex - 索引ヒントを設定します。

  • tryhash - ハッシュ索引の使用を有効または無効にします。

  • trymergejoin: マージ結合を有効または無効にします。

  • trynestedloopjoin - ネステッド・ループ結合を有効または無効にします。

  • tryserial - シリアル・スキャンを有効または無効にします。

  • trytmphash - 一時ハッシュ索引の使用を有効または無効にします。

  • trytmptable - 中間結果表の使用を有効または無効にします。

  • trytmprange: 一時範囲索引の使用を有効または無効にします。

  • tryrange: 範囲索引の使用を有効または無効にします。

  • tryrowid - ROWIDスキャンの使用を有効または無効にします。

  • trytbllocks: 表ロックの使用を有効または無効にします。

  • unsetjoinorder - 結合順序を消去します。

  • unsetuseindex - 索引ヒントを消去します。

showplanコマンドおよび問合せオプティマイザ・ヒント・コマンドを使用する場合は、自動コミット機能が無効である必要があります。自動コミットを無効にするには、ttIsqlautocommitコマンドを使用します。

次の例では、これらのコマンドを使用して問合せオプティマイザの実行計画を変更する方法を示します。

Command> CREATE TABLE T1 (A NUMBER);
Command> CREATE TABLE T2 (B NUMBER);
Command> CREATE TABLE T3 (C NUMBER);
Command> INSERT INTO T1 VALUES (3);
1 row inserted.
Command> INSERT INTO T2 VALUES (3);
1 row inserted.
Command> INSERT INTO T3 VALUES (3);
1 row inserted.
Command> INSERT INTO T1 VALUES (4);
1 row inserted.
Command> INSERT INTO T2 VALUES (5);
1 row inserted.
Command> INSERT INTO T3 VALUES (6);
1 row inserted.
Command> autocommit 0;
Command> showplan;
Command> SELECT * FROM T1, T2, T3 WHERE A=B AND B=C AND A=B;

Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               3
  OPERATION:           TblLkSerialScan
  TBLNAME:             T2
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
 
  STEP:                2
  LEVEL:               3
  OPERATION:           TblLkSerialScan
  TBLNAME:             T3
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         T2.B = T3.C
 
 
  STEP:                3
  LEVEL:               2
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
 
  STEP:                4
  LEVEL:               2
  OPERATION:           TblLkSerialScan
  TBLNAME:             T1
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         T1.A = T2.B AND T1.A = T2.B
 
 
  STEP:                5
  LEVEL:               1
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
< 3, 3, 3 >
1 row found.

Command> trytbllocks 0;
Command> tryserial 0;
Command> SELECT * FROM T1, T2, T3 WHERE A=B AND B=C AND A=B;

Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               3
  OPERATION:           TmpRangeScan
  TBLNAME:             T2
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
 
  STEP:                2
  LEVEL:               3
  OPERATION:           RowLkSerialScan
  TBLNAME:             T3
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         T2.B = T3.C
 
 
  STEP:                3
  LEVEL:               2
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
 
  STEP:                4
  LEVEL:               2
  OPERATION:           RowLkSerialScan
  TBLNAME:             T1
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         T1.A = T2.B AND T1.A = T2.B
 
 
  STEP:                5
  LEVEL:               1
  OPERATION:           NestedLoop
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
< 3, 3, 3 >
1 row found.

この例では、3つの表に対して問合せが実行され、問合せオプティマイザの計画が表示されています。1つ目のバージョンの問合せでは、問合せオプティマイザのデフォルトの実行計画が使用されています。ただし、2つ目のバージョンでは、trytbllocksおよびtryserialttIsql組込みヒント・コマンドを使用して問合せオプティマイザの計画が変更されています。2つ目のバージョンの問合せでは、シリアル・スキャンおよびネステッド・ループ結合ではなく、一時索引スキャン、シリアル・スキャンおよびネステッド・ループが使用されています。

このように、showplanコマンドをttIsqlの組込み問合せオプティマイザ・ヒント・コマンドと組み合せて使用すると、アプリケーション要件を満たすために使用する実行計画を迅速に決定できます。

SQLコマンド・キャッシュからのコマンドおよび実行計画の表示

次の項では、コマンドおよびその実行計画の表示方法について説明します。

SQLコマンド・キャッシュに格納されたコマンドの表示

ttIsqlcmdcacheコマンドで、ttSqlCmdCacheInfo組込みプロシージャが起動され、TimesTen SQLコマンド・キャッシュの内容が表示されます。このプロシージャの詳細は、「SQLコマンド・キャッシュに格納されたコマンドの表示」を参照してください。

パラメータなしでcmdcacheコマンドを実行する場合、SQLコマンド・キャッシュの内容がすべて表示されます。ttSqlCmdCacheInfo組込みプロシージャと同様、コマンドIDを指定して、表示する特定のコマンドを指定できます。

また、特定の所有者または問合せテキストと一致するコマンドのみが表示されるように、ttIsqlcmdcacheコマンドで結果をフィルタ処理できます。

cmdcacheコマンドの構文は次のとおりです。

cmdcache [[by {sqlcmdid | querytext | owner}] <query_substring>

ownerパラメータを指定した場合、結果が所有者によりフィルタ処理され、<query_substring>により識別され、戻された各コマンドに表示されます。querytextパラメータを指定した場合、<query_substring>内で指定された部分文字列を含む問合せがすべて表示されるように結果がフィルタ処理されます。cmdcache<query_substring>など、<query_substring>のみを指定した場合、コマンドでは<query_substring>で問合せテキストがフィルタ処理されます。

SQLコマンド・キャッシュでの文に関する問合せ計画の表示

ttIsqlexplainコマンドでは、個々のコマンドに関する問合せ計画を表示します。

  • SQLコマンド・キャッシュからコマンドIDを指定した場合、explainコマンドによりttSqlCmdQueryPlan組込みプロシージャが起動され、TimesTen SQLコマンド・キャッシュに格納された個々のコマンドに関する問合せ計画が表示されます。実行計画を書式設定された方法で表示する場合は、ttSqlCmdQueryPlan組込みプロシージャをコールするかわりにexplainコマンドを実行します。両方では同じ情報が得られますが、ttSqlCmdQueryPlan組込みプロシージャではデータはRAWデータ形式で得られます。ttSqlCmdQueryPlan組込みプロシージャの詳細は、「SQLコマンド・キャッシュに格納されているコマンドに関連付けられた問合せ計画の表示」を参照してください。

  • SQL文または履歴項目番号を指定した場合、そのSQL文に関する実行計画を表示するために必要なSQL文をexplainコマンドでコンパイルします。

explainコマンドの構文は次のとおりです。

explain [plan for] {[<Connid>.]<ttisqlcmdid> | sqlcmdid <sqlcmdid> | <sqlstmt> 
| !<historyitem>}

ttSqlCmdQueryPlan組込みプロシージャと同様、コマンドIDを提示して、表示する特定のコマンドを指定できます。コマンドIDは、「SQLコマンド・キャッシュに格納されたコマンドの表示」で説明されているとおり、cmdcacheコマンドで取得できます。

次の例に、38001456というコマンドIDに関する実行計画を示します。

Command> EXPLAIN SQLCMDID 38001456;
 
Query Optimizer Plan:
 Query Text: select * from all_objects where object_name = 'DBMS_OUTPUT'
 
  STEP:             1
  LEVEL:            12
  OPERATION:        TblLkRangeScan
  TABLENAME:        OBJ$
  TABLEOWNERNAME:   SYS
  INDEXNAME:        USER$.I_OBJ
  INDEXEDPRED:      
  NONINDEXEDPRED:   (RTRIM( NAME ))  = DBMS_OUTPUT;NOT( 10 = TYPE#) ;
(  FLAGS ^ 128 = 0) ;
 
 
  STEP:             2
  LEVEL:            12
  OPERATION:        RowLkRangeScan
  TABLENAME:        OBJAUTH$
  TABLEOWNERNAME:   SYS
  INDEXNAME:        OBJAUTH$.I_OBJAUTH1
  INDEXEDPRED:      ( (GRANTEE#=1 )  OR (GRANTEE#=10 ) )  AND ( (PRIVILEGE#=8 ) )
  NONINDEXEDPRED:   OBJ# = OBJ#;
 
 
  STEP:             3
  LEVEL:            11
  OPERATION:        NestedLoop(Left OuterJoin)
  TABLENAME:        
  TABLEOWNERNAME:   
  INDEXNAME:        
  INDEXEDPRED:      
  NONINDEXEDPRED: 
...
 STEP:             21
  LEVEL:            1
  OPERATION:        Project
  TABLENAME:        
  TABLEOWNERNAME:   
  INDEXNAME:        
  INDEXEDPRED:      
  NONINDEXEDPRED:   
 
Command> 

また、ttIsqlexplainコマンドで、指定したSQL問合せに関する実行計画を生成できます。たとえば、SELECT * FROM EMPLOYEES;というSQL問合せに関する実行計画は次のようになります。

Command> EXPLAIN SELECT * FROM EMPLOYEES;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               1
  OPERATION:           TblLkRangeScan
  TBLNAME:             EMPLOYEES
  IXNAME:              EMP_NAME_IX
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>

また、コマンド履歴をもとに実行計画を取得することもできます。次の例では、以前に実行したSQL文の実行計画を、履歴コマンドIDを使用して表示する方法を示します。

Command> SELECT * FROM all_objects WHERE object_name = 'DBMS_OUTPUT';
< SYS, DBMS_OUTPUT, <NULL>, 241, <NULL>, PACKAGE, 2009-10-13 10:41:11, 2009-10-13 
10:41:11, 2009-10-13:10:41:11, VALID, N, N, N, 1, <NULL> >
< PUBLIC, DBMS_OUTPUT, <NULL>, 242, <NULL>, SYNONYM, 2009-10-13 10:41:11, 
2009-10-13 10:41:11, 2009-10-13:10:41:11, INVALID, N, N, N, 1, <NULL> >
< SYS, DBMS_OUTPUT, <NULL>, 243, <NULL>, PACKAGE BODY, 2009-10-13 10:41:11, 
2009-10-13 10:41:11, 2009-10-13:10:41:11, VALID, N, N, N, 2, <NULL> >
3 rows found.
Command> HISTORY;
1     connect "DSN=cache";
2     help cmdcache;
3     cmdcache;
4     explain select * from dual;
5     select * from all_objects where object_name = 'DBMS_OUTPUT';
Command> EXPLAIN !5;
 
Query Optimizer Plan:
 
  STEP:                1
  LEVEL:               10
  OPERATION:           TblLkRangeScan
  TBLNAME:             SYS.OBJ$
  IXNAME:              USER$.I_OBJ
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         O.FLAGS & 128 = 0 AND CAST(RTRIM (O.NAME) AS VARCHAR2(30 
BYTE) INLINE) = 'DBMS_OUTPUT' AND O.TYPE# <> 10
 
  STEP:                2
  LEVEL:               10
  OPERATION:           RowLkRangeScan
  TBLNAME:             SYS.OBJAUTH$
  IXNAME:              OBJAUTH$.I_OBJAUTH1
  INDEXED CONDITION:   (OA.GRANTEE# = 1 OR OA.GRANTEE# = 10) AND OA.PRIVILEGE# = 8
  NOT INDEXED:         OA.OBJ# = O.OBJ#
 
  STEP:                3
  LEVEL:               9
  OPERATION:           NestedLoop(Left OuterJoin)
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         <NULL>
 
  STEP:                4
  LEVEL:               9
  OPERATION:           TblLkRangeScan
  TBLNAME:             SYS.OBJAUTH$
  IXNAME:              OBJAUTH$.I_OBJAUTH1
  INDEXED CONDITION:   (OBJAUTH$.GRANTEE# = 1 OR OBJAUTH$.GRANTEE# = 10) AND 
(OBJAUTH$.PRIVILEGE# = 2 OR OBJAUTH$.PRIVILEGE# = 3 OR OBJAUTH$.PRIVILEGE# = 4 OR 
OBJAUTH$.PRIVILEGE# = 5 OR OBJAUTH$.PRIVILEGE# = 8)
  NOT INDEXED:         O.OBJ# = OBJAUTH$.OBJ#
... 
 STEP:                19
  LEVEL:               1
  OPERATION:           NestedLoop(Left OuterJoin)
  TBLNAME:             <NULL>
  IXNAME:              <NULL>
  INDEXED CONDITION:   <NULL>
  NOT INDEXED:         O.OWNER# = 1 OR (O.TYPE# IN (7,8,9) AND (NOT( ISNULLROW 
(SYS.OBJAUTH$.ROWID)) OR NOT( ISNULLROW (SYS.SYSAUTH$.ROWID)))) OR (O.TYPE# IN 
(1,2,3,4,5) AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR (O.TYPE# = 6 AND NOT( 
ISNULLROW (SYS.SYSAUTH$.ROWID))) OR (O.TYPE# = 11 AND NOT( ISNULLROW 
(SYS.SYSAUTH$.ROWID))) OR (O.TYPE# NOT IN (7,8,9,11) AND NOT( ISNULLROW 
(SYS.OBJAUTH$.ROWID))) OR (O.TYPE# = 28 AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) 
OR (O.TYPE# = 23 AND NOT( ISNULLROW (SYS.SYSAUTH$.ROWID))) OR O.OWNER# = 10

ODBC関数の管理

ttIsqlのODBC関数では、次の操作を実行できます。

ODBC関数の取消し

[Ctrl]キーを押しながら[C]キーを押すと、ttIsqlコマンドは実行中のODBC関数の取消しを試行します。

timing ODBC関数コール

一般的なODBC関数コールの実行に必要な時間に関する情報は、ttIsqltimingコマンドを使用して表示できます。タイミング機能が有効になっている場合は、多くの組込みttIsqlコマンドによって、実行されるttIsqlコマンドに対応する第一のODBC関数コールの実行経過時間がレポートされます。

たとえば、ttIsqlconnectコマンドの実行時には、いくつかのODBC関数コールが実行されますが、connectに関連付けられている第一のODBC関数コールはSQLDriverConnectです。この関数コールは、次に示すように測定およびレポートされます。

Command> timing 1;
Command> connect "DSN=MY_DSN";
Connection successful: DSN=MY_DSN;DataStore=E:\ds\MY_DSN;
DRIVER=E:\WINNT\System32\ TTdv1122.dll;
(Default setting AutoCommit=1)
Execution time (SQLDriverConnect) = 1.2626 seconds.
Command>

前述の例では、SQLDriverConnectコールの実行に約1.26秒かかりました。

問合せを測定するtimingコマンドを使用すると、問合せの実行に必要な時間および問合せ結果のフェッチに必要な時間が測定されます。問合せ結果を書式設定し表示する時間の測定を回避するには、問合せを実行する前に冗長性レベルを0(ゼロ)に設定します。

Command> timing 1;
Command> verbosity 0;
Command> SELECT * FROM T1;
Execution time (SQLExecute + FetchLoop) = 0.064210 seconds.
Command>

WHENEVER SQLERRORを使用したエラーのリカバリ

WHENEVER SQLERRORコマンドを実行すると、SQLエラーの発生時の対処法を指示できます。WHENEVER SQLERRORは、SQL文、SQLスクリプトまたはPL/SQLブロックのリカバリ・アクションの設定に使用できます。

ttIsqlの使用中にSQLエラーが発生すると、デフォルトでは、エラー情報が表示されてttIsqlが続行されるので、ユーザーは新しいコマンドを入力できます。デフォルト設定は、WHENEVER SQLERROR CONTINUE NONEです。エラーが発生するたびにttIsqlを終了することを指定することも可能ですが、これは対話的に使用する場合またはSQLスクリプトまたはPL/SQLブロックの実行する場合、は最良の対処法ではない場合があります。


注意:

WHENEVER SQLERRORコマンドの構文については、『Oracle TimesTen In-Memory Databaseリファレンス』のttIsqlに関する項を参照してください。

次の例では、EXITを使用しエラー・コード255を返し、ttIsqlを終了する前に現在の接続にすべての変更を保存するようCOMMIT文が実行されます。この例では、Cシェルecho $statusコマンドを使用してエラー・コードを取得します。

Command> WHENEVER SQLERROR EXIT 255 COMMIT;
Command> SELECT emp_id FROM employee;
 2206: Table PAT.EMPLOYEE not found
WHENEVER SQLERROR exiting.
$ echo $status
255

次の例では、エラーが発生した際に、WHENEVER SQLERRORコマンドによってttIsqlコマンドまたはTimesTenユーティリティを実行する方法を示します(エラーが別のTimesTenユーティリティで発生した場合もこの方法を使用できます)。

Command> WHENEVER SQLERROR EXEC "DSSIZE;CALL TTSQLCMDCACHEINFOGET();";
Command> CALL TTCACHEPOLICYGET;
 5010: No OracleNetServiceName specified in DSN
The command failed.
 
DSSIZE;
 
  PERM_ALLOCATED_SIZE:      32768
  PERM_IN_USE_SIZE:         9204
  PERM_IN_USE_HIGH_WATER:   9204
  TEMP_ALLOCATED_SIZE:      40960
  TEMP_IN_USE_SIZE:         7785
  TEMP_IN_USE_HIGH_WATER:   7848
 
CALL TTSQLCMDCACHEINFOGET();
 
CMDCOUNT, FREEABLECOUNT, SIZE
< 10, 7, 41800 >
1 row found.

次に、SUPPRESSコマンドのオプションを示します。これでは、すべてのエラー・メッセージが抑止され、次のコマンドに進みます。この例では、別のコマンド・オプション(この場合はEXITコマンド)を使用して、既存の接続でエラー・メッセージを再度表示できることを示しています。

Command> WHENEVER SQLERROR SUPPRESS;
Command> SELECT *;
Command> WHENEVER SQLERROR EXIT;
Command> SELECT *;
 1001: Syntax error in SQL statement before or at: "", character position: 9
select *
        ^
WHENEVER SQLERROR exiting.

次の例では、SQLエラーが発生したときに戻される値であるretcodeというバインド変数を設定します。

Command> VARIABLE retcode NUMBER := 111;
Command> WHENEVER SQLERROR EXIT :retcode;
Command> INSERT INTO EMPLOYEES VALUES (
       > 202, 'Pat', 'Fay', 'PFAY', '603.123.6666',
       > TO_DATE ('17-AUG-1997', 'DD-MON-YYYY'),
       > 'MK_REP', 6000, NULL, 201, 20);
  907: Unique constraint (EMPLOYEES on PAT.EMPLOYEES) violated at Rowid
 <BMUFVUAAACOAAAAIiB>
WHENEVER SQLERROR exiting.
$ echo $status;
111