LastUpdate: 2019/06/05 23:45:37

戻る

まず資料を集めよう。
http://otn.oracle.co.jp/document/products/oracle9i/index.html
あたりから、探してみましょう。

Pro*C/C++ for Windows プリコンパイラ スタート・ガイド リリース9.2 (2002/8/7) これなんか良さそうですね。

それと、こんなんのもあると良いみたい
Pro*C/C++ Precompiler プログラマーズ・ガイド リリース9.0.1 これはプラットホーム非依存の所にありますな

中を読んでいくと

 

Pro*C/C++ の概要
Pro*C/C++ プリコンパイラを使用することにより、Oracle データベースにアクセスするアプリケーションを迅速に、また他のシステムとの互換性を考慮しながら開発できます。Pro*C/C++ プログラミング・ツールにより、C またはC++ プログラムにSQL 文を埋め込むことができます。
Pro*C/C++ プリコンパイラは、埋込みSQL 文を標準のOracle ランタイム・ライブラリ・コールに変換し、通常の方法でコンパイル、リンクおよび実行できるソース・プログラムに変更します。

だそうだ。ようわプリコンパイルみたいですね〜。

インストール時にPro*Cが指定してある場合は、オラクルホームの下に下記のフォルダができているそうです。

¥admin  構成ファイル
¥demo¥proc  Pro*C/C++ 用サンプル・プログラム
\demo¥sql  サンプル・プログラム用SQL スクリプト
¥doc¥proc  Pro*C/C++ のREADME ファイル
¥help¥proc  Pro*C/C++ のヘルプ・ファイル
¥lib¥msvc  Pro*C/C++ のライブラリ・ファイル
¥mesg  メッセージ・ファイル
¥misc¥proc  Pro*C/C++ 用の他のファイル
¥public  ヘッダー・ファイル

ありました。
C:\oracle\ora92\precomp 配下ですね


割り込み !!

proCを使ったプロジェクトのコンパイルが通らないって事があった。原因は、プリコンパイルされるときに、実際にオラクルのテーブルまでアクセスしに行くそうです。
だから、オラクルとの接続が確立されていて、なおかつ、使用するテーブルなどが無いとダメらしいです…

2004/07/16


では、SAMPLE8 指定した部門の全従業員の名前をemp 表から取得します(動的SQL 方法3)。
なんかひとつやってみましょうか。

コンパイルの方法はVC++で行なう方法もあるみたいだが、簡単そうなコマンドスクリプトバッチで行こう!

どうも、環境変数がいる見たい。VisualStudioがあるところって、ここでいいのかな?
それと、オラクルホームも設定しました。いずれも、システム側にしておきました。

コマンドラインよりサンプルの格納されているフォルダに移動
C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8
そして、pcmake.bat をうごかせば良いみたい

======
C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8>%ORACLE_HOME%¥precomp¥demo¥proc¥pcmake sample8
'C:\oracle\ora92¥precomp¥demo¥proc¥pcmake' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
======

えらーだ!なんで?

C:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT 起動して、VisualStudio系の環境変数をキチット登録してないとダメみたい。けど、これって一回切りだよな〜

ぶつぶついいながら、再度挑戦


C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8>%ORACLE_HOME%\precomp\demo\proc_shodai_lesson\pcmake sample8

C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8>echo sample8
sample8

C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8>proc parse=full iname=sa
mple8.pc include="C:\oracle\ora92\oci\include" include="C:\oracle\ora92\precomp\public" include="C:\PROGRA~1\MICROS~3\VC98\include"

Pro*C/C++: Release 9.2.0.1.0 - Production on Mon Dec 16 04:08:42 2002

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

System default option values taken Wrom: SKPNKMBIPBARHDMNNSKVFVWRKJVZCMHVIBGDADRZ

Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

sample8.c
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

/out:sample8.exe
/debug
C:\oracle\ora92\oci\lib\msvc\oci.lib
/libpath:C:\oracle\ora92\precomp\lib
/libpath:C:\oracle\ora92\precomp\lib\msvc
orasql9.LIB
/LIBPATH:C:\PROGRA~1\MICROS~3\VC98\lib
msvcrt.lib
/nod:libc
sample8.obj
LINK : fatal error LNK1181: 入力ファイル "C:\oracle\ora92\oci\lib\msvc\oci.lib" を開けません

C:\oracle\ora92\oci\lib\msvc\oci.lib が見あたらないと言っているようだ。フォルダを見たら、確かに無い。なんで?
 2002/12/15


