.Net DataSet から Oracle RAW 列に格納している GUID に関して、本番データに奇妙な動作があることに気付きました。
次の設定があります。
- テーブル Aには RAW 列IDがあります
- テーブル Bには RAW 列ResponsibleObjectIdがあります
ResponsibleObjectId 列には、テーブル A の関数で作成されたときにテーブル A の ID が入力されます (常にそうであるとは限らないため、列に FK はありません)。
これは、.Net サーバー層で発生します。2 つのテーブルは 2 つの別個の DataSet にあります。これらの 2 つのデータセットは、Oracle DB (11g) に保存されます。
ほとんどの場合、これは機能しますが、いくつかのケース (1/10.000.000 行など) では、結果の GUID は完全に同じではありません:
ResponsibleObjectId ID
665B8FFDE5A04163A96D96A25702665B 665B8FFDE5A04163A96D96A257023065
325C8AB000434503B8D2F980B33B325C 325C8AB000434503B8D2F980B33B4B58
AF831B5207E04D2ABE0E3ADAC802AF83 AF831B5207E04D2ABE0E3ADAC8023FA1
88DD5AF244DC4EA08075DB53CA1988DD 88DD5AF244DC4EA08075DB53CA19072E
75A5E5111DEE4021BA6EB016178775A5 75A5E5111DEE4021BA6EB01617876E66
最後の 4 文字を期待して、それらは一致します。
次のように、ストアド プロシージャを使用して GUID を保存します。
.Net DAL
OracleCommand cmdSpInsert = (OracleCommand)database.GetStoredProcCommand("PKG_TableB.InsertTableB");
database.AddInParameter(cmdSpInsert, "PAR_ResponsibleObjectId", DbType.StringFixedLength, 36, "ResponsibleObjectId", DataRowVersion.Current);
オラクル SP
PROCEDURE InsertTableB
(
...
PAR_ResponsibleObjectId IN CHAR,
...
)
IS BEGIN
INSERT INTO StockMov
(
...
HEXTORAW(REPLACE(UPPER(PAR_ResponsibleObjectId), '-','')),
...
);
END InsertTableB;
この奇妙な動作の原因はわかりません。テーブル A の 2 つの異なる列でも同様のケースが発生しているため、テーブル B に特に関連しているようには見えません。
追加情報が必要な場合は、お尋ねください。質問を更新します。
私たちの謎を解くために、どんな助けも大歓迎です!:)
編集 コメントで尋ねられたように、 ResponsibleObjectId 列の割り当ては次のように非常に単純です。
dataSetB.ResponsibleObjectId = dataSetA.Id
また、2 つのデータセットは同じトランザクションで保存されます。