Windows系OSでのPro*Cコンパイル方法

Windows OSにはCのコンパイラが標準で付属していないためPro*CプログラムのコンパイルにはVC++等のコンパイラのインストールが必要です。 本ページではVC++付属のコンパイラ(cl.exe)を使ったORACLEのデモプログラムのコンパイル方法を記載します。

環境

この手順を実行した環境は以下の通りです

OS Windows XP Proffesional(x86)
DB 10.2
開発環境 VisualStudio 2008 VC++ Express Edition

コンパイル手順

斜線部はORACLE_HOMEやVisual Studioのバージョン、DBの接続情報のため環境に応じて変更します。
環境変数設定
E:\proc_test>set ORACLE_HOME=E:\oracle\product\10.2.0\db_1
E:\proc_test>set MSVCDIR=C:\Program Files\Microsoft Visual Studio 9.0
E:\proc_test>set path=%ORACLE_HOME%\bin;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbe
m;%MSVCDIR%\Common7\IDE;%MSVCDIR%\VC\bin;
E:\proc_test>set SQLLIB_lib=orasql10.lib

プリコンパイルして*.Cのソースを作成
E:\proc_test>proc test.pc
Pro*C/C++: Release 10.2.0.4.0 - Production on 日 11月 16 19:36:19 2008
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
システムのデフォルト・オプション値: E:\oracle\product\10.2.0\db_1\precomp\admin\pcscfg.cfg

コンパイル実行可能ファイル(EXEファイル)を作成
E:\proc_test>cl -I%ORACLE_HOME%\oci\include -I%ORACLE_HOME%\precomp\public -I. -I"%MSVCDIR%\VC\inclu
de" -I"%MSVCDIR%\VC\PlatformSDK\include" -D_MT -D_DLL -Zi test.c /link %ORACLE_HOME%\oci\lib\msvc\oc
i.lib /libpath:%ORACLE_HOME%\precomp\lib /libpath:%ORACLE_HOME%\precomp\lib\msvc %SQLLIB_lib% /LIBPA
TH:"%MSVCDIR%\VC\lib" msvcrt.lib /LIBPATH:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib" /nod:l
ibc
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 15.00.21022.08 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

test.c
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:test.exe
/debug
E:\oracle\product\10.2.0\db_1\oci\lib\msvc\oci.lib
/libpath:E:\oracle\product\10.2.0\db_1\precomp\lib
/libpath:E:\oracle\product\10.2.0\db_1\precomp\lib\msvc
orasql10.lib
"/LIBPATH:C:\Program Files\Microsoft Visual Studio 9.0\VC\lib"
msvcrt.lib
"/LIBPATH:C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib"
/nod:libc
test.obj

実行結果
E:\proc_test>test.exe
PRINT DEPT START
    ACCOUNTING
    RESEARCHNG
    SALESRCHNG
    OPERATIONS
PRINT DEPT END
コンパイル手順

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

#define ORAUSER    "SCOTT"
#define ORAPASSWD  "TIGER"
#define ORASYSID_T "ORCL102"

EXEC SQL INCLUDE sqlca;
EXEC SQL BEGIN DECLARE SECTION;
         varchar  h_user[64];
         varchar  h_pswd[64];
         varchar  h_sid[64];
         int empno;
         varchar  dname[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()
{
    //ユーザ名、パスワードセット
    strcpy((char *)h_user.arr,ORAUSER);
    h_user.len = strlen((char *)h_user.arr);
    strcpy((char *)h_pswd.arr,ORAPASSWD);
    h_pswd.len = strlen((char *)h_pswd.arr);
    strcpy((char *)h_sid.arr,ORASYSID_T);
    h_sid.len = strlen((char *)h_sid.arr);

    EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE error--\n");
    //接続
    EXEC SQL CONNECT :h_user IDENTIFIED BY :h_pswd using :h_sid;
    //CURSORを使用してループ
    EXEC SQL DECLARE CUR1 CURSOR FOR
         SELECT DNAME FROM DEPT;
    EXEC SQL OPEN CUR1;
    printf("PRINT DEPT START");
    for ( ; ;)
    {
        EXEC SQL WHENEVER NOT FOUND GOTO nodept;
        EXEC SQL FETCH CUR1 INTO :dname;
        printf("\n    %s",dname.arr);
        EXEC SQL WHENEVER NOT FOUND STOP;
    }
    EXEC SQL CLOSE CUR1;

    nodept:
        printf("\nPRINT DEPT END\n");
    return 0;
}
ソース(test.pc)
★ORACLE案件承ります