[Résolu] Oracle surchargé ?

Holalala, décidemment Oracle et moi, on y arrivera jamais.

Voilà, j’ai obtenu un nouveau drole de bug.

Je fais une mise à jour d’une ligne dans une table qui contient 8 champs de type VARCHAR[b]2/b.
J’utilise la dernière version de Oracle.DataAccess (10.2).
Je tape sur une base 9i.

J’update sur une ligne déjà existante, sans rien modifier.
Ca marche.

Maintenant je modifie le contenu d’une ligne en insérant 10 caractères.
Ca marche.

Toujours la même ligne en insérant > 2000 caractères.

Je me prends une erreur ORA-01461 : une valeur ‘LONG’ ne peut être liée que dans une colonne de type ‘LONG’

Je cherche Google, et la seule réelle solution que je trouve c’est une histoire de différence de langue entre le client et le serveur.
Donc je met la même langue, le même caracters set, mais… rien de nouveau.

Je me dis qu’il y a un problème entre unicode et ascii.

Mais, c’est là que tout se complique, l’erreur apparait depuis n’importe quel des 8 champs.
Je veux dire, si il y a plus de 3-4 champs qui dépasse les 2000 caractères, le suivant se bloque au-dessus de 2000.

Et pourtant, quand un des champs dépasse les 4000 caractères, le résultat ne fout pas d’exception, les données étant simplement tronquées…

Bref, j’avoue que je suis sur le cul.

Serait-ce une taille de buffer dans le transfert entre le client et le serveur ?
Mais je n’ai rien trouvé à ce sujet… A part avoir vu une limite de 2.000.000, limite que j’ai du mal à atteindre, je ne vois rien là.

Vous avez des indices par hasard ?

D’après cette page, les VARCHAR sont deprecated, tu pourrais commencer par utiliser des VARCHAR2 (si c’est possible).
Ensuite je ne savais pas qu’on pouvait avoir des VARCHAR aussi longs, mais visiblement depuis oracle 8 ,c’est le cas.

Dans l’immédiat, à part passer en VARCHAR2, je ne vois pas …

Oui, désolé, erreur de typo… Tout est VARCHAR2…

Salut,

bon je ne suis pas un spécialiste Oracle, mais il y a un truc qui m’intrigue.

Ta longueur totale de ton enregistrement (8 * 4000) dépasse la taille d’une page de données (8Ko il me semble sous Oracle), mais comme c’est en varchar tu as le droit de faire cette déclaration (en char tu dois te faire jeter)

Donc a mon avis au départ, la taille de ton enregistrement doit faire moins que la taille d’une page (puisqu’en varchar, seul les char ‘valorisés’ sont stockés) et le fait de faire un UPDATE avec 2000 caractères de plus doit te faire dépasser la taille d’une page : ce qui n’est pas possible.

Voila, voila
Je ne sais pas si ca pourra t’aider, mais j’ai déjà eu ce genre de pb sous SQL server.

Alors après donc 3 jours de tests et d’incompréhension, meme avec des DBA Oracle ici, surtout les convaincus du bug du NLS_LANG, il a suffit de mettre à jour les Oracle.DataAccess de la version 10.2.0.110 en version 10.2.0.20 (intelligemment noté par Oracle par le numéro de version 1.102.0.20) pour que cela fonctionne correctement.

Sur ce, je vous laisse, je dois aller me pendre…