オラクルサーバーそのものをインストートルしたパソコンを確認してみると、確かにoci.libが存在してるんですね。てことはインストールした時のオプションの選び方が悪かったんですかね〜  

インストールし直してみることにしましょう。今回は、カスタムを選択してみました。

OCIまわりが選択されていることを確認しましょう。

Oracle Call Interfaceあたりがインストール対象になっていることを確認して、インストールを開始。

どうやら、正しくインストールできたようです。


では、再チャレンジ。何?


C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8>%ORACLE_HOME%\precomp\demo\proc\pcmake sample8
) の使い方が誤っています。

何がいかんのじゃ〜
しょうがないので、pcmakeの中の1行目の @echo off をREMをつけてコメントアウトして流してみると、38行目の
if (%NLS_LANG%) == () set NLS_LANG=american 
が文法エラーだという。コマンドプロンプトから %NLS_LANG% を叩くと american と表示されるので、38行目は必要なしと認定して、コメントアウトしちゃいました。

では再度実行
 


/out:sample8.exe
/debug
C:\oracle\ora92\oci\lib\msvc\oci.lib
/libpath:C:\oracle\ora92\precomp\lib
/libpath:C:\oracle\ora92\precomp\lib\msvc
orasql9.LIB
/LIBPATH:C:\PROGRA~1\MICROS~3\VC98\lib
msvcrt.lib
/nod:libc
sample8.obj

やっとできました。

EXEができているのを確認して、実行してみましょう


C:\oracle\ora92\precomp\demo\proc_shodai_lesson\sample8>sample8.exe

Oracle error
ORA-12560: TNS:protocol adapter error

in "..."
on line 56 of sample8.pc.

プロトコルエラーだと。ソースを見てみると

EXEC SQL CONNECT :username IDENTIFIED BY :password;

となっている。SCOTT と TIGER しかいれていないじゃないか!サービスネームはどうするんだ〜?

EXEC SQL CONNECT :username IDENTIFIED BY :password
AT dbname USING :connect_string;

connect_string にサービスネームを入れてもダメ。最後の方法で

EXEC SQL CONNECT string    string には"scott/tiger@ora"をいれてある。 これで実行完了しました。


Connected to Oracle.

SELECT ename FROM emp WHERE deptno = :v1
   v1 = 10

Employee
--------
CLARK
KING
MILLER

Query returned 3 rows.

Sayonara.

2002/12/18


ところで
OCIとPro*C/C++の違いって?

OCI

OCIはOracleにアクセスするための最もネイティブなAPIである。そのため、パフォーマンスは優れているが、プログラミングは多少複雑になる。

Pro*C/C++

C/C++プログラムの中に直接SQL文を埋め込むことが可能である。OCIと比較すると、パフォーマンスは劣るが、プログラミングはしやすい。プリコンパイラを使用し埋め込んだSQL文をOracleへの呼び出しに変換した後、再度コンパイルする必要がある。また、直接埋め込まずストアド・プロシージャーをコールする場合にも使用する。UNIX上でのC/C++プログラムからOracleDBへの接続の主流。

http://www.fukkey.dyndns.org/pins/ora/020531/44357.html

どうも私が今回挑戦したさんぷるはOCIなのかな〜


VC++から、直接コンパイルする時の内容

拡張子pcを右クリック→設定にて    c の例


コマンド
call vcvars32.bat
proc $(InputName).pc include="c:\oracle\ora92\precomp\public" include="%MSVCDIR%\include" include="C:\oracle\ora92\oci\include" parse=full

出力
$(ProjDir)\$(InputName).c

コマンドのメモ
試行錯誤の結果なので、詳細は判明しだい記述予定

vcvars32.bat:
C:\Program Files\Microsoft Visual Studio\VC98\Bin\vcvars32.bat
各種パスの設定や環境変数が記述されているようだ。

include=:
proc に対するパラメタであり、#include文の取り込みパス

parse=:
Pro*C/C++ プリコンパイラでソース・ファイルを解析する方法を指定します。

プリコンパイラのオプション10-37ページに
「PARSE=FULL のときはC パーサーが動作し、....」とあります。
今回はC言語なので、FULL指定にしてみたらうまく動きました。


リンクで失敗した時は、以下の点を再確認

orasql9.lib  がリンクできていること。

リンクする方法はいろいろあるが、



リンク → 一般 → オブジェクト/ライブラリモジュール に相対でも絶対でもいいからパスを切っておくと、参照可能になる。


戻る