ここでは、拡張カーソル名で指定されたカーソルの使用方法について説明します。
ALLOCATE CURSOR文を使用して宣言したカーソルを拡張カーソルといいます。
拡張カーソルは、ALLOCATE CURSOR文に拡張カーソル名および拡張SQL文識別子を指定して定義します。拡張カーソル名は、文字列型のホスト変数を使用して定義し、アプリケーションの実行時に値を動的に設定します。
拡張カーソル名は、以下のSQL文に指定できます。
ALLOCATE CURSOR文
動的CLOSE文
動的DELETE文:位置づけ
動的FETCH文
動的OPEN文
動的UPDATE文:位置づけ
拡張カーソル名を使用すると、ホスト変数を指定することによりカーソルの名前を実行時に動的に指定することが可能になるため、複数のカーソルを宣言する場合にカーソル宣言をまとめることができます。
そのため、多数のカーソルを操作するアプリケーションでも、開発量の削減を実現できます。
拡張カーソル名ではなくカーソル名を使用すると、カーソルの名前をSQL文中に識別子として文字列で指定するため、複数のカーソルを宣言する場合は、使用するカーソルの数だけカーソル宣言を記述する必要があります。
また、カーソルを操作する場合は、個々のカーソル名を記述したSQL文を記述しなければなりません。
そのため、多数のカーソルを使用するアプリケーションは、その開発規模が大きくなってしまいます。
拡張カーソル名を使用した場合とカーソル名を使用した場合で、複数のカーソルを宣言する例を以下に示します。
拡張カーソル名を使用して、複数のカーソルを宣言する例を示します。
:
for ( loop=0; loop<nn; loop++ ) {
EXEC SQL PREPARE :cmd FROM :strsql; (1)
EXEC SQL ALLOCATE :cur1 CURSOR FOR :cmd1; (2)
}
:(1)拡張SQL文識別子を使用して、ループによりnn個の準備可能文を準備します。
(2)拡張カーソル名を使用して、ループによりnn個のカーソルを宣言します。
カーソル名を使用して、複数のカーソルを宣言する例を示します。
:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR strsql[256];
EXEC SQL END DECLARE SECTION;
:
EXEC SQL PREPARE CMD1 FROM :strsql; (1)
EXEC SQL PREPARE CMD2 FROM :strsql; (1)
EXEC SQL PREPARE CMD3 FROM :strsql; (1)
:
:
EXEC SQL PREPARE CMDnn FROM :strsql; (1)
:
EXEC SQL DECLARE CUR1 CURSOR FOR CMD1; (2)
EXEC SQL DECLARE CUR2 CURSOR FOR CMD2; (2)
EXEC SQL DECLARE CUR3 CURSOR FOR CMD3; (2)
:
:
EXEC SQL DECLARE CURnn CURSOR FOR CMDnn; (2)
:
:
:(1)SQL文識別子CMD1~CMDnnを定義します。
(2)SQL文識別子CMD1~CMDnnに対し、カーソルCUR1~CURnnを宣言します。
拡張カーソル名の有効範囲はセションになります。
そのため複数のコンパイル単位にまたがって使用することができ、拡張カーソル名を使用するSQL文ごとにカプセル化し、共有することが可能です。
複数のコンパイル単位にまたがった拡張カーソルの使用例を示します。パラメタcursor_nameに'CUR1'が指定されたとします。
short sub_pre( char *command_name )
{
:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR cmd1[36];
VARCHAR strsql[256];
EXEC SQL END DECLARE SECTION;
:
strcpy(cmd1.sqlvar, command_name);
cmd1.sqllen = strlen(cmd1.sqlvar);
EXEC SQL PREPARE :cmd1 FROM :strsql; (1)
:
}(1)ホスト変数cmd1を使用して拡張SQL文識別子を定義します。
short sub_alloc_cur( char *command_name, char *cursor_name )
{
:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR cur1[36];
VARCHAR cmd1[36];
EXEC SQL END DECLARE SECTION;
:
strcpy(cmd1.sqlvar, command_name);
cmd1.sqllen = strlen(cmd1.sqlvar);
strcpy(cur1.sqlvar, cursor_name);
cur1.sqllen = strlen(cur1.sqlvar);
EXEC SQL ALLOCATE :cur1 CURSOR FOR :cmd1; (1)
:(1)拡張カーソル名cur1と拡張SQL文識別子cmd1を使用して拡張カーソルを宣言します。
short sub_open( char *cursor_name )
{
:
EXEC SQL BEGIN DECLARE SECTION;
VARCHAR cur1[36];
EXEC SQL END DECLARE SECTION;
:
strcpy(cur1.sqlvar, cursor_name);
cur1.sqllen = strlen(cur1.sqlvar);
EXEC SQL OPEN :cur1; (1)
:(1)拡張カーソルCUR1をオープンします。