Tout d'abord, je crois que votre tâche peut être implémentée (et devrait l'être en fait) avec SQL direct. Pas de curseurs sophistiqués, pas de boucles, juste des sélections, des insertions et des mises à jour. Je commencerais par annuler le pivotement de vos données source (il n'est pas clair si vous avez une clé primaire pour joindre deux ensembles, je suppose que vous en avez) :
Col0_PK Col1 Col2 Col3 Col4
----------------------------------------
Row1_val A B C D
Row2_val E F G H
Ci-dessus se trouvent vos données source. Utilisation de UNPIVOT
clause
nous le convertissons en :
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
Je pense que vous avez compris l'idée. Supposons que nous ayons table1 avec un ensemble de données et la même table2 structurée avec le deuxième ensemble de données. C'est une bonne idée d'utiliser des tableaux organisés en index.
L'étape suivante consiste à comparer les lignes les unes aux autres et à stocker les détails des différences. Quelque chose comme :
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');
Et à la dernière étape, nous mettons à jour le tableau récapitulatif des différences :
insert into diff_summary(summary_columns_here)
select diff_row_id, count(*) as diff_count
from diff_details
group by diff_row_id;
C'est juste un brouillon pour montrer ma démarche, je suis sûr qu'il y a beaucoup plus de détails à prendre en compte. Pour résumer, je suggère deux choses :
UNPIVOT
données- Utiliser
SQL
instructions au lieu de curseurs