DB2は久しぶり....

in

揉めにモメた次期システムのデータベースがDB2に決定。4,5年前に少し囓ったことがあるのですが転職後は仕事でも趣味でもデータベースはほとんどMySQLしか触っていないのでちょっと不安。調べてみたらDB2には無料で使えるDB2 Express-Cというパッケージがあって早速インストール。がちゃがちゃいじってみました。といってもユーザとなった今や業務アプリをガリガリと書くことはなくて、Webの方にまわすデータを抽出したりちょっとした調べ物なんかができればいいわけで実際にはプログラムを書く場面はあんまりなくて大抵はSQL+(sh|awk|sed)なんかで済んでしまうんですけどねぇ。ただ、どうしてもSQL一発じゃ厳しいシチュエーションもあるだろうという想定でGoogleと頼りない記憶を頼りにカーソルを使うプログラムを書いてみました。

EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
char    db[20];
char    user[20];
char    using[20];
char    a[10 + 1];
char    b[ 3 + 1];
char    c[ 4 + 1];
long    z;
EXEC SQL END DECLARE SECTION;

strcpy(db,"sample");
strcpy(user,"db2inst1");
strcpy(using,"password");
z = atoi(argv[1])

EXEC SQL CONNECT TO :db USER :user USING :using;

EXEC SQL DECLARE c1 CURSOR FOR
  select a,b,c from samples where x > :z
;
EXEC SQL OPEN c1;

while(1)
{
  memset(a,0x00,sizeof(a));
  memset(b,0x00,sizeof(b));
  memset(c,0x00,sizeof(c));
  EXEC SQL FETCH c1 INTO :a,:b,:c ;
  if (!(strncmp(sqlca.sqlstate,"02000",5))||
       (sqlca.sqlcode < 0))
  {
     break;
   }
   cout << a << "," << b << "," << c << endl;
}
EXEC SQL CLOSE c1;
EXEC SQL DISCONNECT :db

と、まあプログラム自体はわりとスラスラ書けました。自分でビツクリ。後はmakeなんですが、埋め込んだSQL(EXEC SQL...)の部分を事前に変換しなきゃいけないのはなんとなく覚えていたんですがその方法が....と悩みかけたのですがちゃんとありましたよサンプルが。sqllib/samplesにcやperlのサンプルがどっさり。makefileもあったのでなんとかなりました。

:
$(TARGET):sample.o
    $(CC) $(CFLAGS) -o $@ sample.o $(LDFLAGS) -L$(DB2PATH)/$(LIB) -ldb2

sample.o:sample.sqc
    db2 connect to sample user db2inst1 using password
    db2 prep sample.sqc bindfile
    db2 bind sample.bnd
    db2 connect reset
    db2 terminate
    $(CC) $(CFLAGS) -I$(DB2INC) -c sample.c
:

そうそう、prepコマンドでbindファイルを作って....とかやったような記憶がある。たかだか4,5年前のことなのに記憶ってすぐに散逸しちゃいますね。事前にバインド用の変数を定義したりmakeを書いたり...やっぱ面倒なことです。

この記事のトラックバックURL:

http://hippos-lab.com/blog/trackback/196

返信