この項では、属性と型の変換に関する問題を説明します。
EXEC SQL [AT [:]database] OBJECT SET [ {'*' | {attr[, attr]} } OF] :obj [[INDICATOR]:obj_ind] TO {:hv [[INDICATOR]:hv_ind] [, :hv [INDICATOR]:hv_ind]]} ;
この文は、連想アクセス用インタフェースとナビゲーショナル・アクセス用インタフェースのどちらで作成したオブジェクトにも使用します。この文によって、オブジェクトの属性が更新されます。永続オブジェクトの場合は、オブジェクトが更新され、フラッシュされたときに、変更がサーバーに書き込まれます。キャッシュのフラッシュは、更新済オブジェクトになされたすべての変更をサーバーに書き込みます。
OF句はオプション設定です。OF句を指定しなければ、objの属性がすべて設定されます。次のように記述しても同じ結果が得られます。
... OBJECT SET * OF ...
ホスト変数リストには、属性の値を提供するように展開された構造体を組み込むことができます。ただし、obj内の属性の数は、展開する変数リスト内の要素数と同じである必要があります。
ホスト変数と属性は、次のとおりです。
attr
各属性はホスト変数ではなく、オブジェクトのどの属性が更新されるかを指定する識別子にすぎません。リスト内の最初の属性は、リスト内の最初の式と対になります。属性は、OCIString、OCINumber、OCIDateまたはOCIRefのいずれかにする必要があります。
obj (IN/OUT)
objには、更新対象となるオブジェクトを指定します。バインド変数objに配列を使用することはできません。これはOTTが生成した構造体へのポインタである必要があります。
obj_ind (IN/OUT)
更新対象となる対になるインジケータ構造体です。これはOTTが生成したインジケータ構造体へのポインタである必要があります。
hv (IN)
これは、OBJECT SET文への入力に使用されるバインド変数です。hvはint、float、OCIRef *、1次元文字配列またはこれらの型の構造体である必要があります。
hv_ind (IN)
これは、OBJECT SET文への入力に使用される対になるインジケータです。hv_indは2バイト整数スカラーまたは2バイト整数スカラーの構造体である必要があります。
標識変数の使用方法:
ホスト変数のインジケータがある場合は、オブジェクト・インジケータも必要です。
hv_indを-1に設定すると、それに対応付けられたフィールドがobj_ind内で-1に設定されます。
次の暗黙的な変換が許されます。
[OCIString | STRING | VARCHAR | CHARZ]からOCIStringへ
OCIRefからOCIRefへ
[OCINumber | int | float | double]からOCINumberへ
[OCIDate | STRING | VARCHAR | CHARZ ]からOCIDateへ
注意:
ネストされた構造体は使用できません。
この文を使用して、参照可能オブジェクトをアトミックNULLに設定することはできません。かわりに、NULLインジケータの適切なフィールドを設定してください。
OCIDateTimeまたはOCIIntervalデータ型とOCIStringとの間での変換はサポートされていません。
EXEC SQL [AT [:]database] OBJECT GET [ { '*' | {attr[, attr]} } FROM] :obj [[INDICATOR]:obj_ind] INTO {:hv [[INDICATOR]:hv_ind] [, :hv [[INDICATOR]:hv_ind]]} ;
この文では、オブジェクトの属性がネイティブなC言語のデータ型に変換されます。
FROM句はオプションです。FROM句を指定しなければ、objの属性がすべて変換されます。次のように記述しても同じ結果が得られます。
... OBJECT GET * FROM ...
ホスト変数リストには、属性の値を受け取るように展開された構造体を組み込んでもかまいません。ただし、obj内の属性の数は、展開されるホスト変数リスト内の要素の数と同じである必要があります。
ホスト変数と属性は、次のとおりです。
attr
各属性はホスト変数ではなく、オブジェクトのどの属性が取り出されるかを指定する識別子にすぎません。リスト内の最初の属性は、リスト内の最初のホスト変数と対になります。属性はベース型を表す必要があります。OCIString、OCINumber、OCIRefまたはOCIDateのいずれかにする必要があります。
obj (IN)
この変数では、属性を取り出すときのソースとして機能するオブジェクトを指定します。バインド変数objに配列を使用することはできません。
hv (OUT)
これは、OBJECT GET文からの出力を保持するためのバインド変数です。int、float、double、1次元文字配列またはこれらの型の構造体にできます。この文では、このホスト変数に変換済の属性値が戻されます。
hv_ind (OUT)
これは、属性値に対応付けられた標識変数です。また、2バイト整数スカラーまたは2バイト整数スカラーの構造体です。
標識変数の使用方法:
オブジェクト・インジケータを指定しなかった場合、属性は有効とみなされます。オブジェクトがアトミックNULLの場合または、要求した属性がNULLで、オブジェクト標識変数を指定しなかった場合は、オブジェクト属性がC言語のデータ型に変換されるプログラム・エラーになります。この状況では、Oracleエラーを呼び出せないことがあります。
オブジェクト変数がアトミックNULLの場合、または要求した属性がNULLで、ホスト変数インジケータ(hv_ind)が与えられている場合は、-1に設定されます。
オブジェクトがアトミックNULLの場合、または要求した属性がNULLで、ホスト変数インジケータが与えられていない場合は、エラーが発生します。
次の暗黙的な変換が許されます。
OCIStringから[STRING | VARCHAR | CHARZ | OCIString]へ
OCINumberから[int | float | double | OCINumber]へ
OCIRefからOCIRefへ
OCIDateから[STRING | VARCHAR | CHARZ | OCIDate]へ
注意:
ネストされた構造体は使用できません。
OCIDateTimeまたはOCIIntervalデータ型とOCIStringとの間での変換はサポートされていません。