ページの先頭行へ戻る
Symfoware Server V10.0.0/V10.0.1 アプリケーション開発ガイド(埋込みSQL編)

3.1.13 拡張カーソル名を使用したカーソル操作

ここでは、拡張カーソル名で指定されたカーソルの使用方法について説明します。

拡張カーソル

ALLOCATE CURSOR文を使用して宣言したカーソルを拡張カーソルといいます。

拡張カーソルは、ALLOCATE CURSOR文に拡張カーソル名および拡張SQL文識別子を指定して定義します。拡張カーソル名は、文字列型のホスト変数を使用して定義し、アプリケーションの実行時に値を動的に設定します。

拡張カーソル名は、以下のSQL文に指定できます。

拡張カーソル名の使用方法

拡張カーソル名を使用すると、ホスト変数を指定することによりカーソルの名前を実行時に動的に指定することが可能になるため、複数のカーソルを宣言する場合にカーソル宣言をまとめることができます。

そのため、多数のカーソルを操作するアプリケーションでも、開発量の削減を実現できます。

拡張カーソル名ではなくカーソル名を使用すると、カーソルの名前をSQL文中に識別子として文字列で指定するため、複数のカーソルを宣言する場合は、使用するカーソルの数だけカーソル宣言を記述する必要があります。

また、カーソルを操作する場合は、個々のカーソル名を記述したSQL文を記述しなければなりません。

そのため、多数のカーソルを使用するアプリケーションは、その開発規模が大きくなってしまいます。

拡張カーソル名を使用した場合とカーソル名を使用した場合で、複数のカーソルを宣言する例を以下に示します。

例1

拡張カーソル名を使用して、複数のカーソルを宣言する例を示します。

             :
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個のカーソルを宣言します。

例2

カーソル名を使用して、複数のカーソルを宣言する例を示します。

             :
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'が指定されたとします。

sub_pre.sc
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文識別子を定義します。

sub_alloc_cur.sc
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を使用して拡張カーソルを宣言します。

sub_open.sc
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をオープンします。