ヘッダーをスキップ
Oracle® OLAP DMLリファレンス
11gリリース2 (11.2)
B61346-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

CALL

CALLコマンドは、プログラムを起動するコマンドです。プログラムに引数が指定されている場合、これらの引数は必ずカッコで囲まれており、コールされるプログラムに渡されます。

構文

CALL program-name [(arg ...)]

パラメータ

program-name

コールされるプログラムの名前。

arg

コールされるプログラムに必要な1つ以上のオプションの引数。これらの引数は、コールされるプログラムでARGUMENTを使用して宣言するか、またはARGを使用して参照します。プログラムにARGUMENT文が使用されている場合は、CALLを使用してプログラムを起動する際に、コールされるプログラムで宣言されている引数の順序と一致するように引数を指定します。

使用上の注意

ディメンションの引数

ディメンションの値やディメンション名を引数として渡す場合は、'Jan96'のように、正確なテキスト値を一重引用符で囲む必要があります。プログラムの引数をARGUMENT文で宣言する場合は、テキスト値を評価するテキスト式を渡すことができます。

プログラムの戻り値

値を返すプログラムをCALLを使用して起動した場合、戻り値は廃棄されます。プログラムがファンクションまたはコマンドとして起動されたか、またはCALLを使用して起動されたかを判別するには、そのプログラムにCALLTYPEファンクションを使用します。

ARGUMENTコマンドまたはARGファンクション

コールされるプログラムでは、ARGUMENT文またはARGファンクションのいずれかを使用して引数を処理できます。CALLによって起動したプログラムやファンクションとして起動したプログラムでは、ARGSファンクションおよびARGFRファンクションは、必ずNAを返します。

引数がARGUMENT文で宣言されていないプログラムをCALLによって起動した場合、渡された引数はARGファンクションを使用して参照します。ただし、ARGファンクションはテキストを処理するファンクションなので、渡された引数はすべてテキスト値として解釈します。NTEXT引数を渡す場合は、ARGではなく、必ずARGUMENTを使用してNTEXT引数を宣言してください。ARGを使用すると、NTEXT引数はTEXTに変換され、NTEXTの値がデータベースのキャラクタ・セットで表現できないと、データが失われる可能性があります。

ARGUMENT文の処理

プログラムをCALL文を使用して起動するか、またはファンクションとして起動する場合は、次の2段階の処理が発生します。いずれかの段階でエラーが発生した場合、プログラムは実行されません。

  1. 指定したデータ型を確定する。コール側プログラムで指定した引数の式は、左から右に評価され、そのデータ型が識別されます。ディメンション値を表す式には、テキスト(TEXTまたはID)、数値(INTEGERDECIMALなど)またはRELATION値が使用可能です。引数の式の1つにエラーがあると、処理は停止します。

  2. 指定した各データ型と宣言したデータ型を一致させる。引数の式の順序は、コールされるプログラムで宣言された引数の順序と一致します。最初の引数の式は最初に宣言された引数変数と一致し、2番目の引数の式は2番目に宣言された引数変数と一致します(以降同様)。それぞれの式は、引数変数の宣言されたデータ型に順次変換されます。

引数変数をディメンション値として宣言すると、コール側プログラムから渡される対応する値は、指定したディメンションの値を表すTEXTまたはID、論理的なディメンションの位置を表す数値、物理的なディメンションの位置を表すRELATIONのいずれかになります。対応する値が整数以外の数値(DECIMALなど)の場合は、論理的なディメンション位置を表す最も近いINTEGER値に丸められます。

引数変数をディメンション値以外の値として宣言し、コール側プログラムから渡された対応する値がRELATION値の場合、エラーが発生します。RELATION値を渡し、それをTEXT引数として受け取る場合は、CONVERTファンクションを使用し、プログラムの引数リストの値を変換します。

余分な引数を持つARGUMENT文

コール側プログラムで指定した引数の数が、コールされるプログラムで宣言されている引数の数より多い場合、コール側プログラムで指定した余分な引数は無視されます。コール側プログラムで指定した引数の数が、コールされるプログラムで宣言されている引数の数より少ない場合、コールされるプログラムで宣言されている余分な引数変数にはNA値が代入されます。

値で渡されるARGUMENT文

