Bonjour, je dois dans le cadre de mon travail réaliser un programme C devant se connecter à Oracle 8.1.7 sous Linux. Pour cela j'utilise le Pro*C
Voici une brève description du traitement
Voici dans les grandes lignes le type de traitement poursuivi par mon application.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 void main() { EXEC SQL BEGIN DECLARE SECTION; VARCHAR maVarHote[40]; EXEC SQL END DECLARE SECTION; pid_t PidFils; /* connexion à Oracle */ EXEC SQL CONNECT ...... /* déclaration du curseur */ EXEC SQL DECLARE CURSOR c1 FOR SELECT monChamp FROM maTable; /* ouverture du curseur */ EXEC SQL OPEN c1; EXEC SQL WHENEVER SQLERROR DO break; for(;;) { EXEC SQL FETCH .... PidFils = fork(); if(PidFils == 0) { /* Traitement du processus fils */ EXEC SQL CLOSE c1; /* Calcul basé sur le contenu de maVarHote */ ... exit(1); } else { /* Traitement du processus père */ /* Dans mon cas, pour des raisons spécifique */ /* le processus père doit attendre la fin du fils */ /* pour continuer le traitement */ while(wait(&iStatus) != PidFils); EXEC SQL DELETE maTable WHERE monChamp = :maVarHote; EXEC SQL COMMIT; } } EXEC SQL DISCONNECT; }
A l'exécution, tout va bien jusqu'à ce qu'une erreur Oracle ORA-1000 survienne (nombre maximum de curseurs ouverts atteints).
Si je n'utilise pas de fork, je n'ai pas l'erreur.
Le fork crée un processus fils avec une copie du processus père, donc le fils a également une copie du curseur c1 ouvert, mais malgré le fait que je ferme le curseur dès que le processus fils est crée ne résoud pas mon problème.
JE LE RAPPEL, JE SUIS OBLIGE DE FAIRE UN FORK
Si quelqu'un a déjà eu ce problème et qu'il a trouvé une solution pour éviter l'erreur ORA-1000, je suis bien entendu preneur de cette solution
D'avance, un grand merci.
J'espère que mon sujet posté dans le bon forum car il touche la programmation C (Pro*C donc Oracle) sous Linux.
Partager