2

假设我有两个表类型(对象类型表),我想比较它们是否相等......

对象类型具有多个字段,例如 an integervarchar2date

我已经看到人们MULTISET EXCEPT为了有效地MINUSINTEGER.

但这不适用于两个复杂对象类型的表。

我还看到在MAP MEMBER FUNCTION使用运算符时提到了使用,以便使复杂的集合工作SET,但没有提到MULTISET功能。

我目前比较相等的方法是采用表类型 1 (TT1) 和表类型 2 (TT2) 并说它们相等 if TT1 MINUS TT2 = 0 AND TT2 MINUS TT1 = 0。但在这里我只是从两个表中为 MINUS 选择 PK,我还希望能够比较多个字段。

我希望MULTISET更快?

谢谢。

4

1 回答 1

1

是的,您可以使用 aMAP 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 回答