ARGUMENT文を使用して引数を宣言すると、引数は値でプログラムに渡されます。したがって、コールされるプログラムには引数ののみが渡され、このプログラムに関連するアナリティック・ワークスペース・オブジェクトへのアクセスは行われません。ただし、アナリティック・ワークスペース・オブジェクトの名前を一重引用符で囲んだ引数として指定した場合は、アナリティック・ワークスペース・オブジェクトの値は渡されません。そのかわりに、このオブジェクトの名前がテキスト文字列として渡されます。例9-59「プログラムまたはファンクションのコール」を参照してください。

例9-59 プログラムまたはファンクションのコール

この例では、2つのプログラムroundup.proundup.fを様々な方法で使用してデータを評価し、出力を生成する例を示します。

roundup.pプログラムには、10進変数の名前をテキスト文字列として使用し、この変数の値を近似値のINTEGERに丸めた値のレポートを生成します。roundup.fプログラムにも10進変数の名前を使用できます。ただし、変数の名前をテキスト文字列として渡すかわりに、変数の値を引数として渡します。roundup.fでは、レポートは生成されません。そのかわりに、10進変数のそれぞれの値が、近似値のINTEGERに丸められて返されます。

roundup.pプログラムはCALLによって起動し、REPORT文が記述されています。これとは対照的に、roundup.fは、戻り値がREPORT文への引数として使用されるユーザー定義ファンクションとして起動します。

roundup.pプログラムでは、テキスト引数を宣言するためにARGUMENTを使用します。roundup.pを起動すると、このプログラムでは引数が10進変数の名前として使用されます。コール側プログラムでは、コールされるプログラムがディメンション化された変数のすべての値にアクセスできるようにするために、変数の名前を渡します。コール側プログラムが変数の名前ではなく変数自体を渡した場合は、コールされるプログラムがアクセスできる値は1つに限定されます。このプログラムからは値は返されず、レポートが生成されます。

DEFINE roundup.p PROGRAM INTEGER
PROGRAM
ARGUMENT varname TEXT
Report Down Line Across Month: Heading 'VARNAME' -
   IF INTPART(&varname) EQ &varname -
   THEN &varname ELSE INTPART(&varname) + 1 
END

次の文

LIMIT division TO 1
LIMIT month TO 1 TO 4
DECIMALS = 0
CALL roundup.p('actual')

生成されるレポートは、次のとおりです。

DIVISION: CAMPING
               ----------------- Varname------------------
               -------------------MONTH-------------------
LINE             Jan95      Feb95      Mar95      Apr95
-------------- ---------- ---------- ---------- ----------
revenue           533,363    572,797    707,198    968,858
cogs              360,811    400,902    478,982    641,716
gross.margin      172,553    171,895    228,217    327,143
marketing          37,370     38,867     51,224     69,439
selling            89,008     86,458    102,233    139,567
r.d                24,308     23,400     39,943     57,186
opr.income         21,868     23,171     34,819     60,952
taxes              15,971     16,320     23,030     27,584
net.income          5,898      6,851     11,789     33,368

同じレポートを生成するにはこれ以外にも、REPORT文への引数として使用できるユーザー定義ファンクションとして次のようなroundup.fというプログラムを作成するという方法があります。

DEFINE roundup.f PROGRAM INTEGER
PROGRAM
ARGUMENT realval DECIMAL
IF realval EQ INTPART(realval)
THEN RETURN INTPART(realval)
ELSE RETURN INTPART(realval) + 1
END

次の文

LIMIT division TO 1
LIMIT month TO 1 TO 4
DECIMALS = 0
REPORT DOWN line ACROSS month: roundup.f(actual)

生成されるレポートは、次のとおりです。

DIVISION: CAMPING
               ------------ ROUNDUP.F(ACTUAL)-------------
               -------------------MONTH-------------------
LINE             Jan95      Feb95      Mar95      Apr95
-------------- ---------- ---------- ---------- ----------
revenue           533,363    572,797    707,198    968,858
cogs              360,811    400,902    478,982    641,716
gross.margin      172,553    171,895    228,217    327,143
marketing          37,370     38,867     51,224     69,439
selling            89,008     86,458    102,233    139,567
r.d                24,308     23,400     39,943     57,186
opr.income         21,868     23,171     34,819     60,952
taxes              15,971     16,320     23,030     27,584
net.income          5,898      6,851     11,789     33,368 

(roundup.fプログラムをroundup.pプログラムと比較してください。roundup.fからは値が返されますが、レポートは生成されません。)