この節では、サポートされている各種コンパイラーで DB2 アプリケーションを構築するための情報として、 AIX に固有の情報を提供します。 次のような内容を扱います。
AIX がストアード・プロシージャーをロードしたり、 その中にあるライブラリー参照を解決したりする方法のために、 COBOL をインストールする方法についての要件があります。 これらの要件は、 COBOL プログラムが実行時に共用ライブラリー (ストアード・プロシージャー) をロードするときの要素となります。
ストアード・プロシージャーをロードするときには、 それが参照する一連のライブラリーの連鎖もロードする必要があります。 プログラムで間接的にのみ参照するライブラリーを AIX が探索するときには、 言語プロバイダー (IBM COBOL または Micro Focus COBOL) の作成した参照ライブラリーにコンパイルされたパスを使用する必要があります。 このパスは必ずしも、コンパイラーがインストールされたパスと同じとは限りません。 連鎖に含まれるライブラリーをバインドできない場合、 ストアード・プロシージャーのロードは失敗し、SQLCODE -10013 を受け取ります。
これが生じないようにするには、必要なときには常にコンパイラーをインストールし、 その後、すべての言語ライブラリーの記号リンクを、 インストール・ディレクトリーから /usr/lib (ライブラリーのロードが必要なときには、ほぼ必ず探索されるディレクトリー) に作成します。 ライブラリーを sqllib/function (ストアード・プロシージャーのディレクトリー) にリンクできますが、 これは、1 つのデータベース・インスタンスに対してしか作動しません。 /usr/lib は、マシン上のすべてのデータベース・インスタンスに対して作動します。 ライブラリーをコピーしないことを強くお勧めします。 (特に、ライブラリーの複数のコピーが存在するときの Micro Focus COBOL の場合。)
Micro Focus COBOL のサンプルの記号リンクを下記に示します (/usr/lpp/cobdirにインストールされていると仮定する)。
[1]> su root [2]> cd /usr/lib [1]> ln -sf /usr/lpp/cobdir/coblib/*.a .
ストアード・プロシージャーは、データベースにアクセスし、 クライアント・アプリケーションに情報を戻すプログラムです。 ユーザー定義関数 (UDF) は、ユーザー独自のスカラー関数または表関数です。 ストアード・プロシージャーおよび UDF は、サーバー上でコンパイルされ、 サーバー上の共用ライブラリーに保管されて実行されます。 これらの共用ライブラリーは、 ストアード・プロシージャーおよび UDF をコンパイルするときに作成されます。
共用ライブラリーには入り口点が 1 つずつあります。 入り口点は、サーバーから呼び出され、 共用ライブラリー内のプロシージャーにアクセスします。 AIX 上の IBM C コンパイラーでは、 ライブラリー内のエクスポートされた関数名を、 デフォルトの入り口点として指定することができます。 これは、ストアード・プロシージャーの呼び出しまたは CREATE FUNCTION ステートメントで、 ライブラリー名だけを指定した場合に呼び出される関数です。 これを行うには、リンク・ステップで -e オプションを指定します。 たとえば、次のようにします。
-e funcname
これは、funcname をデフォルトの入り口点とします。 CREATE FUNCTION ステートメントとの関連については、 "UDF および CREATE FUNCTION ステートメント"を参照してください。
他の UNIX プラットフォームでは、そのような機構は存在しないので、 DB2 はデフォルトの入り口点がライブラリーと同じ名前であるとみなします。
AIX では、外部から呼び出し可能な、 ライブラリー内のグローバル関数を指定するエクスポート・ファイルを提供することが必要です。 このファイルは、 ライブラリー内のすべてのストアード・プロシージャーまたはユーザー定義関数 (あるいはその両方) の名前を含んでいる必要があります。 他の UNIX プラットフォームは単に、 ライブラリー内のすべてのグローバル関数をエクスポートするだけです。 次は、AIX エクスポート・ファイルの例です。
#! outsrv export file outsrv |
エクスポート・ファイルの outsrv.exp は、 ストアード・プロシージャー outsrv をリストします。 リンカーは outsrv.exp を使用して、 同じ名前のストアード・プロシージャーを含む共用ライブラリー outsrv を作成します。
注: | 共用ライブラリーを作成した後、一般に、 DB2 がそれにアクセスするディレクトリーにコピーします。 ストアード・プロシージャーまたはユーザー定義関数の共用ライブラリーを置換するには、 /usr/sbin/slibclean を実行して AIX 共用ライブラリーのキャッシュをフラッシュするか、 またはライブラリーを宛先ディレクトリーから除去した後、 ソース・ディレクトリーから宛先ディレクトリーにライブラリーをコピーする必要があります。 そうしなければ、参照されるライブラリーのキャッシュを AIX が保持し、 ライブラリーの重ね書きを認めないため、コピー操作が失敗します。 |
AIX コンパイラーの資料には、 エクスポート・ファイルに関する追加情報が記載されています。
アプリケーション開発の手引き は、 ストアード・プロシージャーのコーディング方法を説明しています。 SQL 解説書 は、 CALL ステートメントを使用するデータベースのロケーションでストアード・プロシージャーを呼び出す方法を説明しています。 この節では、 ストアード・プロシージャーをコンパイルおよびリンクする方法と、 CALL ステートメントで提供する情報について説明します。
プログラムをコンパイルしリンクするときには、 次の 2 つの方法で関数を識別することができます。
たとえば、リンク・ステップで次のように指定できます。
-e modify
これは、 リンク・ライブラリーのデフォルト入り口点が関数 modify であることを示します。
/u/mydir/procs ディレクトリー中のライブラリー mystored をリンクしており、 上記のようにデフォルト入り口点 modify を使用したい場合、 CALL ステートメントに次のものを含めてください。
CALL '/u/mydir/procs/mystored'
ライブラリー mystored は、メモリーにロードされ、 関数 modify はデフォルト入り口点として DB2 によってピックアップされて実行されます。
一般には、ライブラリー中に複数のストアード・プロシージャーがあり、 追加の関数にストアード・プロシージャーとしてアクセスしたい場合に、 このリンク・オプションを使います。
上記の例から続けるために、ライブラリー mystored が 3 つのストアード・プロシージャー、 すなわち modify、remove、そして add を持っているものとします。 modify を上記のようにデフォルト入り口点として指定し、 remove および add をエクスポート・ファイル中に含めることによって、 それらが追加入り口点であることをリンク・ステップに通知します。
リンク・ステップにおいて、次のように指定します。
-bE:mystored.exp
これは、エクスポート・ファイル mystored.exp を指定します。
エクスポート・ファイルは、 ストアード・プロシージャーの関数がリストされたもので、 最初にデフォルトの入り口点がリストされます。
modify remove add |
最後に、ストアード・プロシージャーの 2 つの CALL ステートメント、 すなわち remove 関数および add 関数を呼び出すステートメントを、 次のようにコーディングします。
CALL '/u/mydir/procs/mystored!remove'
および
CALL '/u/mydir/procs/mystored!add'
アプリケーション開発の手引き は、UDF のコーディング方法を説明します。 SQL 解説書 は、 CREATE FUNCTION ステートメントを使って UDF を DB2 に登録する方法を説明しています。 この節は、UDF をコンパイルし、リンクする方法と、 CREATE FUNCTION ステートメントの EXTERNAL NAME 文節中で提供されている情報との間に見られる関係を説明します。
プログラムをコンパイルしリンクするときには、 次の 2 つの方法で関数を識別することができます。
たとえば、リンク・ステップで次のように指定できます。
-e modify
これは、 リンク・ライブラリーのデフォルト入り口点が関数 modify であることを示します。
/u/mydir/procs ディレクトリー中のライブラリー myudfs をリンクしており、 上記のようにデフォルト入り口点 modify を使用したい場合、 CREATE FUNCTION ステートメントに次のものを含めてください。
EXTERNAL NAME '/u/mydir/procs/myudfs'
DB2 はライブラリー myudfs のデフォルトの入り口点をピックアップします。 これは、関数 modify です。
一般的に、ライブラリー中に複数の UDF があり、 追加の関数に UDF としてアクセスしたい場合に、 このリンク・オプションを使います。
上の例から続けるために、ライブラリー myudfs が 3 つの UDF、 すなわち上記の modify、 remove、そして add を持っているものとします。 modify を上記のようにデフォルト入り口点として指定し、 remove および add をエクスポート・ファイル中に含めることによって、 それらが追加入り口点であることをリンク・ステップに通知します。
リンク・ステップにおいて、次のように指定します。
-bE:myudfs.exp
これは、エクスポート・ファイル myudfs.exp を指定します。
エクスポート・ファイルは、次のようになります。
* additional entry points for myudfs #! remove add |
最後に、 UDF 用の 2 つの CREATE FUNCTION ステートメント (remove および add 関数によって実行する) に、 以下の EXTERNAL NAME 文節を含めます。
EXTERNAL NAME '/u/mydir/procs/myudfs!remove'
および
EXTERNAL NAME '/u/mydir/procs/myudfs!add'