J'ai une table avec les employés et pour chaque employé ont peu de factures. Je déclare 2 curseurs, un pour tous les employés (distinct) et un second curseur pour toutes les factures pour un employé. Maintenant, ouvrez le 1er curseur avec tous les employés, récupérez-en un, ouvrez le deuxième curseur (basé sur l'employé du 1er curseur) avec toutes les factures pour l'employé. Pour réutiliser un deuxième curseur pour tous les employés, j'ouvre et ferme le deuxième curseur pour chaque employé. Cette chose passe beaucoup de temps. Comment réutiliser un deuxième curseur à la place rouvrir ou n'importe quelle bonne idée?Ré-utiliser un curseur à la place ré-ouvrir
Une partie du code dans Pro * C:
struct sforc1 {
long nis_rad[ROWS_FETCHED_C1];
long sec_nis[ROWS_FETCHED_C1];
/*char f_fact[9];
long sec_rec;*/
}forc1;
struct sforc2 {
long nis_rad[ROWS_FETCHED_C2];
long sec_nis[ROWS_FETCHED_C2];
char f_fact[ROWS_FETCHED_C2][9];
long sec_rec[ROWS_FETCHED_C2];
char f_p_camb_est[ROWS_FETCHED_C2][9];
char op_cambest[ROWS_FETCHED_C2][9];
}forc2;
void main (void)
{
exec sql declare c1 cursor for
select distinct nis_rad, sec_nis
from recibos
where ((imp_tot_rec - imp_cta)>0) and f_p_camb_est = '29991231';
exec sql declare c2 cursor for
select nis_rad, sec_nis, f_fact, sec_rec, f_p_camb_est, op_cambest
from recibos
where ((imp_tot_rec - imp_cta)>0) and f_p_camb_est = '29991231' and nis_rad = :forc1.nis_rad[i] and sec_nis=:forc1.sec_nis[i];
exec sql open c1;
while(1){
exec sql fetch c1 into :forc1;
rows_this_time1 = sqlca.sqlerrd[2]-rows_before1;
rows_before1 = sqlca.sqlerrd[2];
if (rows_this_time1==0){
break;
}
for(i=0;i<rows_this_time1;++i){
exec sql open c2;
rows_before2 = 0;
while(1){
exec sql fetch c2 into :forc2;
rows_this_time2 = sqlca.sqlerrd[2]-rows_before2;
rows_before2=sqlca.sqlerrd[2];
if(rows_this_time2==0){
break;
}
for(j=0;j<rows_this_time2;++j){
strcpy(forc2.f_p_camb_est[j], "20161212");
strcpy(forc2.op_cambest[j], "SIMD0943");
}
EXEC SQL
update recibos
set f_p_camb_est = :forc2.f_p_camb_est,
op_cambest = :forc2.op_cambest
where nis_rad = :forc2.nis_rad
and sec_nis = :forc2.sec_nis
and f_fact = :forc2.f_fact
and sec_rec = :forc2.sec_rec;
}
exec sql close c2;
}
exec sql close c1;
exec sql commit;
exec sql open c1;
rows_before1 = 0;
}
exec sql close c1;
}
nis_rad et sec_nis est un employee_id (clé primaire). Chaque nis_rad ont quelques factures f_fact (factures)
Pour le traitement de 10000 de nis_rad passent 30 minutes et 28-29 min est pour Rouvrir deuxième curseur (c2)
UP. Supprimé précédemment Exemple
Où est-ce être exécuté à partir? Aussi, pourquoi avoir deux curseurs et les joindre manuellement (en utilisant une jointure croisée, par l'apparence des choses - cela cause probablement votre lenteur!)? Pourquoi ne pas avoir une seule déclaration SQL qui fait la jointure pour vous? (Bien que dans votre exemple, vous choisissez de la même table deux fois, vraiment, vous avez juste besoin de la deuxième requête.) – Boneist
Quel langage de programmation est-ce? Ce n'est pas valide PL/SQL. Et pourquoi n'utilisez-vous pas un JOIN pour cela? Un curseur est la pire façon de le faire. –
Cela ressemble à 'Pro * C'. – XING