小さい頃はエラ呼吸

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


Visual Studio 2008でつくるOracle Pro*C サンプルプログラム


photo credit: http://kahwailin.com/ via photopin cc

はじめに

Visual Studio 2008でOracle Pro*cを使ってデータベースを検索するサンプルプログラムを動かしてみました。
この記事を書くにあたり、以下の記事がとても参考になりました。

visual studio 2008でのpro*C開発方法visual studio 2008でのpro*C開発方法

解きながら学ぶC言語
解きながら学ぶC言語
posted with amazlet at 14.01.16
柴田 望洋 肘井 真一 高木 宏典 赤尾 浩
ソフトバンククリエイティブ
売り上げランキング: 27,265

環境
  • Windows Server 2008 R2
  • Oracle Database 11g Release 11.2.0.1.0
  • Visual Studio C++ 2008 Professional
事前準備
  1. データベースの作成
  2. hogeユーザの登録
  3. table01というテスト用のテーブル作成、データ登録
Visual Studio 2008でつくるサンプルアプリケーション

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インストールディレクトリ\product\11.2.0\dbhome_1\precomp\public

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

コンパイル言語の選択 Cコードとしてコンパイル(/TC)

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

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

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

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

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

コマンドライン proc $(ProjectName).pc
出力ファイル $(ProjectName).c
ビルドして、動かしてみる

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

カスタムビルドステップで、Pro*C/C++が動いているのが確認できます。

------ すべてのリビルド開始: プロジェクト: ProcTest2, 構成: Debug Win32 ------
プロジェクト 'ProcTest2'、構成 'Debug|Win32' の中間出力ファイルを削除しています。
カスタム ビルド ステップを実行しています。
Pro*C/C++: Release 11.2.0.1.0 - Production on 土 1月 18 00:41:38 2014
Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved.
システムのデフォルト・オプション値: C:\app\Administrator\product\11.2.0\dbhome_1\precomp\admin\pcscfg.cfg
コンパイルしています...

メニューからデバッグ(D)→デバッグなしで開始(H)で実行すると、テストデータがコンソールに表示されます。

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;
}
コンソールが文字化けしてしまう場合

ソリューションのプロパティを開き、デバッガ→「環境」に適切なNLS_LANGを指定すると文字化けを解消できます。