ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

20.3.2 埋め込みSQLの記述

データベースアクセス管理機能を使用して業務データベースを利用する場合、使用する業務用データベースのデータベースシステムの種別に従って、以下のどれかのインタフェースを選択します。

開発言語

Symfoware

Oracle

C言語アプリケーション

Esql-c(注)

Pro*C(注)

COBOLアプリケーション

Esql-COBOL

Pro*COBOL(注)

注)C言語アプリケーション、およびOracleを使用できるのは、同期アプリケーション連携実行基盤だけです。

選択したインタフェースに従って、埋め込みSQLを業務ロジックに記述します。インタフェースの詳細については、それぞれのデータベースシステムのマニュアルを参照してください。

20.3.2.1 Symfowareを利用する場合

Symfowareを利用する場合の、サーバアプリケーションの作成方法について説明します。

データベースアクセス管理機能を利用する場合、データベースアクセス管理機能がデータベースへのコネクションを適切に割り当てます。また、トランザクションのCOMMITおよびROLLBACKも行います。このため、サーバアプリケーションでは、コネクションを接続および切断する処理や、トランザクションを制御するロジック、またセションを操作する処理を行う必要はありません。

以下に、サーバアプリケーションで利用できないSQL文を記載します。

利用できないSQL文

実現方法

CONNECT文
DISCONNECT文

データベースアクセス管理機能がコネクションを接続した状態で、業務アプリケーションを呼び出します。また、コネクションの自動回収機能によりコネクションを切断します。詳細は、“Interstage Business Application Server セットアップガイド”を参照してください。

SET TRANSACTION文

データベースアクセス定義により、ISOLATIONレベルを指定します。詳細は、“Interstage Business Application Server セットアップガイド”を参照してください。

COMMIT文

サーバアプリケーションの復帰値に、0を指定します。

ROLLBACK文

サーバアプリケーションの復帰値に、0以外の値を指定します。

SQLThrAllocID関数
SQLThrStartID関数
SQLThrEndID関数
SQLThrFreeID関数

データベースアクセス管理機能が、適切にセションの割り当てと破棄を実施します。

以下に、C言語およびCOBOLを利用する場合のサーバアプリケーションの作成例を示します。

注意

C言語アプリケーションを使用できるのは、同期アプリケーション連携実行基盤だけです。

■C言語を利用する場合の作成例

#include "apfwcom.h"
#include "apfw_cdr_lib.h"
#include "serverapl_apfw.h"

char*
server_apl(
  int             p1,        /* INパラメタ */
  int             p2,        /* INパラメタ */
  char            *p3,       /* INパラメタ */
  int             *rtn,      /* 処理結果 */
  apfwExcept      *env )     /* 例外情報 */
{
  EXEC SQL BEGIN DECLARE SECTION;
  int     COL01;
  int     COL02;
  char    COL03[11];
  char    SQLSTATE[6];
  char    SQLMSG[256];
  EXEC SQL END DECLARE SECTION;

  COL01=p1;
  COL02=p2;
  COL03[10]=0;
  strncpy(COL03,p3,sizeof(COL03)-1);

  EXEC SQL  WHENEVER   SQLERROR   GOTO   :error01;
  /* ------ */
  /* INSERT */
  /* ------ */
  EXEC SQL INSERT INTO SCM01.TBL01 VALUES(:COL01,:COL02,:COL03);

  *rtn=0;
  return  NULL;

error01:
  for ( i=sizeof(SQLMSG) -2 ; SQLMSG[i]==' ';i--);
  SQLMSG[++i]     =       0;
  SQLSTATE[5]     =       0;
  printf("SQLERROR SQLSTATE=%s SQLMSG=%s\n",SQLSTATE,SQLMSG);
  env->errcode = -1;
  *rtn=2;
  return NULL;
}

■COBOLを利用する場合の作成例

