小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Windows7+Visual Studio 2005でOracle Pro*cファイルをビルドする


photo credit: josemanuelerre via photopin cc

はじめに

OracleデータベースのインストールされていないWindows7上で、Visual Studio 2005を使ってOracle Pro*C(.pc)ファイルをビルドする方法をまとめてみました。

環境
  • Windows 7 Enterprise
  • Visual Studio 2005 Professional
  • Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (32-bit)
事前準備

以下の記事を参考にOracle Clientをインストールしてください。

この記事では、以下のパスにOracle Clientをインストールした場合として説明します。

Oracleインストールディレクトリ C:\app\Administrator\product\11.2.0\client_2
Visual Studio 2005でPro*cファイルをビルドする

1.Visual Studioを起動して、新規C++プロジェクトを作成します。

プロジェクトの種類 テンプレート
Win32 Win32コンソールアプリケーション

2.Win32アプリケーションウィザードで「次へ」ボタンをクリックします。

3.アプリケーションの設定で、「プリコンパイル済みヘッダー(P)」のチェックを外し、「完了」ボタンをクリックします。

4.cppファイルの拡張子をcpp→pcへと変更します。pcファイルに記述する内容は後述します。


5.空のcファイルを登録します。ソースファイルフォルダを右クリックして、追加(D)→新しい項目(W)を選択します。

C++ファイル(.cpp)を選択し、ファイル名欄の拡張子を(.c)に変更してから「追加(A)」ボタンをクリックします。

カテゴリ テンプレート
コード C++ファイル(.cpp)



6.Oracleのインクルードファイルを追加します。ソリューションのプロパティを開き、「追加のインクルードディレクトリ」に以下を指定します。

追加のインクルードディレクトリ Oracle Clientのインストールディレクトリ\precomp\public


7.コンパイル言語をC++ではなく、Cソースしてコンパイルするよう変更します。ソリューションのプロパティを開き、C/C++→詳細→「コンパイル言語の選択」に以下を指定します。

8.追加のライブラリディレクトリを登録します。ソリューションのプロパティを開き、リンカ→全般→「追加のライブラリディレクトリ」に以下を指定します。

追加のライブラリディレクトリ Oracle Clientのインストールディレクトリ\precomp\LIB


9.追加の依存ファイルを登録します。ソリューションのプロパティを開き、リンカ→入力→「追加の依存ファイル」に以下を指定します。

追加の依存ファイル orasql11.lib


10.pcファイルにカスタムビルドを設定します。
pcファイルを右クリックしてプロパティを開きます。カスタムビルドステップを選択し、以下を指定します。*1

コマンドライン proc $(InputName).pc
出力ファイル $(InputName).c


ビルドしてみる

メニューからビルド(B)→ソリューションのビルド(R)を選択します。

ビルドログにprocコマンドの実行ログが出力されていることを確認します。

カスタム ビルド ステップを実行しています。
Pro*C/C++: Release 11.2.0.1.0 - Production on 土 1月 18 14:27:12 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
システムのデフォルト・オプション値: C:\app\Administrator\product\11.2.0\client_2\precomp\admin\pcscfg.cfg
コンパイルしています...

procコマンドが正常に実行されると、新規追加したcファイルの中にソースコードが吐き出されます。

pcファイルの中身
#pragma warning( disable: 4996 )
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sqlcpr.h"

EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
  char uid[64];
  char pwd[64];
  char sid[64];
  char name[40];
EXEC SQL END   DECLARE SECTION;

void sql_error(char* msg)
{
  char err_msg[128];
  size_t buf_len, msg_len;
  EXEC SQL WHENEVER SQLERROR CONTINUE;
  printf("\n%s\n", msg);
  buf_len = sizeof (err_msg);
  sqlglm(err_msg, &buf_len, &msg_len);
  printf("%.*s\n", msg_len, err_msg);
  EXEC SQL ROLLBACK RELEASE;
  exit(EXIT_FAILURE);
}

int main()
{
  // ユーザ名
  sprintf(uid, "hoge");
  // パスワード
  sprintf(pwd, "hoge_pwd");
  // SID
  sprintf(sid, "orcl");

  EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");
  
  // データベースへの接続
  EXEC SQL CONNECT :uid IDENTIFIED BY :pwd;

  // カーソル定義
  EXEC SQL DECLARE CUR1 CURSOR FOR
    SELECT name FROM table01;
     
  // カーソルオープン
  EXEC SQL OPEN CUR1;
  printf("PRINT START FOR DEBUG");
  for ( ; ;)
  {
    EXEC SQL WHENEVER NOT FOUND GOTO noData;
    // データフェッチ
    EXEC SQL FETCH CUR1 INTO :name;
    printf("\n NAME::%s",name);
    EXEC SQL WHENEVER NOT FOUND STOP;
  }

  // カーソルクローズ
  EXEC SQL CLOSE CUR1;

  noData:
    printf("\nPRINT END FOR DEBUG\n");
  return 0;
}

*1:Visual Studio 2008からは$(InputName)は廃止され、$(ProjectName)を使用します。