2

等しいかどうかを比較したい2つのテーブルタイプ(オブジェクトタイプのテーブル)があるとしましょう...

integerオブジェクトタイプには、、、、、などの複数のフィールドがvarchar2ありdateます。

の2つのテーブルMULTISET EXCEPTを効果的に実行するために人々が使用する例を見てきました。MINUSINTEGER

ただし、これは複雑なオブジェクトタイプの2つのテーブルでは機能しません。

また、演算子MAP MEMBER FUNCTIONを使用するときに複雑なコレクションを機能させるためのの使用についても言及しましたが、機能については言及していません。SETMULTISET

私が同等性について比較している現在の方法は、テーブルタイプ1(TT1)とテーブルタイプ2(TT2)を取り、それらが等しい場合に等しいと言うことですTT1 MINUS TT2 = 0 AND TT2 MINUS TT1 = 0。ただし、ここでは、マイナスの両方のテーブルからPKを選択しているだけです。また、複数のフィールドを比較できるようにしたいと思います。

私はもっMULTISET​​と速いことを望んでいますか?

ありがとう。

4

1 に答える 1

1

はい、を使用しMAP MEMBER FUNCTIONて、型のネストされたテーブルの比較をサポートできます。

--#1: Create object
create or replace type type1 is object
(
    a integer,
    b varchar2(100),
    c date,
    map member function compare return raw
);
/

--#2: Create map function for comparisons.
--Returns the concatenated RAW of all attributes.
--Note that this will consider NULLs to be equal!
create or replace type body type1 as
    map member function compare return raw is
    begin
        return
            utl_raw.cast_to_raw(to_char(a))||
            utl_raw.cast_to_raw(b)||
            utl_raw.cast_to_raw(to_char(c, 'DD-MON-YYYY HH24:MI:SS'));

    end;
end;
/

--#3: Create nested table of the types
create or replace type type1_nt is table of type1;
/

--#4: Compare.
--You could use MULTISET, but it's easier to use regular operators like "<>" "and =".
declare
    tt1 type1_nt := type1_nt(type1(0, 'A', date '2000-01-01'),
                             type1(0, 'A', date '2000-01-01'));
    tt2 type1_nt := type1_nt(type1(0, 'B', date '2000-01-01'),
                             type1(0, 'B', date '2000-01-01'));
    tt3 type1_nt := type1_nt(type1(0, 'B', date '2000-01-01'),
                             type1(0, 'B', date '2000-01-01'));
begin
    if tt1 <> tt2 and tt2 = tt3 then
        dbms_output.put_line('Pass');
    else
        dbms_output.put_line('Fail');
    end if;
end;
/

これが各属性を手動で比較するよりも速いかどうかはわかりません。しかし、違いは重要ではないと思います。

于 2012-09-09T20:46:34.497 に答える