Първо, вярвам, че вашата задача може да бъде изпълнена (и трябва да бъде действително) с обикновен SQL. Без фантастични курсори, без цикли, само избира, вмъква и актуализира. Бих започнал с премахване на завъртането на вашите изходни данни (не е ясно дали имате първичен ключ за свързване на два набора, предполагам, че имате):
Col0_PK Col1 Col2 Col3 Col4
----------------------------------------
Row1_val A B C D
Row2_val E F G H
По-горе са вашите изходни данни. Използване на UNPIVOT
клауза
ние го преобразуваме в:
Col0_PK Col_Name Col_Value
------------------------------
Row1_val Col1 A
Row1_val Col2 B
Row1_val Col3 C
Row1_val Col4 D
Row2_val Col1 E
Row2_val Col2 F
Row2_val Col3 G
Row2_val Col4 H
Мисля, че схващате идеята. Да кажем, че имаме таблица1 с един набор от данни и същата структурирана таблица2 с втория набор от данни. Добра идея е да използвате организирани по индекс таблици.
Следващата стъпка е сравняването на редовете един с друг и съхраняването на подробности за разликата. Нещо като:
insert into diff_details(some_service_info_columns_here)
select some_service_info_columns_here_along_with_data_difference
from table1 t1 inner join table2 t2
on t1.Col0_PK = t2.Col0_PK
and t1.Col_name = t2.Col_name
and nvl(t1.Col_value, 'Dummy1') <> nvl(t2.Col_value, 'Dummy2');
И на последната стъпка актуализираме обобщената таблица на разликите:
insert into diff_summary(summary_columns_here)
select diff_row_id, count(*) as diff_count
from diff_details
group by diff_row_id;
Това е само груба чернова, за да покажа моя подход, сигурен съм, че трябва да се вземат предвид много повече подробности. За да обобщя, предлагам две неща:
UNPIVOT
данни- Използвайте
SQL
изрази вместо курсори