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?

KILL

変数を削除します。

Synopsis

KILL:pc killargument,...
K:pc killargument,...

killargument には、以下を指定できます。

variable,...

(variable,...)

引数

pc オプション — 後置条件式。
variable オプション — 変数名、またはコンマで区切られた変数名のリスト。括弧なし : 削除される変数。括弧付き :削除されない変数。

概要

KILL コマンドには、以下の 3 つの形式があります。

  • KILL 引数なし (引数なしの KILL と呼ばれる)

  • KILL 変数リスト付き (包含的 KILL と呼ばれる)

  • KILL 括弧で囲まれた変数リスト付き (排他的 KILL と呼ばれる)

引数なしの KILL コマンドは、すべてのローカル変数を削除します。このコマンドは、プロセス・プライベート・グローバル、グローバル、またはユーザ定義の特殊変数を削除しません。

引数として変数またはコンマ区切りの変数リストを持つ KILL

KILL variable,...

は、包含的 KILL と呼ばれます。これは、引数で指定した変数だけを削除します。変数を削除すると、指定された変数よりも低いレベルにあるその変数の添え字すべてが削除されます。変数は、ローカル変数、プロセス・プライベート変数、またはグローバルのいずれかです。これらは、実際の定義済み変数である必要はありませんが、有効な変数名でなければなりません。その値がユーザ指定されている場合でも、特殊変数を削除できません。変更を試みると、<SYNTAX> エラーが生成されます。

引数として括弧に囲まれた変数、またはコンマ区切りの変数リストを持つ KILL

KILL (variable,...)

は、排他的 KILL と呼ばれます。これは、引数で指定したローカル変数以外の、すべてのローカル変数を削除します。指定できる変数は、ローカル変数のみです。添え字の付いた変数を指定することはできません。ローカル変数を指定することで、変数およびその添え字すべてが保持されます。指定したローカル変数は、実際の定義済み変数である必要はありませんが、有効なローカル変数名でなければなりません。

Note:

KILL は、Caché オブジェクトによって生成されたローカル変数を削除します。したがって、システム構造 (%Save で現在使用されている %objTX など) や、システム・オブジェクト (ストアド・プロシージャ・コンテキスト・オブジェクトなど) に影響を与える可能性があるコンテキストで、引数なしの KILL や排他的 KILL を使用してはなりません。大半のプログラミング・コンテキストでは、KILL のこの形式は使用されません。

$DATA 関数を使用することで、変数が定義済みであるか未定義であるか、および定義済み変数に添え字があるかを確認できます。変数を削除すると、その $DATA のステータスが未定義に変わります。

変数を削除するために KILL を使用すると、ローカル変数の格納領域を解放します。現在のプロセスの最大格納領域 (KB 単位) を判別、または設定するには、$ZSTORAGE 特殊変数を使用します。現在のプロセスの使用可能な格納領域 (KB 単位) を判別するには、$STORAGE 特殊変数を使用します。

引数

pc

オプションの後置条件式。Caché は、後置条件式が True (0 以外の数値) の場合に KILL コマンドを実行します。Caché は、後置条件式が False (0 に評価される) の場合はコマンドを実行しません。詳細は、"Caché ObjectScript の使用法" の "コマンド後置条件式" を参照してください。

variable

括弧で囲まれていない場合 :KILL コマンドによって削除される変数。variable は単一の変数、またはコンマで区切られた変数のリストです。

括弧で囲まれている場合 :KILL コマンドで削除されないローカル変数。KILL コマンドは、それ以外のすべてのローカル変数を削除します。variable は単一の変数、またはコンマで区切られた変数のリストです。

以下の例では、包含的 KILL が、ローカル変数 ab、および d を削除し、プロセス・プライベート・グローバル ^||ppglob およびその添え字すべてを削除します。他の変数には影響はありません。

   SET ^||ppglob(1)="fruit"
   SET ^||ppglob(1,1)="apples"
   SET ^||ppglob(1,2)="oranges"
   SET a=1,b=2,c=3,d=4,e=5
   KILL a,b,d,^||ppglob
   WRITE "a=",$DATA(a)," b=",$DATA(b)," c=",$DATA(c)," d=",$DATA(d)," e=",$DATA(e),!
   WRITE "^||ppglob(1)=",$DATA(^||ppglob(1)),
         " ^||ppglob(1,1)=",$DATA(^||ppglob(1,1)),
         " ^||ppglob(1,2)=",$DATA(^||ppglob(1,2))

