この項の内容:
この章の情報は、ブロック・ストレージ・データベースのみに適用され、集約ストレージ・データベースとは関係がありません。集約ストレージとブロック・ストレージの比較。も参照してください。
Essbaseに用意されている計算関数を強化するために、計算スクリプトで使用するカスタム定義関数を作成できます。Essbaseには、カスタム定義関数のサンプルは用意されていません。
カスタム定義計算関数はJavaで記述します。カスタム定義計算関数はJavaで記述します。Essbaseには、Javaのクラスとアーカイブを作成するためのツールがありません。このため、サポートされるバージョンのJDKが必要です。Oracle Hyperion Enterprise Performance Management System動作保証マトリックス(http://www.oracle.com/technology/software/products/ias/files/fusion_certification.html)を参照してください。
カスタム定義関数の例は、『Oracle Essbaseテクニカル・リファレンス』を参照してください。
カスタム定義関数を作成するには:
カスタム定義関数の要件を参照してください。
カスタム定義関数として使用するためのpublicかつstaticなメソッドを少なくとも1つ含む、publicなJavaクラスを記述します。
Javaクラスの作成とコンパイルを参照してください。
EssbaseサーバーへのJavaクラスのインストールを参照してください。
カスタム定義関数を、ローカル関数またはグローバル関数として登録します。
カスタム定義関数の登録を参照してください。
カスタム定義関数として使用するために、クラスに複数のメソッドを作成できます。通常は、Essbaseサーバー上のすべてのアプリケーションでカスタム定義関数として使用するメソッドを単一のクラス内に作成することをお薦めします。ただし、Essbaseサーバー上の一部のアプリケーションで使用するカスタム定義関数を追加する場合は、そのカスタム定義関数を個別のクラスに作成し、個別の.jarファイルに保管してEssbaseサーバーに追加します。
カスタム定義関数として使用するメソッドを含んだJavaクラスを複数作成する場合は、各クラス名が一意であることを確認します。重複するクラス名があると、重複するクラスのメソッドが認識されず、そのメソッドをカスタム定義関数として登録できません。
テスト・プログラムをJavaで使用して、Javaのクラスとメソッドをテストします。メソッドの出力が適切な場合は、そのメソッドをEssbaseサーバーにインストールして、単一のテスト・アプリケーションにそのメソッドを登録します。テストするために関数をグローバルに登録しないでください。グローバルに登録すると、問題が発生したときにその関数を更新することがより難しくなります。
カスタム定義関数のメソッドは、次のようなサポートされているデータ型のいずれの組合せでも、入力パラメータとして持つことができます:
CalcBooleanはEssbase固有のデータ型で、3つの値(TRUE、FALSEおよび#MISSING)を保管できます。他のリストされたデータ型の詳細は、JDKのドキュメンテーションを参照してください。
メソッドの戻りデータ型は、voidまたは前述のデータ型のいずれかにできます。戻されたデータ型はEssbase固有のデータ型に変換されます。文字列はstring型にマッピングされます。ブール値はCalcBooleanデータ型にマッピングされます。その他のすべての値はdouble型にマッピングされます。
Essbaseでは、無限値または非数(Not-a-Number)値とともに戻されるdouble型の変数をサポートしません。このような値がJavaプログラムから戻された場合、その値はEssbaseで正しく記録されていないか、表示されていない可能性があります。Essbaseに戻される前に、double型の変数に、無限値と非数値があるかどうかを検査し、有限値に設定する必要があります。JDKのドキュメンテーションのクラスDoubleに関する説明を参照してください。 |
カスタム定義関数を作成、削除および管理するために、Essbaseでは次のセキュリティ権限が必要です:
カスタム定義関数をEssbaseに登録するときには、関数に名前を付けます。その名前は、計算スクリプトと式で使用され、関数によって使用されるJavaのクラス名とメソッド名とは異なります。
カスタム定義関数に名前を付けるときには次の要件に従います:
名前は@記号で始めます。関数名の残りの部分には、文字、数字および記号(@、#、$、_)を使用します。スペースは関数名に使用できません。
例: @MYFUNCTION
カスタム定義マクロによってのみ呼び出されるカスタム定義関数の名前は、一般用途の関数およびマクロと区別するため、@_で始めます。
例: @_MYFUNCTION
カスタム定義関数の名前は一意でなければなりません。関数名は、他の関数名、カスタム定義マクロの名前および既存の計算関数の名前とも異なる必要があります。
Essbaseアプリケーションにグローバル関数と同じ名前のローカル関数がある場合、計算にはローカル関数が使用されます。
Javaクラスを作成およびコンパイルするには、テキスト・エディタとJDK javacツールを使用します。
例:
public class CalcFunc { public static double sum (double[] data) { int i, n = data.length; double sum = 0.0d; for (i=0; i<n; i++) { double d = data [i]; sum = sum + d; } return sum; } }
例:
CalcFunc.java
.javaファイルが保管されているディレクトリに移動します。コマンド・プロンプトで、次のコマンドを入力します:
javac
java_filename
例:
javac CalcFunc.java
コンパイラによって新しいファイルが.class拡張子で作成されるまでに、コンパイル・エラーを修正します。
例:
CalcFunc.class
Javaクラスは、JDK jarツールを使用してJARファイルにコンパイルする必要があります。
.jarファイルを作成してEssbaseサーバーにインストールするには:
.classファイルが保管されているディレクトリに移動します。コマンド・プロンプトで、次のコマンドを入力します:
jar cf jar_filename class_filename
例:
jar cf CalcFunc.jar CalcFunc.class
Essbaseサーバーを実行しているコンピュータで、.jarファイルを次のいずれかのディレクトリにコピーします(ディレクトリが存在しない場合は、作成します):
後で.jarファイルを別の場所に移動した場合は、CLASSPATH変数を変更して、.jarファイルへのフルパスとファイル名を含める必要があります。
特定のアプリケーションでのみ関数を使用する場合は、Essbaseでそのアプリケーションを再起動します。それ以外の場合は、Essbaseサーバーを再起動します。
カスタム定義関数用のJavaクラスを.jarファイルにコンパイルし、その.jarファイルをEssbaseサーバーにインストールしたら、カスタム定義関数を登録して、計算スクリプトと式で使用できるようにします。カスタム定義関数の要件を参照してください。
グローバル・カスタム定義関数を登録すると、Essbaseサーバー上のすべてのEssbaseアプリケーションでその関数を使用できます。カスタム定義関数をグローバル関数にする前に、単一のアプリケーションでその関数をテスト(およびそのアプリケーションでのみその関数を登録)します。
マクロのカタログを更新するプロセスと同じプロセスを使用して関数のカタログを更新します。カスタム定義マクロのカタログのリフレッシュを参照してください。
ローカル・スコープでカスタム定義関数を登録する場合は、アプリケーション名を接頭辞として追加します。たとえば、次のMaxLステートメントによって、CalcFuncクラスのカスタム定義関数@JSUMが、Sampleアプリケーションでのみ使用するためのローカル関数として登録されます:
create function Sample.'@JSUM' as 'CalcFunc.sum' spec '@JSUM(memberRange)' comment 'adds list of input members';
グローバル・スコープでカスタム定義関数を登録する場合は、アプリケーション名を接頭辞として追加しません。たとえば、次のMaxLステートメントによって、CalcFuncクラスのカスタム定義関数@JSUMが、Essbaseサーバー上のすべてのアプリケーションで使用するためのグローバル関数として登録されます:
create function '@JSUM' as 'CalcFunc.sum' spec '@JSUM(memberRange)' comment 'adds list of input members';
カスタム定義関数を更新する手順は、次の条件によって異なります:
通常、カスタム定義関数を更新するには、その関数のコードを含んでいる.jarファイルを置き換えて、その関数を再登録する必要があります。ただし、カスタム定義関数のシグネチャが変更されておらず、関数に1セットの入力パラメータしかない(オーバーロード・メソッドでない)場合は、関数を含んでいる.jarファイルを置き換えることができます。
注: | DBAのみによってグローバル・カスタム定義関数が更新されるようにしてください。 |
カスタム定義関数を更新するには:
カスタム定義関数の表示を参照してください。
Javaクラスをコンパイルして、前の.jarファイルと同じ名前を使用して、新しい.jarファイルにアーカイブします。
前の.jarファイルに含まれていたカスタム定義関数用の他のクラスとメソッドも含めます。
更新するカスタム定義関数の種類(ローカルまたはグローバル)に応じて、次のアクションを実行します:
ローカル: .jarファイルの関数を使用するすべてのEssbaseアプリケーションをシャットダウンします。
グローバル: すべてのEssbaseアプリケーションをシャットダウンします
どのEssbaseアプリケーションが.jarファイルのどの関数を使用するか不明な場合は、すべてのEssbaseアプリケーションをシャットダウンします。
カスタム定義関数のシグネチャが変更されていない場合は、手順8に進みます。
カスタム定義関数を表示して、関数が正常に登録されているかどうか、およびローカルとグローバルのどちらで登録されているのかを確認できます。カスタム定義関数は、作成して登録するまで表示されません。
たとえば、Sampleアプリケーションに含まれているカスタム定義関数、およびすべての登録済グローバル関数を表示するには、次のMaxLステートメントを使用します:
display function Sample;
display functionステートメントによって、アプリケーション名なしでグローバル関数がリストされ、その関数がグローバルであることが示されます。アプリケーションにグローバル関数と同じ名前の関数が含まれている場合は、ローカル関数のみがリストされます。
カスタム定義関数を削除する前に、その関数を使用している計算スクリプトまたは式がないことを確認します。グローバル・カスタム定義関数は、Essbaseサーバー全体の計算スクリプトと式で使用できるので、削除する前にこの関数を使用しているEssbaseサーバー上の計算スクリプトまたは式がないことを確認する必要があります。
注意 | Essbaseデータベースにアクセスしているユーザーがおらず、計算ルーチンが実行されていないときにのみ、グローバル・カスタム定義関数を削除してください。 |
カスタム定義関数を削除するには:
カスタム定義関数の表示を参照してください。
ローカル:
drop function Sample.'@JSUM';
グローバル:
drop function '@JSUM';
カスタム定義関数は、Essbase計算機フレームワークの拡張機能として実装されるので、カスタム定義関数の動作の効率は、Essbase計算機フレームワークにネイティブの関数よりも低いと考えられます。
パフォーマンスを最適化するため、特に計算スピードが重要となるアプリケーションにおいては、カスタム定義関数の使用は、ネイティブのEssbase計算コマンドで実行できない計算のみに限定してください。
JVM APIとJava API for XML Parsingの使用は、Essbaseを実行するために必要なメモリーに最初に影響します。これらの追加コンポーネントを実行するために必要なメモリーについては、Essbaseのメモリー要件で説明しています。Oracle Enterprise Performance Management System Installation and Configuration Guideを参照してください。
この起動メモリー要件を越えて、カスタム定義関数用に開発するJavaプログラムに追加のメモリーが必要なことがあります。起動時に、Win32オペレーティング・システム用のJVMによって、2MBのメモリーがプログラムにすぐに割り当てられます。この割当ては、JVMによって実行されるプログラムの要件に従って増加します。Win32オペレーティング・システム上のJVMに割り当てられるメモリーのデフォルトの上限値は、64MBです。Javaプログラムの実行によって、JVMのデフォルトのメモリー割当ての上限値を超えた場合、JVMによってエラーが生成されます。JVMメモリーの管理および他のオペレーティング・システムのメモリー割当ての詳細は、JDKのドキュメンテーションを参照してください。
JVMのデフォルトのメモリー要件およびサーバーを実行するハードウェアの制限を考慮して、メモリーの使用を注意深く観察します。特に、カスタム定義関数の開発者は、カスタム定義関数に大きいアーティファクトを作成するときに、JVMのメモリー制限値を超えないように注意する必要があります。