Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/12/2010, 20h44   #1
Invité régulier
 
Inscription : août 2009
Messages : 12
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France

Informations forums :
Inscription : août 2009
Messages : 12
Points : 8
Points : 8
Par défaut [OCILIB] Multithread et gestion des erreurs

Bonsoir,

J'ai besoin d'un éclaircissement sur le multithread et la gestion des erreurs avec OCILIB 3.5.0.0. Le contexte:
  • Le programme gère le multithread lui-même. Il n'utilise pas les threads proposés par OCILIB.
    Code :
    OCI_Initialize( NULL, NULL, OCI_ENV_THREADED | OCI_ENV_CONTEXT )
    Le programme gère son propre pool de connexion à la bdd. Une connexion pour chaque thread, ouverte au démarrage du thread et fermée avec son arrêt.
    Code :
    OCI_ConnectionCreate(parametre->OracleSid().c_str(), parametre->OracleUser().c_str(), parametre->OraclePwd().c_str(), OCI_SESSION_DEFAULT)

Plus tard, arrive le moment décisif d'une insertion. Fait important le programme ne travaille que sur des tableaux.
Code :
1
2
3
iNbRowsInArray = OCI_BindArrayGetSize(st);
iStmtActionRes = OCI_Execute(st);
iAffectedRows = OCI_GetAffectedRows(st);
En cas d'erreur je pensais naïvement que le code suivant fonctionnait:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
IF (FALSE == iStatement) {
OCI_Error*	pErr = OCI_GetBatchError(st);
	while ( NULL != pErr )
	{
		UNSIGNED int iRowIndex = OCI_ErrorGetRow(pErr);
		IF ( 0 > iRowIndex )
			ERREUR(thread) << "Error at row : <" << OCI_ErrorGetRow(pErr) << "> : <" << OCI_ErrorGetString(pErr) << ">" << print ;
		else
			ERREUR(thread) << "Error not related to array DML: " << OCI_ErrorGetString(pErr) << print ;
 
		// Get next error
		pErr = OCI_GetBatchError(st);
         }
Dès le premier appel à OCI_GetBatchError le programme plante brutalement... J'en conclus que je ne dois pas faire quelque chose que je devrais. Probablement une initialisation... Mais à quel moment?
jp_fan_2_C_linux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2010, 22h04   #2
Rédacteur/Modérateur
 
Avatar de Vincent Rogier
 
vincent rogier
Inscription : juillet 2007
Messages : 2 355
Détails du profil
Informations personnelles :
Nom : vincent rogier
Âge : 34

Informations forums :
Inscription : juillet 2007
Messages : 2 355
Points : 3 108
Points : 3 108
Salut,

c'est un bug présent dans la 3.5.0. La fonction OCI_GetBatchError() ne vérifiait pas la validité d'un pointeur interne et donc un segfault survenait si aucune erreur DML n'était générée par OCI.

Cela a été corrigé dans la 3.7.0 (cf . changelog)

Récupère la dernière version 3.8.1
__________________
Vincent Rogier.

Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

OCILIB (C Driver for Oracle)

Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle
Vincent Rogier est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h10.


 
 
 
 
Partenaires

Hébergement Web