読者です 読者をやめる 読者になる 読者になる

底辺過ぎてちょっとビビる

26歳からIT業界にいるエンジニアが、まったく成長できてないことを確認するブログ。備忘録的に使いたいとも考えています。

Pro*C の復習中 その2

今度は動的に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にそれぞれ格納している。

 

 

 

 

苦しんで覚えるC言語

苦しんで覚えるC言語

 
新・明解C言語 入門編 (明解シリーズ)

新・明解C言語 入門編 (明解シリーズ)

 
Cの絵本―C言語が好きになる9つの扉

Cの絵本―C言語が好きになる9つの扉