Page History
...
このセクションでは、以下におけるSQL Nullフィールドの動作について説明します。
ここでの説明では、以下のフィールド定義を使用します。
| Code Block |
|---|
Define Field(#A) Type(*DEC) Length(9) Decimals(0) Input_Atr(ASQN) Default(*SQLNULL) Define Field(#B) Type(*DEC) Length(9) Decimals(0) Input_Atr(ASQN) Default(*SQLNULL) Define Field(#C) Type(*DEC) Length(9) Decimals(0) Default(*NULL) |
次のトピックも参照してください。
ASQN (Allow SQL Nulls: SQL Nullを許可) 属性
| Anchor | ||||
|---|---|---|---|---|
|
| Info |
|---|
SQL Nullフィールドが割り当てのためのANSI規則により確実に処理されるようにする場合は、*STRICT_NULL_ASSIGN関数オプションを使用可能にします。このオプションでは、ソース・フィールドがSQL Nullで、ターゲット・フィールドにASQN属性が設定されていない場合は、実行時に致命的なエラーが発生します。 |
...
ターゲット・フィールドにASQN属性が設定されていない場合は、*STRICT_NULL_ASSIGN関数オプションが使用可能にされるかどうかによって動作が異なります。デフォルトでは、フィールド・タイプの*NULL値はターゲット・フィールドに割り当てられます。次の例では、#Cが数値フィールドなのでゼロに設定されます。フィールド・タイプごとの*NULL valueの定義については、「CHANGE Parameters」を参照してください。valueの定義については、「CHANGE のパラメータ」を参照してください。
| Code Block |
|---|
#C := #B |
ただし、*STRICT_NULL_ASSIGNが有効にされ、#BがSQL Nullである場合に上のサンプル・コードが実行されると、ターゲット・フィールドがSQL Nullの設定をサポートしないため致命的なエラーが発生します。LANSA開発者は、*STRICT_NULL_ASSIGNを使用する場合は、この種の実行時エラーを出さないように注意深くコーディングする必要があります。例えば、以下のようになります。
...
| Code Block |
|---|
#C := #B.AsValue( 1 ) * 5 |
次のトピックも参照してください。
| Anchor | ||||
|---|---|---|---|---|
|
- SQL Nullかどうかを検査するには、*IS *SQLNULLまたは*ISNOT *SQLNULL、あるいはSQLNULL、あるいは 組み込みプロパティ.IsSqlNull を使用してください。 を使用してください。
- IF_NULLまたは.IsNullを使用すると、SQL NullフィールドはFALSEを返します。
- SQL Nullは値を表さないため、フィールドを比較するために*EQ、*LE、*GTなどの比較演算子を使用し、比較のいずれかの要素がSQL Nullの場合は、比較によってSQL Nullが生成されます。また、*ORまたは*AND演算子と組み合わせると、SQL Null要素により引き続きSQL Nullが生成されます。SQL Nullを生成する条件式の評価結果はfalseになります。
SQLNULL値がtrueの場合、SQLNULLの比較は常にSQLNULLのままになります。すなわち、式によってSQLNULLを検査する場合にSQLNULLが存在すると、式ではSQLNULL値が維持されます。このような場合は、*ORIFブール機能を使用してください。
Code Block IF COND((#DATE2.IsSqlNull) *orif (#DATE1 *gt #DATE2)) #DATE2 := #DATE1 ENDIF
条件によってNullおよびSQL Nullの両方に対してTRUEが返されるようにするには、*ORIFブール機能と、組み込みプロパティ.IsSqlNull および組み込みプロパティ および組み込みプロパティ .IsNull を組み合わせて使用します。サンプル・フィールド#Aについての次の条件は、フィールドがゼロまたはSQL Nullの場合にTRUEを返します。
Code Block (#A.IsSqlNull) *orif (#A.IsNull)
条件にSQL Nullと他の特定の値の両方にTRUEを返させる場合はNullと他の特定の値の両方にTRUEを返させる場合は 組み込みメソッド.AsValue を使用します。次の条件は、フィールドが1またはSQL を使用します。次の条件は、フィールドが1またはSQL Nullの場合にTRUEを返します。
Code Block #A.AsValue(1) *EQ 1
...
条件 | 結果 |
|---|---|
#A.IsSqlNull | TRUE |
#A.IsNull | FALSE |
(#A.IsSqlNull) *orif (#A.IsNull) | TRUE |
IF_NULL(#A #B #C) | FALSE |
IF_NULL(#C) | TRUE |
#A.AsValue(*ZERO) *EQ *ZERO | TRUE |
#A *EQ *ZERO | FALSE |
#A *EQ #B | FALSE |
#A *LE #B | FALSE |
#B *EQ #C | FALSE |
#B *LE #C | FALSE |
| Anchor | ||||
|---|---|---|---|---|
|
式の評価中は、中間結果はSQL Null状態を保持します。その結果は常に厳密に解釈されます。例えば、#B が SQL Null の場合は、式 '#B + 1' の結果は SQL Null です。SQL Nullに1を足しても、SQL Nullのままだからです。これは結果フィールドの属性とは無関係です。
動作の違いが発生するとすれば、それは式の結果が結果フィールドに割り当てられる場合に限られます。式の結果がSQL Nullの場合は、動作は結果フィールドがSQL Nullを許可するかどうかと、関数オプション*STRICT_NULL_ASSIGNが有効かどうかによって決まります。詳細については、「割り当て」 を参照してください。
SQL Nullフィールドの値をより適切な別の値に変更する場合は 組み込みメソッド.AsValue を使用します。 を使用します。 例えば、#BがSQL Nullである場合は、式'#B. AsValue(1) + 1'の結果は2(および#Bが4である場合は5)です。
SQL Null HandlingNull処理