後続の実行のためのSQL文の準備

TimesTenアプリケーションは、単一のSQL文を準備し、実行するたびに同じSQL文を再準備することなく、必要な回数実行することをお薦めします。

ttIsqlユーティリティには、準備されたSQL文を操作するための一連の組込みコマンドがあります。

次に、これらのコマンドの概要を示します。
  • prepare: SQL文を準備します。SQLPrepare ODBCコールに対応します。
  • exec: 準備済の文を実行します。SQLExecute ODBCコールに対応します。
  • execandfetch: 事前に準備済の文を実行し、すべての結果行をフェッチします。1つ以上のSQLFetchコールの前に実行されるSQLExecuteコールに対応します。
  • fetchone - 以前に実行した文の1行のみをフェッチします。1つのみのSQLFetchコールに対応します。
  • fetchall - 以前に実行した文のすべての結果行をフェッチします。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=database1";
Connection successful: 
DSN=database1;DataStore=/disk1/databases/database1;DatabaseCharacterSet=AL32UTF8;
ConnectionCharacterSet=AL32UTF8;PermSize=128;
(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 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.

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

準備済の文コマンドを使用した場合にttIsqlによって生成されるコマンドIDを表示するには、describe *コマンドを使用して、準備済のすべての文をそれらのIDとともに表示します。コマンドIDは、ttIsqlの準備済の文コマンドを使用する場合に明示的に参照できます。

この例では、1つのNUMBERパラメータを含む述語が指定されているSELECT文を準備および実行します。exec 2およびexec 3は、準備済の文を実行します。2および3個の準備済の文の実行後、「Cursor is open. Ncharencoding is LOCALE」と表示されます。

Command> prepare 1 select 1 from dual;
Command> prepare 2 select 2 from dual;
Command> prepare 3 select 3 from dual;
Command>exec 2;
Command>exec 3;
Command>describe *;

There are 3 prepared commands.

Prepared Statement [1];
SQL: select 1 from dual

Columns:
EXP		NUMBER(10) Not NULL 

Prepared Statement [2];
SQL: select 2 from dual

Cursor is open. Ncharencoding is LOCALE.
Columns:
EXP		NUMBER(10) Not NULL 

Prepared Statement [3];
SQL: select 3 from dual

Cursor is open. Ncharencoding is LOCALE.
Columns:
EXP	
result columns.

この例では、準備済のコマンドprepare 2を削除するfree 2コマンドを示します。

Command>free 2;
Command>describe *;

Prepared Statement [1];
SQL: select 1 from dual

Columns:
EXP	NUMBER(10) Not NULL 

Prepared Statement [3];
SQL: select 3 from dual

Cursor is open. Ncharencoding is LOCALE.
Columns:
EXP	NUMBER(10) Not NULL 

Command>exec 2;
The prepared command with id=2 was not found.
The command failed.

この例では、準備済のコマンドprepare 10およびprepare 11を使用して値を表t2に対してINSERTし、コマンドを実行して2行を表に挿入します。fetchoneコマンドは、この文によって生成された1つの結果行のみをフェッチするために使用します。execandfetch 12コマンドは、表t2のすべての行を表示します。

Command> create table t2 ( a int, b varchar(30));
Command> create sequence s;
Command> set autocommit 0;
Command> prepare 10 insert into t2 values( s.nextval, 'A');
Command> prepare 11 insert into t2 values( s.nextval, 'B');
Command> prepare 12 select * from t2;
Command> describe *;

There are 3 prepared commands.

Prepared Statement [10]:
  SQL: insert into t2 values( s.nextval, 'A')
  Columns:
    (none)

Prepared Statement [11]:
  SQL: insert into t2 values( s.nextval, 'B')
  Columns:
    (none)

Prepared Statement [12]:
  SQL: select * from t2
  Columns:
    A        NUMBER (38)
    B        VARCHAR2 (30)

Command> exec 10;
1 row inserted.
Command> exec 11;
1 row inserted.
Command> exec 12;

Command> fetchone;
< 1, A >
1 row found.

Command> fetchone;
< 2, B >
1 row found.

Command> execandfetch 12;
< 1, A >
< 2, B >
2 rows found.

Command> exec 10;
1 row inserted.
Command> execandfetch 12;
< 1, A >
< 2, B >
< 3, A >
3 rows found.
Command>