以下の例では、包含的 KILL がローカル変数 a(1) およびその添え字 a(1,1)a(1,2) および a(1,1,1) を削除します。ローカル変数 aa(2)、および a(2,1) は削除されません。

   SET a="food",a(1)="fruit",a(2)="vegetables"
   SET a(1,1)="apple",a(1,1,1)="mackintosh",a(1,2)="banana"
   SET a(2,1)="artichoke"
   WRITE "before KILL:",!
   WRITE $DATA(a)," ",$DATA(a(1))," ",$DATA(a(1,1))," ",$DATA(a(1,1,1))," ",
         $DATA(a(2))," ",$DATA(a(2,1)),!
   KILL a(1)
   WRITE "after KILL:",!
   WRITE $DATA(a)," ",$DATA(a(1))," ",$DATA(a(1,1))," ",$DATA(a(1,1,1))," ",
         $DATA(a(2))," ",$DATA(a(2,1))

以下の例では、排他的 KILL が変数 d および e 以外のローカル変数をすべて削除します。

   SET a=1,b=2,c=3,d=4,e=5
   KILL (d,e)
   WRITE "a=",$DATA(a)," b=",$DATA(b)," c=",$DATA(c)," d=",$DATA(d)," e=",$DATA(e)

排他的 KILL がオブジェクト変数を削除するので、上記のプログラムはターミナル・セッションから作動しますが、オブジェクト・メソッド内部では作動しないということに注意してください。

以下の例では、包含的 KILL が 2 つプロセス・プライベート・グローバルを削除し、排他的 KILL が変数 d および e 以外のローカル変数をすべて削除します。

   SET ^||a="one",^||b="two",^||c="three"
   SET a=1,b=2,c=3,d=4,e=5
   KILL ^||a,^||c,(d,e)
   WRITE "a=",$DATA(a)," b=",$DATA(b)," c=",$DATA(c)," d=",$DATA(d)," e=",$DATA(e),!
   WRITE "^||a=",$DATA(^||a)," ^||b=",$DATA(^||b)," ^||c=",$DATA(^||c)

メモ

KILL とオブジェクト

オブジェクト・インスタンス参照 (OREF) は、参照カウントを自動的に維持管理します。参照カウントとは、現在オブジェクトを参照している項目の数です。SET コマンドでオブジェクトを参照する変数やオブジェクトのプロパティを設定するたびに、オブジェクトの参照カウントは自動的にインクリメントされます。KILL コマンドで変数を削除すると、対応するオブジェクト参照カウントはデクリメントされます。この参照カウントが 0 になると、オブジェクトは自動的に消滅します (メモリから削除されます)。オブジェクト参照カウントは、SET コマンドで変数に新しい値が設定されたときや、変数が範囲外になったときもデクリメントされます。

永続オブジェクトの場合は、オブジェクトに対する変更を保存したければ、メモリからオブジェクトを削除する前に %Save()Opens in a new tab メソッドを呼び出します。%Delete()Opens in a new tab メソッドは、Caché オブジェクトの格納されたものを削除します。メモリ内のオブジェクトは削除しません。

OREF の詳細は、"Caché オブジェクトの使用法" の “OREF の基本” を参照してください。

Caché バージョン 5 以前では、%Close() メソッドはメモリからオブジェクトを削除するために使用されていました。Caché バージョン 5 およびそれ以降では、%Close() メソッドは何も実行せず、常に正常終了することができます。新規のコードを記述するときは、%Close() を使用しないでください。

オブジェクト・メソッドを使用した KILL

KILL 式の左側でオブジェクト・メソッドを指定できます。以下の例では %Get() メソッドを指定しています。

  SET obj=##class(test).%New()  // Where test is class with a multidimensional property md
  SET myarray=[(obj)]
  SET index=0,subscript=2
  SET myarray.%Get(index).md(subscript)="value"
    WRITE $DATA(myarray.%Get(index).md(subscript)),!
  KILL myarray.%Get(index).md(subscript)
    WRITE $DATA(myarray.%Get(index).md(subscript))

包含的 KILL

包含的 KILL は、明示的に指定された変数だけを削除します。ローカル変数、プロセス・プライベート・グローバル、およびグローバルを含むリストを指定できます。また、添え字なしと添え字付きの、どちらの変数も指定できます。グローバル変数を削除できるのは、包含的 KILL だけです。

