比较pl / sql

时间:2017-07-28 06:55:25

标签: oracle plsql

我有两张表,如:

表一栏:PRD_ID, COMP, TD1, TD2, TD3

表二列:ACC_ID, COMP, TD1, TD2, TD3

以上account_id映射到PRD_ID。 我想比较是否COMPTD1TD1TD3中的任何值都已更改。我将提供样本数据。

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条件下使用它来做一些操作

2 个答案:

答案 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