ARGUMENT文は、OLAP DMLプログラム内で、プログラムに必要な引数を宣言します。プログラムの内部では、引数は変数や値セットと同様の構造体で格納されます。引数は、プログラムの起動時に渡された値で初期化されます。引数は、プログラムが実行されているときにのみ存在します。
ARGUMENT文はプログラム内でのみ使用され、プログラム内の実行可能な最初の行の前に指定する必要があります。ARGUMENT文のARGという省略形とARGファンクションとの区別に注意してください。
パラメータ
プログラム内で引数を参照するときに使用する名前。引数の名前をローカル変数やローカル値セットと同じ名前にすることはできません。引数の名前は、アナリティック・ワークスペース・オブジェクトの名前の指定に関するルールに従って指定します(DEFINEコマンドを参照)。
格納されるデータの種類を示す引数のデータ型。DEFINE VARIABLEの項にリストおよび説明されている任意のデータ型を指定できます。また、プログラムが引数を特定のデータ型に変換することなく受け取ることができるようにする場合、そのデータ型のWORKSHEET
を指定することもできます。
重要: 引数の型をNTEXTで宣言し、TEXT値をプログラムに渡すと、Oracle OLAPはTEXT値をNTEXTに変換します。同様に、引数の型をTEXTで宣言し、NTEXT値をプログラムに渡すと、Oracle OLAPはNTEXT値をTEXTに変換します。NTEXTをTEXTに変換すると、データが失われる可能性があります。 |
引数に指定する値のディメンションの名前。この引数にはディメンションの単一の値が保持されます。現在ディメンションに存在しない値を代入すると、エラーが発生します。
nameが値セットであることを示します。キーワードdimは、値セットにある値のディメンションを指定するキーワードです。引数の値セットは、アナリティック・ワークスペースの値セットと同様にプログラムの内部で使用できます。
使用上の注意
引数の有効期間
引数は、その引数が宣言されているプログラムが実行されているときにのみ存在します。プログラムが終了すると引数は消滅し、引数の値は失われます。したがって、引数はアナリティック・ワークスペース・オブジェクトではありません。
プログラムは、RETURN文またはSIGNAL文、あるいはプログラムの最後の行が実行されたときに終了します。プログラムがサブプログラムをコールすると、元のプログラムは一時的に停止しますが、サブプログラムが終了すると、制御は元のプログラムに戻るので、引数は存続します。自分自身を再帰的にコールするプログラムは、プログラムのコピーの実行ごとに別個の引数を保持します。
プログラムに渡される引数の宣言
プログラムに渡される引数を宣言するときは、特に注意が必要です。
値で渡される引数引数は値でプログラムに渡されます。したがって、コールされるプログラムには引数の値のみが渡され、このプログラムに関連するアナリティック・ワークスペース・オブジェクトへのアクセスは行われません。したがって、引数の値はコールされるプログラム内で変更でき、プログラムの外部の値には影響しません。引数変数や値セットは、使用しやすく初期化されたローカル変数またはローカル値セットとみなすことができます。
ファンクションに対する引数の処理プログラムをCALL文で起動するか、またはファンクションとして起動する場合は、次の2段階の処理が発生します。
指定したデータ型を確定する。コール側プログラムで指定した引数の式は、左から右に評価され、そのデータ型が識別されます。ディメンション値を表す式には、テキスト(TEXT
またはID
)、数値(INTEGER
、DECIMAL
など)またはRELATION値が使用可能です。引数の式の1つにエラーがあると、処理は停止します。
指定した各データ型と宣言したデータ型を一致させる。引数の式は、宣言された引数と、位置によって一致されます。最初の引数の式は最初に宣言された引数と一致し、2番目の引数の式は2番目に宣言された引数と一致します(以降同様)。それぞれの式は、宣言された引数の宣言されたデータ型に順次変換されます。
引数をディメンション値として宣言すると、コール側プログラムから渡される対応する値は、TEXT
またはID
(指定したディメンションの値)、数値(論理的なディメンションの位置)、RELATION(物理的なディメンションの位置)のいずれかになります。RELATIONメソッドは、対応する値として使用されたディメンション名やリレーション名を評価した結果のディメンション値がOracle OLAPによって渡される方法です。対応する値が整数以外の数値(DECIMAL
など)の場合は、論理的なディメンション位置の値に最も近いINTEGER
値に丸められます。
引数をディメンション値以外の値として宣言し、コール側プログラムから渡された対応する値がRELATION値の場合、エラーが発生します。RELATION値を渡し、それをTEXT
引数として受け取る場合は、CONVERTを使用し、プログラムの引数リストの値を変換します。
引数をディメンションの値セットとして宣言した場合は、該当するディメンションの値セットの名前のみが引数として使用されます。
最初または2番目の段階でエラーが発生した場合、プログラムは実行されません。
コマンドに対する引数の処理引数をカッコで囲まずに独立型のコマンドとしてプログラムを起動すると、各引数は宣言された引数と、位置によって一致されます。コールされるプログラムは、指定した引数を宣言した引数として参照するか、またはARG (n)、ARGSおよびARGFR (n)の各ファンクションを介して参照します。この場合、引数は値ではなくテキスト文字列として渡されます。
余分な引数コール側プログラムで指定した引数の数が、コールされるプログラムで宣言されている引数の数より多い場合、コール側プログラムで指定された余分な引数は無視されます。コール側プログラムで指定した引数の数が、コールされるプログラムで宣言されている引数の数より少ない場合、コールされるプログラムで宣言されている余分な引数にはNA
値が代入されます。
アナリティック・ワークスペース・オブジェクトの名前と重複する引数名
通常、引数にアナリティック・ワークスペース・オブジェクトと同じ名前を指定すると、プログラムの内部では、アナリティック・ワークスペース・オブジェクトではなく、引数が参照されます。このルールの例外が発生するのは、参照される文に対して、アナリティック・ワークスペース・オブジェクトが引数として必要な場合のみです。
例
例9-44 ユーザー定義ファンクションへの引数の受渡し
GETファンクションにユーザーが入力した内容を確認する場合、複雑になる可能性があります。通常の方法では、次のようなコード行が必要です。
SHOW GET(INT VERIFY VALUE GT 0 AND VALUE LT 100 - IFNOT 'The value must be between 1 and 100')
ユーザー定義ファンクションを作成すると、GET式を単純化できます。たとえば、次のプログラムをファンクションとして使用すると、0
から100
の値を調べることができます。
DEFINE verit PROGRAM BOOLEAN PROGRAM ARGUMENT uservalue INT TRAP ON haderror NOPRINT IF uservalue GT 100 THEN SIGNAL toobig 'The value must be 100 or smaller.' ELSE IF uservalue LT 0 THEN SIGNAL toosmall 'The value must be 0 or greater.' RETURN TRUE haderror: RETURN FALSE END
次のGET式では、verit
ファンクションを使用しています。
SHOW GET(INT VERIFY VERIT(VALUE) IFNOT ERRORTEXT)
例9-45 複数の引数の受渡し
product.rpt
プログラムで、レポートのデータ列の列幅を指定する2番目の引数を指定するとします。product.rpt
プログラムでは、2番目のARGUMENT文を追加して、COLWIDTHオプションの値の設定で使用するINTEGER
引数を宣言します。
ARGUMENT natext TEXT ARGUMENT widthamt INTEGER NASPELL = natext COLWIDTH = widthamt
8文字の列を指定するには、次の文を使用してproduct.rpt
プログラムを実行します。
CALL product.rpt ('Missing' 8)
product.rpt
プログラムに3番目の引数として製品の名前が必要な場合は、製品の引数を処理するためにproduct.rpt
プログラムに3番目のARGUMENT文を追加し、この引数を使用してproduct
ディメンションのステータスを設定します。
ARGUMENT natext TEXT ARGUMENT widthamt INTEGER ARGUMENT rptprod PRODUCT NASPELL = natext COLWIDTH = widthamt LIMIT product TO rptprod
次の文を使用してproduct.rpt
プログラムを実行します。
CALL product.rpt ('Missing' 8 'TENTS')
この例では、アナリティック・ワークスペース内のすべてのディメンションの値が大文字で指定されていることを前提に、3番目の引数を大文字で指定しています。
例9-46 ARGUMENT文の使用
product.rpt
というプログラムを作成しているとします。product.rpt
プログラムはレポートを生成するプログラムなので、このレポート生成プログラムに、NA値としてレポートに表示するテキストを指定する引数を指定します。product.rpt
プログラムで、宣言された引数natext
をARGUMENT文で使用し、引数として指定した値にNASPELLオプションを設定します。
ARGUMENT natext TEXT NASPELL = natext
Missing
をNA値のテキストとして指定するには、次の文を実行します。
CALL product.rpt ('Missing')
この例では、一重引用符で囲まれたリテラル・テキストによって、テキスト引数の値が指定されます。ただし、次の例で示すように、その他のテキスト式も同様に機能します。
DEFINE natemp VARIABLE TEXT TEMP natemp = 'Missing' CALL product.rpt (natemp)
例9-47 式のテキストの受渡し
REPORT文が記述されたcustom.rpt
というプログラムがあり、このプログラムを使用して、式の値(sales - expense
など)と個々の変数も表示するとします。
custom.rpt 'sales - expense'
式は必ず一重引用符で囲んでください。この式には記号(マイナス記号)が含まれているため、式全体が1つの引数であることを示すために引用符が必要です。
custom.rpt
プログラムでは、次の文を使用してこの式のレポートを生成できます。
ARGUMENT rptexp TEXT REPORT &rptexp
アンパサンド置換を使用して複数のディメンション値を渡す例は、例10-18「LIMITでのアンパサンド置換の使用」を参照してください。
例9-48 ワークスペース・オブジェクト名とキーワードの受渡し
引数として指定されている変数のレポートを生成し、別の引数で指定した順序でproduct
ディメンションをソートするsales.rpt
というプログラムを作成するとします。次の文を実行することによって、sales.rpt
プログラムを実行します。
sales.rpt units d
sales.rpt
プログラムでは、次の文を使用します。
ARGUMENT varname TEXT ARGUMENT sortkey TEXT SORT product &sortkey &varname REPORT &varname
引数の置換後、次の文をsales.rpt
プログラムで実行します。
SORT product D units REPORT units