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

3.1.12 拡張SQL文識別子を使用した動的SQL文の実行方法

ここでは、拡張SQL文識別子を使用した動的SQL文の実行方法について説明します。

拡張SQL文識別子

拡張SQL文識別子は、文字列型のホスト変数で指定し、アプリケーションの実行時に値を動的に設定します。

拡張SQL文識別子は、以下のSQL文に指定できます。

拡張SQL文識別子の使用方法

拡張SQL文識別子を使用すると、ホスト変数を指定することにより被準備文の名前を実行時に動的に指定することが可能になるため、PREPARE文やEXECUTE文など、被準備文の名前を指定するSQL文をまとめることができます。

そのため、多数の被準備文を使用するアプリケーションでも、開発量の削減を実現できます。

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

また、各被準備文を実行する場合は、個々のSQL文識別子ごとにEXECUTE文などのSQL文を記述しなければなりません。

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

拡張SQL文識別子を使用した場合とSQL文識別子を使用した場合で、複数の被準備文を実行する例を以下に示します。

例1

拡張SQL文識別子を使用して複数の被準備文を実行する例を以下に示します。

              :
for ( loop=0; loop<nn; loop++ ) {
  EXEC SQL PREPARE :cmd FROM :strsql;                            (1)
}
              :
for ( loop=0; loop<nn; loop++ ) {
  EXEC SQL EXECUTE :cmd;                                         (2)
}
              :

(1)拡張SQL文識別子を使用して、ループによりnn個の準備可能文を準備します。

(2)拡張SQL文識別子を使用して、ループによりnn個の被準備文を実行します。

例2

SQL文識別子を使用して複数の被準備文を実行する例を以下に示します。

              :
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 EXECUTE CMD1;                                           (2)
EXEC SQL EXECUTE CMD2;                                           (2)
EXEC SQL EXECUTE CMD3;                                           (2)
              :
              :
EXEC SQL EXECUTE CMDnn;                                          (2)
              :

(1)SQL文識別子CMD1~CMDnnまでに対応するSQL文を準備します。

(2)SQL文識別子CMD1~CMDnnまでに対応する被準備文を実行します。

拡張SQL文識別子の有効範囲

拡張SQL文識別子の有効範囲はセションになります。そのため複数のコンパイル単位にまたがって使用することができ、拡張SQL文識別子を使用するSQL文ごとにカプセル化し、共有することが可能です。

複数のコンパイル単位にまたがって拡張SQL文識別子を使用する例を以下に示します。パラメタcommand_nameに'CMD1'が指定されたとします。

sub_pre.sc
short sub_prep( 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)拡張SQL文識別子cmd1を使用して、実行するSQL文を準備します。被準備文の名前は“CMD1”になります。

sub_exec.sc
short sub_exec( char *command_name )
{
              :
EXEC SQL BEGIN DECLARE SECTION;
    VARCHAR     cmd1[36];
EXEC SQL END DECLARE SECTION;
              :
strcpy(cmd1.sqlvar, command_name);
cmd1.sqllen = strlen(cmd1.sqlvar);
EXEC SQL EXECUTE :cmd1 USING SQL DESCRIPTOR 'DESC1';             (1)
              :
}

(1)名前が“CMD1”の被準備文を実行します。