000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID.    SERVERAPL.
000030 ENVIRONMENT    DIVISION.
000040 DATA           DIVISION.
000050 WORKING-STORAGE SECTION.
000060     EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000070 01 COL01        PIC S9(9) COMP.
000080 01 COL02        PIC S9(9) COMP.
000090 01 COL03        PIC S9(9) COMP.
000100 01 SQLSTATE     PIC X(5).
000110 01 SQLMSG       PIC X(128).
000120     EXEC SQL END DECLARE SECTION END-EXEC.
000130 LINKAGE   SECTION.
000140     COPY "SERVERAPL.CBL".
000150     COPY APFW_RTN.
000160     COPY APFW_EXCEPTION.
000170 PROCEDURE DIVISION  USING  OUTORDERS
000180                            APFW_RTN
000190                            APFW_EXCEPTION.
000200     EXEC SQL WHENEVER SQLERROR GO TO :P-END END-EXEC.
000210     MOVE   INDATA01     TO  COL01.
000220     MOVE   INDATA02     TO  COL02.
000230     MOVE   INDATA03     TO  COL03.
000240     EXEC SQL
000250       INSERT INTO SCM01.TBL01
000260             VALUES(:COL01,:COL02,:COL03)
000270     END-EXEC.
000280 P-END.
000290     IF SQLSTATE = "00000" THEN
000300       MOVE   0  TO  APFW_RTN
000310     ELSE
000320       MOVE   2  TO  APFW_RTN
000330       MOVE   1  TO  APFW_EXCEPTION_CODE
000340       DISPLAY "       SQLSTATE : " SQLSTATE
000350       DISPLAY "       SQLMSG   : " SQLMSG
000360     END-IF.
000370 END-PROC.
000380     EXIT PROGRAM.

20.3.2.2 Oracleを利用する場合

Oracleを利用する場合の、サーバアプリケーションの作成方法について説明します。

データベースアクセス管理機能を利用する場合、データベースアクセス管理機能がデータベースへのコネクションを適切に割り当てます。また、トランザクションのCOMMITおよびROLLBACKも行います。このため、サーバアプリケーションでは、コネクションを接続および切断する処理や、トランザクションを制御するロジック、またセションを操作する処理を行う必要はありません。

以下に、業務アプリケーションで利用できないSQL文を記載します。

利用できないSQL文

実現方法

CONNECT文
DISCONNECT文

データベースアクセス管理機能がコネクションを接続した状態で、業務アプリケーションを呼び出します。また、コネクションの自動回収機能によりコネクションを切断します。詳細は、“Interstage Business Application Server セットアップガイド”を参照してください。

SET TRANSACTION文

データベースアクセス定義により、ISOLATIONレベルを指定します。詳細は、“Interstage Business Application Server セットアップガイド”を参照してください。

COMMIT文

サーバアプリケーションの復帰値に、0を指定します。

ROLLBACK文

サーバアプリケーションの復帰値に、0以外の値を指定します。

注意

Oracleを利用する場合、運用モードと開発言語により、以下の注意があります。

開発言語

運用モード

注意事項

C言語

スレッドモード

実行時コンテキストをapfw_getContext関数によりアプリケーション連携実行基盤から取得する必要があります。apfw_getContext関数の詳細については、“Interstage Business Application Server リファレンス”を参照してください。

COBOL

スレッドモード

シングルスレッドのみサポートします。
マルチスレッドはサポートしません。

以下に、サーバアプリケーションの作成例を示します。

■C言語(プロセスモード)を利用する場合の作成例

#include "apfwcom.h"
#include "apfw_cdr_lib.h"
#include "serverapl_apfw.h"

char*
server_apl(
  int             p1,        /* INパラメタ */
  int             p2,        /* INパラメタ */
  char            *p3,       /* INパラメタ */
  int             *rtn,      /* 処理結果 */
  apfwExcept      *env )     /* 例外情報 */
{
  EXEC SQL BEGIN DECLARE SECTION;
  int     COL01;
  int     COL02;
  char    COL03[11];
  char    SQLSTATE[6];
  EXEC SQL END DECLARE SECTION;
  char    SQLMSG[256];
  size_t  buf_len = 0;
  size_t  msg_len = 0;

  COL01=p1;
  COL02=p2;
  COL03[10]=0;
  strncpy(COL03,p3,sizeof(COL03)-1);

  EXEC SQL  WHENEVER   SQLERROR   GOTO   :error01;
  /* ------ */
  /* INSERT */
  /* ------ */
  EXEC SQL INSERT INTO TBL01 VALUES(:COL01,:COL02,:COL03);

  *rtn=0;
  return NULL;

error01:
  buf_len = sizeof(SQLMSG)-1;
  sqlglm(  SQLMSG, &buf_len, &msg_len );
  for ( i=sizeof(SQLMSG) -2 ; SQLMSG[i]==' ';i--);
  SQLMSG[++i]     =       0;
  SQLSTATE[5]     =       0;
  printf("SQLERROR SQLSTATE=%s SQLMSG=%s\n",SQLSTATE,SQLMSG);
  env->errcode = -1;
  *rtn=2;
  return NULL;
}

