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

3.2.11 拡張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文識別子を使用した複数の被準備文を実行するアプリケーション

              :
001010     PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn
003010         EXEC SQL PREPARE :cmd FROM :strsql END-EXEC.      (1)
000000     END-PERFORM.
              :
001010     PERFORM VARYING LOOP FROM 1 BY 1 UNTIL LOOP > nn
003010         EXEC SQL EXECUTE :cmd END-EXEC.                   (2)
000000     END-PERFORM.
              :

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

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

例2

SQL文識別子を使用した複数の被準備文を実行するアプリケーション

              :
001000     EXEC SQL PREPARE CMD1 FROM :strsql END-EXEC.          (1)
001010     EXEC SQL PREPARE CMD2 FROM :strsql END-EXEC.          (1)
001020     EXEC SQL PREPARE CMD3 FROM :strsql END-EXEC.          (1)
              :
              :
001100     EXEC SQL PREPARE CMDnn FROM :strsql END-EXEC.         (1)
              :
002010     EXEC SQL EXECUTE CMD1 END-EXEC.                       (2)
002020     EXEC SQL EXECUTE CMD2 END-EXEC.                       (2)
002030     EXEC SQL EXECUTE CMD3 END-EXEC.                       (2)
              :
              :
003010     EXEC SQL EXECUTE CMDnn END-EXEC.                      (2)
              :

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

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

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

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

複数のコンパイル単位にまたがって拡張SQL文識別子を使用するアプリケーション

sub_pre.scob
000030 IDENTIFICATION DIVISION.
000040 PROGRAM-ID. SUB-PREP.
              :
001000     EXEC SQL PREPARE :cmd1 FROM :strsql END-EXEC.         (1)
              :
010000     EXIT PROGRAM.

(1)ホスト変数cmd1を使用して拡張SQL文識別子“CMD1”を定義します。

sub_exec.scob
000030 IDENTIFICATION DIVISION.
000040 PROGRAM-ID. SUB-EXEC.
              :
001000     EXEC SQL EXECUTE :cmd1 USING SQL DESCRIPTOR 'DESC1' END-EXEC. (1)
              :
010000     EXIT PROGRAM.

(1)拡張SQL文識別子“CMD1”の被準備文を実行します。