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

C++BuilderでOracle 10gの埋め込みSQLを使ってみた

2chム板の「C++Builder相談室 Part17」にC++BuilderOracle Pro*Cを使う猛者がいたので、試しにやってみた。

1.準備
$(ORACLEHOME)\precomp\LIB\にあるorasql10.libをCOFF2OMFを使ってC++Builderでリンクできるようにする。

coff2omf orasql10.lib orasql10omf.lib

2.ソースのコンパイル
サンプルソース(File1.pc)は以下の通り。

//---------------------------------------------------------------------------

#include 
#include 
#pragma hdrstop

//---------------------------------------------------------------------------

EXEC SQL INCLUDE SQLCA;
EXEC SQL BEGIN DECLARE SECTION;
static const char* user = "SCOTT";
static const char* passwd = "TIGER";
static const char* host = "ORCL";
EXEC SQL END DECLARE SECTION;

#pragma argsused
int main(int argc, char* argv[])
{

  EXEC SQL BEGIN DECLARE SECTION;
  long empno;
  char ename[20];
  EXEC SQL END DECLARE SECTION;

  EXEC SQL CONNECT :user IDENTIFIED BY :passwd USING :host;

  EXEC SQL DECLARE CURSOR1 CURSOR FOR
    SELECT EMPNO, ENAME FROM EMP
    ORDER BY EMPNO;

  EXEC SQL OPEN CURSOR1;
  EXEC SQL WHENEVER NOT FOUND DO BREAK;

  while (1) {
    EXEC SQL FETCH CURSOR1
      INTO :empno, :ename;

    printf("EMPNO = %d, ENAME = %s\n", empno, ename);
  }

  EXEC SQL CLOSE CURSOR1;

  return 0;
}
//---------------------------------------------------------------------------
人によっては、きんもーっ☆って思うかもしれないけど、これが埋め込みSQLって奴ね。
Oracleお馴染みのscottユーザーのEMP表を出力してみる。

3.コンパイル&リンク
まず、埋め込みSQLが記述されているソースコードC/C++コンパイラコンパイルできるようにする。
やり方は、コマンドプロンプトから直接とか、ビルドイベントとかでも出来るので省略。
コマンドプロンプトからだと、以下のようにproc.exeを実行する。場所は$(ORACLE_HOME)\binの下。

proc code=cpp cpp_suffix=cpp File1.pc
そうするとFile1.cppというファイルが生成されるので、こいつをコンパイル
リンクには、1で作成したライブラリが必要なので、プロジェクトに追加しておくこと。

実際に実行した結果はこんな感じ。

EMPNO = 7369, ENAME = SMITH
EMPNO = 7499, ENAME = ALLEN
EMPNO = 7521, ENAME = WARD
EMPNO = 7566, ENAME = JONES
EMPNO = 7654, ENAME = MARTIN
EMPNO = 7698, ENAME = BLAKE
EMPNO = 7782, ENAME = CLARK
EMPNO = 7788, ENAME = SCOTT
EMPNO = 7839, ENAME = KING
EMPNO = 7844, ENAME = TURNER
EMPNO = 7876, ENAME = ADAMS
EMPNO = 7900, ENAME = JAMES
EMPNO = 7902, ENAME = FORD
EMPNO = 7934, ENAME = MILLER

埋め込みSQLは、数年前に仕事で使ったことがあるけど、結構デバッグが大変だったな・・・。