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)