■C言語(スレッドモード)を利用する場合の作成例

#include "apfwcom.h"
#include "apfw_cdr_lib.h"
#include "serverapl_apfw.h"
#include "apfwdba.h"

char*
server_apl(
  int             p1,        /* INパラメタ */
  int             p2,        /* INパラメタ */
  char            *p3,       /* INパラメタ */
  int             *rtn,      /* 処理結果 */
  apfwExcept      *env )     /* 例外情報 */
{
  EXEC SQL BEGIN DECLARE SECTION;
  int     COL01;
  int     COL02;
  char    COL03[11];
  char    SQLSTATE[6];
  EXEC SQL END DECLARE SECTION;
  char    SQLMSG[256];
  sql_context ctx;
  int     sts;
  size_t  buf_len = 0;
  size_t  msg_len = 0;

  COL01=p1;
  COL02=p2;
  COL03[10]=0;
  strncpy(COL03,p3,sizeof(COL03)-1);

  sts = apfw_getContext ( (void *)&ctx );
  if ( sts != APFW_DBA_SUCCESS ) {
    printf("apfw_getContext Error code=%d\n",sts);
    env->errcode = -1;
    *rtn=2;
    return NULL;
  }
  EXEC SQL CONTEXT USE :ctx;

  EXEC SQL  WHENEVER   SQLERROR   GOTO   :error01;
  /* ------ */
  /* INSERT */
  /* ------ */
  EXEC SQL INSERT INTO TBL01 VALUES(:COL01,:COL02,:COL03);

  *rtn=0;
  return NULL;

error01:
  buf_len = sizeof(SQLMSG)-1;
  sqlglmt( ctx, SQLMSG, &buf_len, &msg_len );
  for ( i=sizeof(SQLMSG) -2 ; SQLMSG[i]==' ';i--);
  SQLMSG[++i]     =       0;
  SQLSTATE[5]     =       0;
  printf("SQLERROR SQLSTATE=%s SQLMSG=%s\n",SQLSTATE,SQLMSG);
  env->errcode = -1;
  *rtn=2;
  return NULL;
}

注意

スレッドモードの場合は、apfw_getContext関数を使用して、実行時コンテキストを取得する必要があります。関数の詳細については、“Interstage Business Application Server リファレンス”を参照してください。

■COBOLを利用する場合の作成例

000010 IDENTIFICATION DIVISION.
000020 PROGRAM-ID.    SERVERAPL.
000030 ENVIRONMENT    DIVISION.
000040 DATA           DIVISION.
000050 WORKING-STORAGE SECTION.
000060     EXEC SQL BEGIN DECLARE SECTION END-EXEC.
000070 01 COL01        PIC S9(9) COMP.
000080 01 COL02        PIC S9(9) COMP.
000090 01 COL03        PIC S9(9) COMP.
000100 01 SQLSTATE     PIC X(5).
000110     EXEC SQL END DECLARE SECTION END-EXEC.
000120     EXEC SQL INCLUDE SQLCA END-EXEC.
000130 LINKAGE   SECTION.
000140     COPY "SERVERAPL.CBL".
000150     COPY APFW_RTN.
000160     COPY APFW_EXCEPTION.
000170 PROCEDURE DIVISION  USING  OUTORDERS
000180                            APFW_RTN
000190                            APFW_EXCEPTION.
000200     EXEC SQL WHENEVER SQLERROR GO TO :P-END END-EXEC.
000210     MOVE   INDATA01     TO  COL01.
000220     MOVE   INDATA02     TO  COL02.
000230     MOVE   INDATA03     TO  COL03.
000240     EXEC SQL
000250       INSERT INTO TBL01
000260             VALUES(:COL01,:COL02,:COL03)
000270     END-EXEC.
000280 P-END.
000290     IF SQLSTATE = "00000" THEN
000300       MOVE   0  TO  APFW_RTN
000310     ELSE
000320       MOVE   2  TO  APFW_RTN
000330       MOVE   1  TO  APFW_EXCEPTION_CODE
000340       DISPLAY "       SQLSTATE : " SQLSTATE
000350       DISPLAY "       SQLERRMC : " SQLERRMC
000360     END-IF.
000370 END-PROC.
000380     EXIT PROGRAM.