後続の実行のための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>