KillRange()Opens in a new tab メソッドを使用することで、添え字付きのグローバル変数の範囲を削除できます。

排他的 KILL

排他的 KILL は、明示的に指定された変数を除く、すべてのローカル変数を削除します。リストされた名前はコンマで区切られます。括弧は必須です。

例外リストに含むことができるのは、ローカルの添え字なしの変数名だけです。例えば、複数の添え字ノードを持つ fruitbasket という名前のローカル変数配列がある場合、KILL (fruitbasket) を指定することで、ローカル変数配列全体を保持することができます。排他的 KILL を使用して、個別の添え字ノードを選択的に保持することはできません。排他的リストでは、プロセス・プライベート・グローバル、グローバル、または特殊変数を指定できません。これらの変数を指定しようとすると、<SYNTAX> エラーが返されます。例外リストで指定されていないローカル変数は削除されます。以降このような変数を参照すると、<UNDEFINED> エラーが返されます。排他的 KILL は、プロセス・プライベート・グローバル、グローバル、または特殊変数に対して効力がありません。しかし、システム・オブジェクトによって生成されたローカル変数を削除することはできます。

KILL を配列で使用する

包含的 KILL を使用して、配列全体、または配列内の選択したノードだけを削除できます。指定された配列は、ローカル変数、プロセス・プライベート・グローバル、またはグローバル変数のいずれかです。

  • ローカル変数配列を削除するには、KILL のいずれの形式を使用することもできます。

  • ローカル変数配列内の選択されたノードを削除するには、包含的 KILL を使用しなければなりません。

  • グローバル変数配列を削除するには、包含的 KILL を使用しなければなりません。

  • グローバル変数配列内の選択されたノードを削除するには、包含的 KILL を使用しなければなりません。

添え字ノード付きのグローバル変数に関する詳細は、"Caché グローバルの使用法" の "グローバル構造" を参照してください。

配列は、包含的 KILL にその名前を指定するだけで削除できます。例えば以下のコマンドでは、グローバル配列 ^fruitbasket とその従属ノードすべてを削除します。

   SET ^fruitbasket(1)="fruit"
   SET ^fruitbasket(1,1)="apples"
   SET ^fruitbasket(1,2)="oranges"
   WRITE "Before KILL:",!
   WRITE "^fruitbasket(1)=",$DATA(^fruitbasket(1)),
         " ^fruitbasket(1,1)=",$DATA(^fruitbasket(1,1)),
         " ^fruitbasket(1,2)=",$DATA(^fruitbasket(1,1)),!
   KILL ^fruitbasket
   WRITE "After KILL:",!
   WRITE "^fruitbasket(1)=",$DATA(^fruitbasket(1)),
         " ^fruitbasket(1,1)=",$DATA(^fruitbasket(1,1)),
         " ^fruitbasket(1,2)=",$DATA(^fruitbasket(1,1))

配列ノードを削除するには、適切な添え字を指定します。例えば以下の KILL コマンドは、添え字 1、および 2 のノードを削除します。

   SET ^fruitbasket(1)="fruit"
   SET ^fruitbasket(1,1)="apples"
   SET ^fruitbasket(1,2)="oranges"
   SET ^fruitbasket(1,2,1)="navel"
   SET ^fruitbasket(1,2,2)="mandarin"
   WRITE ^fruitbasket(1)," contains ",^fruitbasket(1,1),
         " and ",^fruitbasket(1,2),!
   WRITE ^fruitbasket(1,2)," contains ",^fruitbasket(1,2,1),
         " and ",^fruitbasket(1,2,2),!
   KILL ^fruitbasket(1,2)
   WRITE "1st level node: ",$DATA(^fruitbasket(1)),!
   WRITE "2nd level node: ",$DATA(^fruitbasket(1,1)),!
   WRITE "Deleted 2nd level node: ",$DATA(^fruitbasket(1,2)),!
   WRITE "3rd level node under deleted 2nd: ",$DATA(^fruitbasket(1,2,1)),!
   QUIT

配列ノードを削除すると、自動的にそのノードに従属するノードすべてと、削除されたノードへのポインタだけを含んでいた直前のノードがすべて削除されます。検出されたノードがその配列の唯一のノードである場合は、ノードと共に配列自体も削除されます。

