VARYING 属性と VARYINGZ 属性は、変数の長さが 0 から宣言済み 最大長までの範囲の可変長であることを指定します。 NONVARYING は、宣言した長さと等しい長さを常に持つ変数を指定します。
VARYING ストリングに割り振られるストレージは、宣言した長さよりも 2 バイト長くなります。 最左端の 2 バイトには、ストリングの現在長が入ります。
VARYINGZ 文字ストリングに割り振られたストレージは、宣言した長さよりも 1 バイト長くなります。 ストリングの現在長は、それに割り振られたストレージの 最初の '00'x の前にあるバイト数に等しくなります。
VARYINGZ GRAPHIC ストリングに割り振られるストレージは、 宣言した長さよりも 2 バイト長くなります。 ストリングの現在長は、それに割り振られたストレージの 最初の '0000'gx の前にあるバイト数に等しくなります。
VARYINGZ WIDECHAR ストリングに割り振られるストレージは、 宣言した長さよりも 2 バイト長くなります。 ストリングの現在長は、それに割り振られたストレージの 最初の '0000'wx の前にあるバイト数に等しくなります。
VARYINGZ 属性は BIT ストリングには使用できません。
下記の DECLARE ステートメントで、User と Zuser は、 最大長が 15 の可変長文字データを表しています。 ただし、User とは異なり、 Zuser は NULL 終止です。 割り振られたストレージは、User の場合は 17 バイトであり、 Zuser の場合は 16 バイトです。
declare User character (15) varying; declare Zuser character (15) varyingz;
User と Zuser の長さは、 それぞれの時点でそれぞれに割り当てられるデータ項目の長さとなります。 MAXLENGTH 組み込み関数および LENGTH 組み込み関数を使用すると、 それぞれ宣言した長さと現在長を判別することができます。
VARYINGZ ストリング中の NULL 終止符は、ストリングの長さを判別する場合を除いては、 比較または割り当てには使用されません。 したがって、下記の宣言によるストリングの内部 16 進表示は同じですが、 比較すれば等しくはなりません。
declare A char(4) nonvarying init( ('abc' || '00'x) );
declare B char(3) varyingz init( 'abc' );それとは反対に、次の例では、Z と C は等しいものとして比較されます。
dcl Z char(3) nonvarying init('abc');
dcl C char(3) varyingz init('abc');
VARYING と VARYINGZ ストリングは、アスタリスクの長さを持つ パラメーターとして受け渡しできます。 それらが NONASSIGNABLE 属性を持っている場合、 記述子なしで渡すことができます。