xref:populateLookupXRefRow関数

xref:populateXRefRow関数と同様に、xref:populateLookupXRefRow関数では相互参照列に単一の値が移入されます。xref:populateXRefRow関数とは異なり、xref:populateLookupXRefRow関数では、同じIDのレコードが同時に追加されたときに一意制約の違反エラーはスローされません。かわりに、ルックアップとして動作してエラーの原因となった既存のソース値を返し、処理フローを停止しません。xref:populateXRefRow関数の使用時に発生する可能性がある同時性の問題を解決するには、この関数を使用します。

xref:populateLookupXRefRow関数は文字列値を返します。この文字列値は、移入される相互参照値か、または一意制約の違反がある場合は、最初にコミットされたスレッドによってすでに移入されている相互参照値になります。たとえば、表44-8に示すXREF_CUSTOMER_DATA表には、EBSCommonおよびSBLという列があります。xref:populateLookupXRefRow関数は、2つのスレッドによって、次の値を使用して並行して起動されます。

  • スレッド1: xref: populateLookupXRefRow ("default/xref/example.xref", "EBS", "EBS100", "Common" "CM001", "ADD")

  • スレッド2: xref: populateLookupXRefRow ("default/xref/example.xref", "EBS", "EBS100", "Common" "CM002", "ADD")

表44-11に示すように表に移入されます。スレッド1が最初にコミットされるため、スレッド2はコール元に「CM001」を返します。

表44-11 xref:populateLookupXRefRowによって移入される相互参照表

EBS Common SBL

EBS100

CM001

次の例は、xref:populateLookupXRefRow関数の構文を示しています。

xref:populateLookupXRefRow(xrefMetadataURI as string, xrefReferenceColumnName as
 string, xrefReferenceValue as string, xrefColumnName as string, xrefValue as
 string, mode as string) as string

パラメータ

  • xrefMetadataURI: 相互参照表URI。

  • xrefReferenceColumnName: 参照列の名前。

  • xrefReferenceValue: 参照列名に対応する値。

  • xrefColumnName: 移入される列の名前。

  • xrefValue: 列に移入される値。

  • mode: xref:populateXRefRow関数の列移入モード。ADDまたはLINKを指定できます。表44-10に、これらのモードと各モードの例外条件を示します。

ノート:

modeパラメータ値には大/小文字区別があり、大文字のみで指定する必要があります。

表44-12 xref:populateLookupXRefRow関数のモードと結果

モード 参照値 追加される値 結果

ADD

Absent

Present

Present

Absent

Absent

Present

正常終了

例外(例外が一意制約違反の場合にのみ成功)

例外(例外が一意制約違反の場合にのみ成功)

LINK

Absent

Present

Present

Absent

Absent

Present

例外

正常終了

例外

使用上のノート

  • カスタム表の方法を使用する場合は、相互参照表で一意であることが必要な列に対して、主制約を追加する必要があります。表44-11を例として使用すると、SQL文は次のようになります:

    alter table xref_customer_data add constraint xref_vnx_data_pk
     primary key (common, ebs);
    

    最初に主制約列に移入してから、後続のコールで残りの列に移入します。

  • データの非一貫性の問題が隠される可能性があるため、プライマリ・オブジェクトの相互参照を追加するためにこの関数を使用しないでください。主要な依存オブジェクトに対するセカンダリ・オブジェクトにのみこの関数を使用します。たとえば、顧客アカウントを作成する際にアカウントがすでに存在するかどうかを確認するためにこの関数を使用しないでください。これらの顧客アカウントの住所が同期されている場合に使用してください。