複数のローカル変数配列を削除するには、上述のとおり、KILL の包含形式と排他形式の両方を使用できます。例えば以下のコマンドは、array1 および array2 を除く、すべてのローカル配列を削除します。

   KILL (array1,array2)

複数の配列ノードを削除するには、KILL の包含形式だけしか使用できません。例えば以下のコマンドは、各配列から 1 ノードを削除しながら、指定された 3 つのノードを削除します。

   KILL array1(2,4),array2(3,2),array3(1,7)

ノードは同じ配列内でも、他の配列内でもかまいません。

ZKILL コマンドを使用して、指定されたローカル、あるいはグローバル配列ノードを削除する場合もあります。KILL とは異なり、ZKILL は指定されたノードのすべての従属ノードを削除することはできません。

パラメータ渡しを行う KILL の効果

パラメータを渡す場合、値は、外部関数、または DO コマンドで呼び出されるサブルーチンに渡されます。外部関数またはサブルーチンに渡される値は、実パラメータ・リストと呼ばれるコンマで区切られたリストで指定します。指定されたそれぞれの値は、その位置に従って、外部関数またはサブルーチンで定義されている仮パラメータ・リストの対応する変数にマップされます。

実パラメータ・リストの指定方法に従って、パラメータ渡しは、または参照のいずれかによる方法で行われます。この 2 つのパラメータ渡しの方法の詳細は、"Caché ObjectScript の使用法" の "パラメータ渡し" を参照してください。

仮パラメータ・リストの変数に KILL を実行すると、それが値によって渡されていたか、参照によって渡されていたかによって結果が異なります。

値によって変数の受け渡しを行っている場合は、以下のようになります。

  • 仮リストの変数に KILL を実行しても、呼び出される関数やサブルーチンのコンテキストの外部には影響はありません。これは、関数またはサブルーチンが呼び出されるときに、Caché が自動的にその時点の対応する実変数の値を保存しているからです。関数、またはサブルーチンを終了すると、保存された値が自動的に復元されます。

以下の値による受け渡しの例では、Subrt1 で実行する KILL によって、仮変数 x は削除されますが、実変数 a は影響を受けません。

Test
    SET a=17
    WRITE !,"Before Subrt1 a: ",$DATA(a)
    DO Subrt1(a)
    WRITE !,"After Subrt1 a: ",$DATA(a)
    QUIT
Subrt1(x)
    WRITE !,"pre-kill x: ",$DATA(x)
    KILL x
    WRITE !,"post-kill x: ",$DATA(x)
    QUIT

参照によって変数の受け渡しを行っている場合は、以下のようになります。

  • 参照による受け渡しを行っている場合、仮リストの変数を包含して KILL を実行すると、対応する実変数にも KILL が実行されます。関数またはサブルーチンが終了すると、実変数も存在しなくなります。

  • 仮リストの変数を除外して KILL を実行すると、参照により受け渡された仮変数と実変数は共に保存されます。

以下の参照による受け渡しの例では、Subrt1 で実行する KILL によって、仮変数 x と実変数 a の両方が削除されます。

Test
    SET a=17
    WRITE !,"Before Subrt1 a: ",$DATA(a)
    DO Subrt1(.a)
    WRITE !,"After Subrt1 a: ",$DATA(a)
    QUIT
Subrt1(&x)
    WRITE !,"pre-kill x: ",$DATA(x)
    KILL x
    WRITE !,"post-kill x: ",$DATA(x)
    QUIT

一般的には、仮パラメータ・リストに指定されている変数に KILL を実行すべきではありません。Caché は、パラメータ渡し (値による場合でも、参照による場合でも) を使用する関数、またはサブルーチンに遭遇すると、仮リストのそれぞれの変数に対して、暗黙の NEW コマンドを実行します。Caché は、関数またはサブルーチンを終了すると、仮リストのそれぞれの変数に対して、今度は暗黙の KILL コマンドを実行します。参照による受け渡しを使用する仮変数の場合は、KILL を実行する前に、(仮変数に対して行われた変更を反映するために) 対応する実変数を更新します。

トランザクション処理

グローバル変数の KILL は現在のトランザクションの一部としてジャーナリングされます。このグローバル変数の削除は、トランザクションのロールバックの際にロールバックされます。ローカル変数またはプロセス・プライベート・グローバル変数の KILL はジャーナリングされません。したがって、この変数の削除はトランザクション・ロールバックの影響を受けません。

関連項目

FeedbackOpens in a new tab