我有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;
答案 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;