Bonjour,
J'ai un problème quand même assez important avec les OCI, pour une raison que j’ignore complètement, les « OCIBindByName » ont cessé de fonctionner! Du code qui fonctionnait parfaitement la semaine dernière ne fonctionne plus et pourtant rien n’a été changé!
Plus en détail, pour mettre à jour un enregistrement Oracle, je construis une requête comme celle-ci :
Les « Bind » sont créés de la manière suivante :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 $vlRequeteSql:="UPDATE INT_FICHES_INSP SET CD_STATUT_FICHE=:StatutFiche" $vlRequeteSql:=$vlRequeteSql+", DT_STATUT_FICHE=:DateStatut, REM_STATUT_FICHE=:RemarqStatut" $vlRequeteSql:=$vlRequeteSql+", SMI_NO_FICHE=:NoFicheSMI" $vlRequeteSql:=$vlRequeteSql+" WHERE ID = "+[Fiche_Bloc_00]B00_Code_Externe $vlRequeteSql:=$vlRequeteSql+" AND SEF_DT_VIGUEUR = '"+Chaine([Fiche_Bloc_00]Portable_Date_Prise_Effet_Debut;Format court )+"'"
Tout est déclaré et contient une valeur et les types sont corrects. J'ai déjà lu plusieurs fois la note technique sur l'introduction aux OCI et les commendent sont supposées correspondre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 $vlStatut:=OCIBindByName (vpstmthp;vpbind;vperrhp;":StatutFiche";->vpTabStatutFiche;SQLT_STR ;->vpnull_ind1;->vpnull_ind2;->vpnull_ind3;OCI_DEFAULT ;BIND_IN ) $vlStatut:=OCIBindByName (vpstmthp;vpbind;vperrhp;":DateStatut";->vpTabDateStatut;SQLT_ODT ;->vpnull_ind1;->vpnull_ind2;->vpnull_ind3;OCI_DEFAULT ;BIND_IN ) $vlStatut:=OCIBindByName (vpstmthp;vpbind;vperrhp;":RemarqStatut";->vpTabRemarqueStatut;SQLT_STR ;->vpnull_ind1;->vpnull_ind2;->vpnull_ind3;OCI_DEFAULT ;BIND_IN ) $vlStatut:=OCIBindByName (vpstmthp;vpbind;vperrhp;":NoFicheSMI";->[Fiche_Bloc_00]Numero_Fiche;SQLT_INT ;->vpnull_ind1;->vpnull_ind2;->vpnull_ind3;OCI_DEFAULT ;BIND_IN )
Lorsque la requête est exécutée (avec OCIStmtExecute), l’enregistrement est trouvé mais n’est pas mis à jour avec les valeurs des variables qui sont dans les « Bind »… et si l’un des champs avait déjà une valeur avant l’exécution de la requête, il devient vide ! Le problème devrait donc venir du OCIBindByName puisque le lien entre les variables de la requête et celles du « Bind » ne se fait pas. J'ai également essayé avec OCIBindByPos et ça ne fonctionne pas non plus.
Avez-vous déjà connu un problème semblable ?
De quelle façon régler le problème ??
L'environnement utilisé : 4D 2003.8 (client/serveur) sous Windows et Oracle 10g
Des fois que les exemples plus haut ne suffisent pas, voici une méthode un peu plus simple que j’utilise pour faire des tests. Elle crée un enregistrement et ensuite va essayer de le modifier… la création fonctionne mais pas la modification.
Merci à l'avance pour votre aide!
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62 C_TEXTE($vlRequeteSql;$vlMsgErreur) C_ENTIER LONG($vlTableTraitee) C_ENTIER LONG($vlStatus;vperrhp;$vlstmthp;vpbind) C_ENTIER LONG(vpnull_ind1;vpnull_ind2;vpnull_ind3) TABLEAU ALPHA(10;vpTabStatutFiche;1) $vlMsgErreur:=Oracle_Connexion_OCI `Méthode utilisée pour la connexion à Oracle $vlRequeteSql:="INSERT INTO INT_FICHES_INSP (ID) VALUES (120)" $vlStatus:=OCIHandleAlloc (<>envhp;$vlstmthp;OCI_HTYPE_STMT ) $vlStatus:=OCIHandleAlloc (<>envhp;vperrhp;OCI_HTYPE_ERROR ) $vlStatus:=OCIStmtPrepare ($vlstmthp;vperrhp;$vlRequeteSql;OCI_DEFAULT ) $vlErreur:=OCIErrorGet (vperrhp;1;$Numer;$Contents) $vlStatus:=OCIStmtExecute (<>svchp;$vlstmthp;vperrhp;1;0;0;0;OCI_DEFAULT ) $vlErreur:=OCIErrorGet (vperrhp;1;$Numer;$Contents) $vlStatus:=OCITransCommit (<>svchp;vperrhp;0) $vlErreur:=OCIErrorGet (vperrhp;1;$Numer;$Contents) $vlStatus:=OCIHandleFree ($vlstmthp) $vlStatus:=OCIHandleFree (vperrhp) Si (($vlStatus#0)*|*($Contents#"")) ALERTE("Erreur prepare 1 - statut "+Chaine($vlStatus)+" : "+$Contents) Sinon TABLEAU ALPHA(10;vpTabStatutFiche;1) vpTabStatutFiche{1}:="TEST3" $vlRequeteSql:="UPDATE INT_FICHES_INSP SET CD_STATUT_FICHE=:StatutFiche WHERE ID = 120" $vlStatus:=OCIHandleAlloc (<>envhp;$vlstmthp;OCI_HTYPE_STMT ) $vlStatus:=OCIHandleAlloc (<>envhp;vperrhp;OCI_HTYPE_ERROR ) $vlStatus:=OCIStmtPrepare ($vlstmthp;vperrhp;$vlRequeteSql;OCI_DEFAULT ) $vlErreur:=OCIErrorGet (vperrhp;1;$Numer;$Contents) $vlStatut:=OCIBindByName ($vlstmthp;vpbind;vperrhp;":StatutFiche";->vpTabStatutFiche;SQLT_STR ;->vpnull_ind1;->vpnull_ind2;->vpnull_ind3;OCI_DEFAULT ;BIND_IN ) $vlStatus:=OCIStmtExecute (<>svchp;$vlstmthp;vperrhp;1;0;0;0;OCI_DEFAULT ) $vlErreur:=OCIErrorGet (vperrhp;1;$Numer;$Contents) $vlStatus:=OCITransCommit (<>svchp;vperrhp;0) $vlErreur:=OCIErrorGet (vperrhp;1;$Numer;$Contents) $vlStatus:=OCIHandleFree ($vlstmthp) $vlStatus:=OCIHandleFree (vperrhp) Fin de si $vlMsgErreur:=Oracle_Deconnexion_OCI `Méthode utilisée pour la déconnexion
Partager