データベースアクセス管理機能を使用して業務データベースを利用する場合、使用する業務用データベースのデータベースシステムの種別に従って、以下のどれかのインタフェースを選択します。
開発言語 | Symfoware | Oracle |
---|---|---|
C言語アプリケーション | Esql-c(注) | Pro*C(注) |
COBOLアプリケーション | Esql-COBOL | Pro*COBOL(注) |
注)C言語アプリケーション、およびOracleを使用できるのは、同期アプリケーション連携実行基盤だけです。
選択したインタフェースに従って、埋め込みSQLを業務ロジックに記述します。インタフェースの詳細については、それぞれのデータベースシステムのマニュアルを参照してください。
Symfowareを利用する場合の、サーバアプリケーションの作成方法について説明します。
データベースアクセス管理機能を利用する場合、データベースアクセス管理機能がデータベースへのコネクションを適切に割り当てます。また、トランザクションのCOMMITおよびROLLBACKも行います。このため、サーバアプリケーションでは、コネクションを接続および切断する処理や、トランザクションを制御するロジック、またセションを操作する処理を行う必要はありません。
以下に、サーバアプリケーションで利用できないSQL文を記載します。
利用できないSQL文 | 実現方法 |
---|---|
CONNECT文 | データベースアクセス管理機能がコネクションを接続した状態で、業務アプリケーションを呼び出します。また、コネクションの自動回収機能によりコネクションを切断します。詳細は、“Interstage Business Application Server セットアップガイド”を参照してください。 |
SET TRANSACTION文 | データベースアクセス定義により、ISOLATIONレベルを指定します。詳細は、“Interstage Business Application Server セットアップガイド”を参照してください。 |
COMMIT文 | サーバアプリケーションの復帰値に、0を指定します。 |
ROLLBACK文 | サーバアプリケーションの復帰値に、0以外の値を指定します。 |
SQLThrAllocID関数 | データベースアクセス管理機能が、適切にセションの割り当てと破棄を実施します。 |
以下に、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. |
Oracleを利用する場合の、サーバアプリケーションの作成方法について説明します。
データベースアクセス管理機能を利用する場合、データベースアクセス管理機能がデータベースへのコネクションを適切に割り当てます。また、トランザクションのCOMMITおよびROLLBACKも行います。このため、サーバアプリケーションでは、コネクションを接続および切断する処理や、トランザクションを制御するロジック、またセションを操作する処理を行う必要はありません。
以下に、業務アプリケーションで利用できないSQL文を記載します。
利用できないSQL文 | 実現方法 |
---|---|
CONNECT文 | データベースアクセス管理機能がコネクションを接続した状態で、業務アプリケーションを呼び出します。また、コネクションの自動回収機能によりコネクションを切断します。詳細は、“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. |