Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

$XECUTE

指定されたコマンド行を実行します。

Synopsis

$XECUTE(code,paramlist)

パラメータ

code 引用符で囲んだ文字列で指定される、有効な ObjectScript コマンド行に解決される式。コマンド行には、1 つ以上の ObjectScript コマンドを含めることができます。最後のコマンドは、引数付きの QUIT である必要があります。
paramlist オプションcode に渡すパラメータのリスト。複数のパラメータは、コンマで区切られます。

説明

$XECUTE 関数では、ユーザ記述の code を関数として実行し、渡されたパラメータを指定して値を返すことができます。code パラメータは、1 つ以上の ObjectScript コマンドを含む引用符付き文字列に評価される必要があります。code の実行は、引数を返す QUIT コマンドで完了する必要があります。Caché は、このQUIT 引数を $XECUTE の返りコード値として返します。

paramlist 引数を使用して、パラメータを code に渡すことができます。パラメータを渡す場合、code の先頭に仮パラメータ・リストが記述されている必要があります。パラメータは、位置指定されます。code に記載される仮パラメータの数は、paramlist で指定する実パラメータの数以上である必要があります。

%Library.RoutineOpens in a new tab クラスの CheckSyntax()Opens in a new tab メソッドを使用すると、code の構文チェックを実行できます。

$XECUTE の各呼び出しは、新しいコンテキスト・フレームをプロセスのコール・スタックに配置します。$STACK 特殊変数は、コール・スタックのコンテキスト・フレームの現在の番号を含みます。

$XECUTE 関数は、実質的に XECUTE コマンドと同じ処理を行います。ただし、$XECUTE 関数は後置条件や複数のコマンド行引数の使用をサポートをしないという点が異なります。$XECUTE 関数では、各実行パスが引数付きの QUIT で終了する必要があります。XECUTE コマンドでは、QUIT は不要であり、引数付きの QUIT が許可されることもありません。

パラメータ

code

引用符で囲んだ文字列で指定される、有効な ObjectScript コマンド行に評価される式。code 文字列には、最初にタブ文字、または最後に <Return> が含まれていてはなりません。文字列は、有効な ObjectScript プログラム行より長くてはなりません。code の文字列には、可能な各実行パスの最後に、引数を返す QUIT コマンドを含める必要があります。

$XECUTE がパラメータを code に渡す場合、code 文字列は仮パラメータ・リストで開始する必要があります。仮パラメータ・リストは括弧で囲み、括弧内のパラメータはコンマで区切ります。

paramlist

code に渡すパラメータのリスト。コンマ区切りリストとして指定します。paramlist の各パラメータは、code 文字列内の仮パラメータに対応する必要があります。paramlist のパラメータ数は、code に記載された仮パラメータの数以下にすることができます。

前にドットを付けることで、参照によってパラメータを渡すことができます。これは、code から値を渡すのに便利です。例は以下のようになります。詳細は、"Caché ObjectScript の使用法" の “ユーザ定義コード” の章にある "参照渡し" を参照してください。

以下の例では、$XECUTE 関数は cmdline で指定されたコマンド行を実行します。これは、num1num2 の 2 つのパラメータをこのコマンド行に渡します。

   SET cmd="(dvnd,dvsr) IF dvsr=0 {QUIT 99} ELSE {SET ^testnum=dvnd/dvsr QUIT 0}"
   SET rtn=$XECUTE(cmd,num1,num2)
   IF rtn=99
     {WRITE !,"Division by zero. ^testnum not set"}
   ELSE
     {WRITE !,"global ^testnum set to",^testnum}

以下の例では、参照渡し (.y) を使用して、code から呼び出し元のコンテキストにローカル変数値を渡します。

CubeIt
  SET x=7
  SET rtn=$XECUTE("(in,out) SET out=in*in*in QUIT 0",x,.y)
  IF rtn=0 {WRITE !,x," cubed is ",y}
  ELSE {WRITE !,"Error code=",SQLCODE}

次の例は、$XECUTE がどのように $STACK 特殊変数をインクリメントするかを示しています。この例では、$XECUTE の内部から $STACK の値を書き込むか、または $XECUTE から XECUTE コマンドを呼び出して $STACK の値を書き込みます。

StackIt
  SET stackit=$RANDOM(3)
  IF stackit=0 {GOTO StackIt}
  WRITE "initial stack level ",$STACK,!
  SET cmd="(stackit) IF stackit=1 {WRITE ""stack is "",$STACK,!  QUIT 1} "_
               "ELSEIF stackit=2 {WRITE ""stack is "",$STACK  XECUTE ""WRITE """" stack is """",$STACK,!""  QUIT 1} "_
               "ELSE { QUIT 0}"
  SET rtn=$XECUTE(cmd,stackit)
  IF rtn=1 { WRITE "return stack level ",$STACK }
  ELSE {WRITE "unexpected value: rtn=",rtn}

関連項目

FeedbackOpens in a new tab