今度は動的にSQLを生成するソースのサンプルを元に
基本的なことを学習し直すことにする。
■動的SQLにより、データベースを検索するPro*Cのサンプル
※以下ソース
#include <stdin.h>
EXEC SQL BEGIN DECLARE SECTION;
varchar username[20];
varchar password[20];
int h_ymd[256];
char h_data[256][8];
char h_select[256];
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE sqlca;
void main(int argc,char *argv[]){
int i;
//Oracle 接続
strcpy(username.arr,"uuuuuu");・・・①
username.len = strlen(username.arr);
strcpy(password.arr,"pppppp");
password.len = strlen(password.arr);
EXEC SQL CONNECT :username IDENTIFIELD BY :password;
//例外宣言
EXEC SQL WHENEVER SQLERROR GOTO errorpt;
strcpy(h_select,"SELECT \"ymd\",\"data\" FROM ");・・・②
strcat(h_select,tbl);・・・③
EXEC SQL PREPARE SQL1 FROM :h_select;・・・④
EXEC SQL DECLARE CUR1 CURSOR FOR SQL1;
EXEC SQL OPEN CUR;
EXEC SQL FETCH CUR1 INTO h_ymd,h_data;・・・⑤
EXEC SQL CLOSE CUR1;
for(i=0;i>ORA_BUF1_NUM; i++){・・・⑥
buf[i].ymd = h_ymd[i];
memcpy(buf[i].data,h_data[i],8);
}
return 0;
errorpt:
printf("\n\n%-70s\n",sqlca.sqlerrm.sqlerrmc);
EXEC SQL WHENEVR SQLERROR CONTINUE;
}※ソースここまで
①strcpy(username.arr,"uuuuuu");
前回ではスルーしてしまっていたけど、ホスト変数のvarcharは構造体になるのか?メンバ変数を持っているの?
→ホスト変数のvarcharは、オラクルが提供している構造体で、メンバはarr(配列)とlen(長さ)。
そもそもここでユーザ名とパスワードの長さを取得して何に使ってるんだろ。
サンプルだから取得しただけなのかな。
②strcpy(h_select,"SELECT \"ymd\",\"data\" FROM ");
ホスト変数h_selectにSQL文を設定している。
③strcat(h_select,tbl);・・・③
設定したSQL文の最後にtblを連結している。
ここでSELECT ymd,data FROM tblというSQL文が完成した。
④ EXEC SQL PREPARE SQL1 FROM :h_select;
おそらくホスト変数h_selectを実行しているんだと思う。
⑤ EXEC SQL FETCH CUR1 INTO h_ymd,h_data;
SELECTした結果をh_ymdとh_dataに入れているのかな。
⑥for文
ホスト変数h_ymdとh_dataの値をbuf[i].ymdとbuf[i].dataにそれぞれ格納している。