我有两张表,如:
表一栏:PRD_ID, COMP, TD1, TD2, TD3
表二列:ACC_ID, COMP, TD1, TD2, TD3
以上account_id映射到PRD_ID
。
我想比较是否COMP
,TD1
,TD1
或TD3
中的任何值都已更改。我将提供样本数据。
Table 1: PRD_ID COMP TD1 TD2 TD3
T A Y Y Y
T B Y N N
Table 2: ACC_ID COMP TD1 TD2 TD3
S A N N Y
S B Y N N
因此,在上述两个表之间,对于COMP A值已经更改。我应该得到一些计数或值,以便我可以在IF条件下使用它来做一些操作
答案 0 :(得分:0)
如果此数据存储在表格中,则您不需要记录类型。您可以使用MINUS
:
for i in (select COMP, TD1, TD2, TD3 from table1
minus
select COMP, TD1, TD2, TD3 from table2) loop
-- do something with changed records
end loop;
如果没有变化,循环中的代码将不会执行。此代码将显示table1
中的行,这些行与table2
中的行不同。如果您需要table2
中的行,请还原SQL查询:
for i in (select COMP, TD1, TD2, TD3 from table2
minus
select COMP, TD1, TD2, TD3 from table1) loop
-- do something with changed records
end loop;
如果你想使用显式游标:
declare
cursor c1 is
select COMP, TD1, TD2, TD3 from table1
minus
select COMP, TD1, TD2, TD3 from table2;
c1_row c1%rowtype;
begin
open c1;
loop
fetch c1 into c1_row;
exit when c1%notfound;
-- do something
end loop;
end;
答案 1 :(得分:0)
正如德米特里所说,你可能不需要比较记录。
为了完整性,如果你真的需要比较记录,那么你需要通过你的十二个(逐个字段)实现比较,因为Oracle不支持测试记录类型的相等或不平等。
请参阅Oracle文档:Record Comparisons
记录比较功能的示例(std::unique_ptr<A> my_obj;
try {
my_obj = std::move(std::unique_ptr<A>(new A(arg1, arg2, arg3));
}
catch (std::exception& e) {
// print a user-friendly error message and exit
}
if (my_obj) { // needed if your exception handling doesn't break out of the function
A& my_obj_ref = *my_obj;
// ...
// about 100 other lines of code being executed if my_obj is created properly
}
):
test_equal