10.2.1 外部Cストアドルーチンの作成
外部Cストアドルーチンを作成する手順を次に示します。
-
Cプログラムの記述(Cファイルの作成)
-
コンパイル(オブジェクトファイルの作成)
-
リンケージ(Cライブラリファイルの作成)
- 〈この項の構成〉
(1) Cプログラムの記述(Cファイルの作成)
外部Cストアドルーチンとして登録するCプログラムを記述します。
(a) Cプログラムを作成するときの規則
Cプログラムを作成するときの規則を次に示します。なお,「Cプログラム作成時の制限事項」も併せて参照してください。
-
C言語の既定の呼出し規約(__cdecl)を指定してください。
-
正常終了する場合は,SQLSTATEを表す出力パラメタに,00000を設定してください。
(例)memcpy(sqlstate, "00000", 5);
-
異常終了する場合は,SQLSTATEを表す出力パラメタに,38XYYを設定してください。XとYは次の範囲で設定してください。
X:I〜Z
Y:0〜9又はA〜Z
(例1)memcpy(sqlstate, "38I01", 5);
(例2)memcpy(sqlstate, "38ZCB", 5);
-
異常終了する場合は,エラーの原因を意味するメッセージテキストを設定してください。
Cプログラムの記述例を次の図に示します。
|
(b) パラメタ入出力モードのマッピング
外部Cストアドルーチンでの,SQLのパラメタ入出力モード(IN,OUT,又はINOUT)のマッピング例を次の図に示します。マッピングについては,マニュアル「HiRDB SQLリファレンス」の型マッピングを参照してください。
|
(2) コンパイル(オブジェクトファイルの作成)
ccコマンドなどを使用して,Cファイルからオブジェクトファイルを作成します。
コンパイルの例を次の図に示します。コンパイルオプションについては,OSのマニュアルを参照してください。
|
- 注
-
コンパイルオプションについては,各OSのマニュアルを参照してください。
(3) リンケージ(Cライブラリファイルの作成)
ldコマンドなどを使用して,複数のオブジェクトファイルからCライブラリファイルを作成します。ライブラリ関数を使用する場合は,-lオプションなどを使用して必要なライブラリをリンクしてください。
リンケージ例を次の図に示します。
|
- 注1
-
Cライブラリファイルの拡張子はOSによって異なります。
- 注2
-
リンカオプションについては,各OSのマニュアルを参照してください。
(4) 各OSでのCライブラリファイルの作成例
Cファイル(sample.c)からCライブラリファイルを作成する例を,OSごとに説明します。Cライブラリファイルの作成方法はOSによって異なるため,詳細については,各OSのマニュアルを参照してください。
なお,例ではコンパイラ及びリンカにパスが通っていることを前提とします。
(a) Linuxの場合
gccコマンドに-sharedオプションを指定して,Cライブラリファイルを作成します。sample.cからsample.soという名称のCライブラリファイルを作成する例を次に示します。
$ gcc -shared -fPIC -o sample.so sample.c
(b) AIXの場合
sample.cからsample.soという名称のCライブラリファイルを作成する例を次に示します。
-
xlcコマンドでオブジェクトファイルを作成します。
$ xlc -c -o sample.o sample.c
-
xlcコマンドに-Gオプションを指定して,Cライブラリファイルを作成します。
$ xlc -G -bexpall -o sample.so sample.o
- 64ビットモードの場合:
-
64ビットモードのHiRDBで使用するCライブラリファイルは,64ビットモードでコンパイル及びリンケージしてください。コンパイルオプションに-q64 を指定して,リンカオプションに-b64を指定します。
- POSIXライブラリ版の場合:
-
64ビットモードのHiRDBで使用するCライブラリファイルは,マルチスレッドに対応する必要があるため,次に示す条件を満たしてください。
-
コンパイル時にxlc_rコマンドを使用してCファイルをコンパイルします。
-
スレッドセーフな関数を使用します。
-
(c) Windowsの場合
sample.cからsample.dllという名称のCライブラリファイル(DLLファイル)を作成する例を次に示します。
-
clコマンドでオブジェクトファイルを作成します。
cl /MD /c sample.c
-
linkコマンドでCライブラリファイル(DLLファイル)を作成します。また,モジュール定義ファイル(sample.def)を作成して,エクスポートする関数を指定します。
link /dll /def:sample.def sample.obj
- 注
-
-
作成するDLLのベースアドレス(デフォルト・ロード・アドレス)は指定しないでください。指定した場合,HiRDBやシステムのDLLとアドレスが競合して,DLLのローディング処理に負荷が掛かることがあります。
-
使用するMicrosoft Visual C++ランタイムライブラリは,マルチスレッドDLL版(/MD)でなければなりません。それ以外のライブラリを使用すると,領域管理の処理が不正となり,サーバプロセスが異常終了するおそれがあります。
-