| Symfoware Parallel Server RDBユーザーズガイド 応用プログラム開発編 |
目次
索引
![]()
|
| 第2章 データベースを処理する応用プログラムの開発の概要 | > 2.1 SQL埋込みCプログラムの作成方法 |
ここでは、ホスト変数の可変長文字列をCプログラムで操作するプログラミング例を説明します。ホスト変数の可変長文字列をCプログラムで操作する場合は、文字列の長さが必要です。このため、翻訳時には、可変長文字列を文字列の長さと文字列を持つ構造体形式に変換します。Cプログラムは、変換された構造体の変数でデータ操作を行います。
図:可変長文字列を構造体形式に変換した例に可変長文字列を構造体形式に変換した例を示します。
図:可変長文字列のデータ操作の概要にプログラムの処理概要を、図:可変長文字列のデータ操作のプログラミング例にプログラミング例を示します。
応用プログラム中に以下のように宣言します。
VARCHAR hcomp_word[13];
↓翻訳時に構造体に変換します。
struct{
short sqllen;
char sqlvar[13];
} hcomp_word; |

(1) 電話番号の市外局番を、ホスト変数の可変長文字列に対話で入力します。
(2) CONNECT文により、データベース“DB01"の存在するサーバとコネクションを接続します。
(3) カーソル操作により、取引会社表から入力された市外局番に該当する取引先会社のデータを検索します。
(4) 取引先会社のデータを端末に出力します。
(5) DISCONNECT文により、データベース“DB01"の存在するサーバとのコネクションを切断します。
#include<stdio.h>
#include<string.h>
EXEC SQL BEGIN DECLARE SECTION;
char SQLSTATE[6];
char SQLMSG[256];
VARCHAR hcomp_word[13]; (1)
long hnumber;
char CHARACTER SET NCHAR hcompany[21];
char harea_code[13];
char CHARACTER SET NCHAR hlocation[21];
EXEC SQL END DECLARE SECTION;
void putmsgx(void);
main(void){
short execute;
short count;
EXEC SQL DECLARE 取引先会社 TABLE ON BUSINESS; (2)
EXEC SQL DECLARE CSR1 CURSOR FOR
SELECT * FROM 取引先会社
WHERE 電話番号 LIKE :hcomp_word; (3)
printf("入力された市外局番に該当する取引先会社のデータを取り出します.\n");
for(;;){
printf("市外局番を入力して下さい >> ");
gets(hcomp_word.sqlvar); (4)
printf("\n");
printf("市外局番\"%s\"のデータでよろしいですか?\n",hcomp_word.sqlvar);
printf("よろしかったら(Y/y)を入力して下さい >>");
execute=getchar();
if(execute=='Y' || execute=='y'){
break;
}
printf("\n");
}
printf("\n");
strcat(hcomp_word.sqlvar,"%");
hcomp_word.sqllen = strlen(hcomp_word.sqlvar); (5)
EXEC SQL WHENEVER SQLERROR GOTO :CONNECT_ERROR;
EXEC SQL CONNECT TO 'DB01'; (6) |
(1) 市外局番を可変長文字列のホスト変数として定義します。
(2) 取引先会社を表宣言します。
(3) 取引先会社表のすべての列に対するカーソル“CSR1"を宣言します。
(4) 市外局番を対話入力します。
市外局番は、可変長文字列変数“hcomp_word"を翻訳時に構造体に変換した変数“hcomp_word.sqlvar" に入力します。
(5) 入力した市外局番の長さを、可変長文字列のホスト変数“hcomp_word"を翻訳時に構造体に変換した長さの変数“hcomp_word.sqllen"に設定します。
(6) データベース“DB01"の存在するサーバとコネクションを接続します。
EXEC SQL WHENEVER SQLERROR GOTO :STM_ERROR;
EXEC SQL WHENEVER NOT FOUND GOTO :NOT_FOUND_ERROR;
EXEC SQL OPEN CSR1; (7)
for(count=0;;count++) {
memset(hcompany,'\0',sizeof(hcompany)); (8)
memset(harea_code,'\0',sizeof(harea_code)); (9)
memset(hlocation,'\0',sizeof(hlocation)); (10)
EXEC SQL FETCH CSR1 INTO :hnumber,:hcompany,:harea_code,:hlocation; (11)
printf("\n取引先番号 会社名 市外局番 所在地\n");
printf("%010ld %-20s %-12s %-20s\n" (12)
,hnumber,hcompany,harea_code,hlocation);
}
NOT_FOUND_ERROR:
if(count != 0) printf("\n該当データは%d件です.\n",count); (13)
else printf("\n該当データなし\n");
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK; (14)
EXEC SQL DISCONNECT 'DB01'; (15)
return 0;
STM_ERROR: (16)
putmsgx();
EXEC SQL WHENEVER SQLERROR CONTINUE;
EXEC SQL ROLLBACK WORK; (17)
EXEC SQL DISCONNECT 'DB01'; (18)
return 1;
CONNECT_ERROR:
putmsgx(); (19)
return 1;
} |
(7) カーソル“CSR1"をオープンします。
(8) ホスト変数“hcompany"をnull文字で初期化します。
(9) ホスト変数“harea_code"をnull文字で初期化します。
(10) ホスト変数“hlocation"をnull文字で初期化します。
(11) 入力した市外局番と等しい市外局番の行にカーソルを位置づけ、その行を読み込みます。
(12) 読み込んだ行をprintf関数で表示します。
(13) 取引先会社表のデータをすべて検索した場合は、検索結果をprintf関数で表示します。
(14) トランザクションをROLLBACK文により終了します。
(15) データベース“DB01"の存在するサーバとのコネクションを切断します。
(16) SQL文のエラーの場合に、SQLMSGとSQLSTATEの内容を表示します。
(17) SQL文の実行でエラーが発生した場合は、トランザクションをROLLBACK文により終了します。
(18) データベース“DB01"の存在するサーバとのコネクションを切断します。
(19) コネクションでエラーの場合は、SQLMSGとSQLSTATEの内容を表示します。
void putmsgx( void ) { (20)
int i;
for ( i = sizeof(SQLMSG) - 2 ; SQLMSG[i] == ' ' ; i-- );
SQLMSG[++i] = '\0';
SQLSTATE[5]='\0';
printf( "SQLMSG:%s\n" , SQLMSG );
printf( "SQLSTATE:%s\n" , SQLSTATE );
return;
} |
(20) SQLMSGとSQLSTATEの内容を表示する関数です。
目次
索引
![]()
|