IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaces de programmation Oracle Discussion :

[PRO*C][LINUX]ORA-1000:Maximum cursors exceeded


Sujet :

Interfaces de programmation Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut [PRO*C][LINUX]ORA-1000:Maximum cursors exceeded
    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

    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;
     
    }
    Voici dans les grandes lignes le type de traitement poursuivi par mon application.

    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.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    il suffit d'augmenter le parametre open_cursors

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    C'est une idée mais je ne peux m'orienter vers cette solution. Mais merci quand même.

    Le principe du programme étant que à chaque enregistrement dans ma
    table 1, je crée un processus fils, je vais quand même retomber sur cette erreur. Pour information, ma table 1 contient environ 600.000 enregistrements. Je ne pense pas qu'il soit possible de définir un open_cursors = 600000

    Mais je continue à chercher et avec des collègues, nous avons peut-être une piste au niveau de directive de précompilateur

    [quote]
    THREADS={YES | NO} NO Indicates a shared server application
    [/quota]

    Nous testerons cela demain.

  4. #4
    thg
    thg est déconnecté
    Membre éclairé
    Inscrit en
    Septembre 2005
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 46
    Par défaut
    Bonjour,

    Dans un premier temps tu peux tester avec avec l'option RELEASE_CURSOR=YES pour voir le comportement.

    Quelle est la version exacte d'Oracle 8.1.7.????

    Jete un oeil sur metalink BUG 1653912 ... il semble qu'il existe un patchset : "8.1.7.2 Patchset" qui corrige des pb de "close cursor".... a verifier ...

    Hope this help

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 38
    Par défaut
    Merci.

    Je vais tenter cette solution.

Discussions similaires

  1. ORA-01000: maximum open cursors exceeded
    Par amoula84 dans le forum Oracle
    Réponses: 5
    Dernier message: 01/06/2009, 20h09
  2. ORA-01000: maximum open cursors exceeded
    Par tro2blabla dans le forum VB.NET
    Réponses: 3
    Dernier message: 21/08/2008, 15h00
  3. ORA-01000: maximum open cursors exceeded
    Par tro2blabla dans le forum PL/SQL
    Réponses: 3
    Dernier message: 21/08/2008, 14h56
  4. Réponses: 5
    Dernier message: 04/12/2007, 10h49
  5. ORA-01000 maximum cursor exceeded
    Par dd16 dans le forum Oracle
    Réponses: 5
    Dernier message: 12/12/2005, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo