BLOB データ型フィールドで、Oracle データベースにシリアライズおよびデシリアライズしている HashMap があります。このフィールドを使用してクエリを実行したいと考えています。たとえば、アプリケーションは新しい HashMap を作成し、いくつかのキーと値のペアを持ちます。データベースにクエリを実行して、このデータを含む HashMap がデータベースに既に存在するかどうかを確認したいと考えています。これを行う方法がわかりません。データベース内のすべてのレコードに移動し、デシリアライズしてから比較する必要がある場合は奇妙に思えます。SQL は BLOB の比較を処理しますか? ?....そして foo は BLOB 型で、? 新しい HashMap のインスタンスですか? ありがとう
7 に答える
ここにあなたが読むべき記事があります:釘を叩く:古い靴またはガラス瓶
アプリケーションの基盤となるアーキテクチャについてはあまり聞いたことがありませんが、このようにHashMapを使用する必要がある理由は決してないことをすぐに知ることができます。その悪いテクニック、単純で単純です。
あなたの質問に対する答えは、巧妙なOracleクエリではなく、アプリケーションのアーキテクチャを再設計したものです。
まず、HashMapをデータベースにシリアル化しないでください(より一般的には、クエリする必要のあるものをシリアル化しないでください)。次のように、アプリケーションでハッシュマップを表すテーブルを作成する方がはるかに簡単です。
HashMaps -------- MapID(pk int) キー(pk varchar) 価値
データベースにハッシュマップのコンテンツが含まれると、データベースにクエリを実行して、データがすでに存在するかどうかを確認したり、他の種類の集計データを生成したりするのは簡単です。
SELECT Count(*) FROM HashMaps where MapID = ? AND Key = ?
dbms_crypto.hash を調べて、ブロブのハッシュを作成します。ハッシュをブロブと一緒に保存すると、検索を管理しやすいものに絞り込むことができます。ハッシュ マップを保存することはお勧めしませんが、これはブロブ間の完全一致を検索するための一般的な手法です。SQL - CLOB を比較する方法も参照してください。
シリアル化されたオブジェクトをデータベースに格納することは、それらに対してクエリを実行する必要がないことが事前にわかっていない限り、ほとんどの場合、悪い考えです。
HashMap をどのようにシリアライズしていますか? データと HashMap のようなオブジェクトをシリアル化する方法はたくさんあります。2 つのマップを、特にシリアル化された形式で比較することは、2 つの同等のマップが常に同じ方法でシリアル化されることをシリアル化手法が保証しない限り、簡単ではありません。
この混乱を回避する方法の 1 つは、照会する必要がほとんどないオブジェクトに対して XML シリアライゼーションを使用することです。たとえば、私が働いている場所には、特定のログ メッセージが XML ファイルとして CLOB フィールドに格納されているログ テーブルがあります。この xml データは、シリアル化された Java オブジェクトを表します。通常、レコード内の他の列に対してクエリを実行し、単一のアトミック ステップで BLOB の読み取り/書き込みのみを行います。ただし、1 回か 2 回、blob の詳細な検査を行う必要がありましたが、XML を使用することでこれが可能になりました (Oracle は、varchar2 または CLOB フィールドとネイティブ XML オブジェクトで XML のクエリをサポートしています)。控えめに使えば便利なテクニックです。
私は反対することはできませんが、そうするように言われています。私はあなたの解決策に感謝しています。それは私が以前に持っていたもののようなものです。ありがとう
Oracle では、Java (または Windows では .net) で定義された新しいデータ型を使用できます。シリアル化されたオブジェクトのデータ型を定義し、クエリがどのように機能するかを定義できます。
これを試してみると良い不足...
データを xml にシリアル化し、データを xml に保存すると、SQL クエリ内で xpath を使用できます。(申し訳ありませんが、私はSqlServerの人なので、Oracleでこれを行う方法の詳細はわかりません。)
- シリアル化されたデータの一部のみを更新する必要がある場合は、これを行わないでください。
- 同様に、データのいずれかが他のデータによって指されている場合、または他のデータを指している場合は、これを行わないでください。
BLOB を比較する必要はありませんでしたが、dbms_lob
パッケージを通じてサポートされているようです。
http://www.psoug.org/reference/dbms_lob.htmlを参照dbms_lob.compare()
してください。