| Symfoware(R) Server RDBユーザーズガイド 応用プログラム開発編 - FUJITSU - | 
| 目次
			索引    | 
 第2章 データベースを処理する応用プログラムの開発の概要
第2章 データベースを処理する応用プログラムの開発の概要
	 2.2 SQL埋込みCOBOLプログラムの作成方法
2.2 SQL埋込みCOBOLプログラムの作成方法
ここでは、マルチスレッド環境で動作する応用プログラムを開発する方法について説明します。
マルチスレッド環境の概要、マルチスレッド環境で動作する応用プログラムの作成の流れ、およびセションとスレッドの関係については、“マルチスレッド環境におけるデータ操作”を参照してください。
マルチスレッド環境で動作する応用プログラムの例を以下に示します。以下の例におけるスレッドは、すでに他の応用プログラムで起動されているものとします。
|   @OPTIONS ALPHAL(WORD)
  IDENTIFICATION DIVISION.
  PROGRAM-ID.   sub_threadB.
  ENVIRONMENT DIVISION.
  DATA DIVISION.
  WORKING-STORAGE SECTION.
      EXEC SQL BEGIN DECLARE SECTION END-EXEC.
  01 SQLSTATE PIC X(5).                                           …… (1)
  01 SQLMSG   PIC X(255).
      EXEC SQL END   DECLARE SECTION END-EXEC.
  01 ret    PIC S9(4) BINARY.
  LINKAGE SECTION.
  01 ses_id PIC S9(9) COMP-5.
  PROCEDURE DIVISION USING ses_id.
      INITIALIZE SQLSTATE.
      INITIALIZE SQLMSG.
      CALL "SQLThrStartID" USING BY VALUE ses_id RETURNING ret.      …… (2)
      IF ret = 0 THEN
          DISPLAY "SQLThrStartIDエラー"
          EXIT PROGRAM
      END-IF.
      EXEC SQL WHENEVER SQLERROR GO TO :CONNECT_ERROR END-EXEC.
      EXEC SQL
             CONNECT TO 'SI_DB333'                                …… (3)
      END-EXEC.
      DISPLAY "CONNECT(SQLSTATE) = " SQLSTATE.
      DISPLAY "CONNECT(SQLMSG) = " SQLMSG.
      EXEC SQL WHENEVER SQLERROR CONTINUE END-EXEC.
      EXEC SQL              INSERT INTO SI_SCHM1.SI_TABLE2                     …… (4)
                     VALUES(1,1,1,1,1,1,1,1,1,1,'R','DD','BBBB')
      END-EXEC.
      DISPLAY "INSERT(SQLSTATE) = " SQLSTATE.
      DISPLAY "INSERT(SQLMSG) = " SQLMSG.
      EXEC SQL
             COMMIT WORK                                         …… (5)
      END-EXEC.
      DISPLAY "COMMIT(SQLSTATE) = " SQLSTATE.
      DISPLAY "COMMIT(SQLMSG) = " SQLMSG.
      EXEC SQL
             DISCONNECT ALL                                      …… (6)
      END-EXEC.
      DISPLAY "DISCONNECT(SQLSTATE) = " SQLSTATE.
      DISPLAY "DISCONNECT(SQLMSG) = " SQLMSG.
      CALL "SQLThrEndID" USING BY VALUE ses_id RETURNING ret.    …… (7)
      IF ret = 0 THEN
          DISPLAY "SQLThrEndIDエラー"
          EXIT PROGRAM
      END-IF.
      EXIT PROGRAM.
  CONNECT_ERROR.                                                …… (8)
      DISPLAY "CONNECT(SQLSTATE) = " SQLSTATE.
      DISPLAY "CONNECT(SQLMSG) = " SQLMSG.
      CALL "SQLThrEndID" USING BY VALUE ses_id RETURNING ret.
      EXIT PROGRAM. | 
(1) SQLSTATEとSQLMSGを宣言します。
(2) セションを開始します。セションを開始する関数を実行することにより、セションとスレッド(sub_threadB)が対応付けられます。
(3) サーバとコネクションを接続します。
(4) INSERT文を実行して値を挿入します。
(5) トランザクションをCOMMIT文により終了します。
(6) サーバとのコネクションを切断します。
(7) セションを終了します。
(8) サーバとのコネクションに失敗した場合は、セションを終了します。
応用プログラムを作成するには、複数スレッド間の排他などを考慮して、実行したSQL文によるデータベースの検索および更新結果が正しくなるようにしなければなりません。以下に注意点を示します。
1つのセションに対して複数のスレッドが存在する場合、各スレッドが同時に動作しないようにしてください。セマフォを利用するなどして排他制御を考慮し、応用プログラムの作成者が責任をもって対処してください。
セションを破棄する前には、必ずDISCONNECT文を実行してください。
マルチスレッド環境で応用プログラムを実行する場合も、トランザクション単位にSymfoware/RDBで排他制御を行います。また、カーソル操作についても、カーソルをオープンした後に、単一コネクションにおける複数のスレッド間では同じカーソルを操作できますが、複数のコネクションにまたがって同じカーソルを操作することはできません。
| 目次
			索引    |