在oracle中进行数组比较以获得两个数组之间的差异

时间:2017-07-24 09:15:05

标签: oracle plsql

我有2个数组,每个数组有10个值。 我想比较两个数组,找出列值和打印差异列之间的差异与旧值和新值,并将结果存储在第三个数组。 我怎样才能在甲骨文中做到这一点。

DECLARE**strong text**
TYPE array_t is v_array(20) of table%rowtype;
array_diff1 array_t := array_t();
array_diff2 array_t := array_t();
array_diff3 array_t := array_t();

BEGIN
    select * into array_diff1 from table where id =20;
    select * into array_diff2 from table where id =30;
    for i in  array_diff1 
        loop
        for j in array_diff2
        loop
            if array_diff1(i) != array_diif2(j) then
                DBMS_OUPUT.PUT_LINE('are not equal');
                **##get the column with the value in array_diff3.**
            else
                DBMS_OUPUT.PUT_LINE('are equal');
            END IF;
        END LOOP;
        END LOOP;
END;

1 个答案:

答案 0 :(得分:3)

您不必使用任何循环,您可以直接执行:

if array_diff1 <> array_diff2 then
    array_diff3 := array_diff1 MULTISET EXCEPT array_diff2;
else
    DBMS_OUPUT.PUT_LINE('are equal');
end if;

查看Multiset Operators了解详情。

请注意,嵌套表中的元素没有特定的顺序。 例如,当您与array_t(1,2,3)array_t(3,2,1)进行比较时,=等于<>!=(与你的循环不同,除非你订购元素)

除了您的代码相同的几个语法错误。试试这样:

DECLARE
TYPE array_t is TABLE of table%rowtype;
array_diff1 array_t := array_t();
array_diff2 array_t := array_t();
array_diff3 array_t := array_t();

BEGIN
    select * BULK COLLECT into array_diff1 from table where id =20;
    select * BULK COLLECT into array_diff2 from table where id =30;

    if array_diff1 <> array_diff2 then
        array_diff3 := array_diff1 MULTISET EXCEPT array_diff2;
    else
        DBMS_OUPUT.PUT_LINE('are equal');
    end if;

END;