Mon update sql oracle plante ?! - SQL/NoSQL - Programmation
Marsh Posté le 10-04-2009 à 12:58:58
quel est le type de ton champ publications?
Marsh Posté le 10-04-2009 à 13:46:31
C'est un type LONG (je ne sais plus exactement la taille je crois que c'est du 32767). Au moment de l'execution, ici, elle contient la même chose que dans le literal que je passe.
Marsh Posté le 10-04-2009 à 13:50:27
molki a écrit : C'est un type LONG (je ne sais plus exactement la taille je crois que c'est du 32767). Au moment de l'execution, ici, elle contient la même chose que dans le literal que je passe. |
c'est pas similaire à un blob pour oracle, un long? si oui il y a des fonctions spécifiques pour les traitements de ces champs, tu ne peux ps les manipuler aussi simplement qu'un varchar ou un int...
Marsh Posté le 10-04-2009 à 13:59:53
- Tu as essayé de faire un echo $sql; et ensuite de passer ta requête directement dans Oracle ?
- Essaye, toujours sous Oracle, d'éclater ta requête sur plusieurs lignes. Normalement Oracle devrait t'indiquer le numéro de la ligne qui ne va pas. Ca t'aidera à voir où est l'erreur...
- Tu es sûr que le champ PUBLICATIONS est bien un long ?
- NUMERODOSSIER, c'est quel type ?
Marsh Posté le 10-04-2009 à 14:29:41
SQL> desc UP7.INSATER_DOSSIER
Nom NULL ? Type
----------------------------------------- -------- ---------------
NUMERODOSSIER NOT NULL VARCHAR2(50)
DATECREATION DATE
CIVILITE VARCHAR2(12)
NOMPATRON VARCHAR2(50)
NOMMARITAL VARCHAR2(50)
PRENOM VARCHAR2(50)
SITUATIONFAM VARCHAR2(50)
DATENAISSANCE DATE
LIEUNAISSANCE VARCHAR2(50)
NATIONALITE VARCHAR2(3)
ADRESSE1 VARCHAR2(50)
ADRESSE2 VARCHAR2(50)
CODPOS VARCHAR2(10)
VILLE VARCHAR2(50)
PAYS VARCHAR2(50)
TELEPHONE VARCHAR2(10)
EMAIL VARCHAR2(50)
ANTECEDANTATER VARCHAR2(50)
SITUATION VARCHAR2(50)
ALREDC VARCHAR2(50)
ALREDO VARCHAR2(50)
TYPEFONCTION VARCHAR2(2)
COMPLET VARCHAR2(1)
TITRE_THESE VARCHAR2(255)
LABO_STATUT VARCHAR2(50)
DIRECTEUR_LABO VARCHAR2(70)
DATE_SOUTENANCE DATE
POSTDOC VARCHAR2(50)
PREMIER_AUTEUR VARCHAR2(50)
AUTRE_POSITION VARCHAR2(50)
SOUMISES VARCHAR2(50)
CONGRES VARCHAR2(50)
AUTRE VARCHAR2(4000)
PROJET VARCHAR2(50)
PUBLICATIONS LONG
FORMATION VARCHAR2(4000)
Sous sqlplus :
SQL> UPDATE UP7.INSATER_DOSSIER SET PUBLICATIONS=PUBLICATIONS || 'Communication avec actes ' WHERE N
UMERODOSSIER='16250TT17000'
2 ;
UPDATE UP7.INSATER_DOSSIER SET PUBLICATIONS=PUBLICATIONS || 'Communication avec actes ' WHERE NUMERO
*
ERREUR à la ligne 1 :
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
Tout pareil, l'étoile est sous =PUBLICATION (c'est tout décalé sur le forum...)
Marsh Posté le 10-04-2009 à 14:33:26
skeye a écrit : |
Marsh Posté le 10-04-2009 à 14:38:42
il n'est plus conseillé d'utiliser le type LONG, surtout depuis la version 10g
si tu peux, utilises un champ de type CLOB
avec un champ de type CLOB ta requête fonctionnera, sinon il faut utilsier des fonctions de manipulations de données de type LONG mais là j'ai un trou de mémoire
Marsh Posté le 10-04-2009 à 14:40:25
je ne suis pas franchement DBA, meis j'ai vaguement entendu parler de blob, ok je vais tâcher de chercher par là.
En fait, en ASP, je n'avais aucun problème pour updater ce champ, ça ne marche plus depuis je j'ai migré l'application en PHP, je suis tout bonnement limité à 4000 caractères en update. Je tentais donc une solution de concat car mon DBA est en vacances pour 2 mois...
Marsh Posté le 10-04-2009 à 17:10:12
dans ce cas là c'est pas un problème de SQL mais un problème avec PHP
regarde de ce côté : http://forum.hardware.fr/hfr/Progr [...] 8360_1.htm
Marsh Posté le 13-04-2009 à 21:55:48
Bonjour,
le problème est que tu veux concaténer un LONG (le champ PUBLICATION) avec une chaine de caractères ('Communication avec actes ').
Comme dit plus haut, le type LONG n'est plus recommandé à partir de la 10g.
Je pense que le mieux serait de transformer ce champ en CLOB, puis d'utiliser le package DBMS_LOB pour faire une concaténation correcte.
Marsh Posté le 10-04-2009 à 12:35:52
Bonjour
Je suis en oracle 10g, je travaille en php 5, je tente de concaténer une variable php classique avec un champ de type LONG sur Oracle.
Voilà la commande sql au moment de l'éxecution :
UPDATE UP7.INSATER_DOSSIER SET PUBLICATIONS=PUBLICATIONS || 'Communication avec actes ' WHERE NUMERODOSSIER='16250TT17000'
Voici le message d'erreur...
[Oracle][ODBC][Ora]ORA-00932: inconsistent datatypes: expected NUMBER got LONG'
jé na comprendu rien du tout, Pourquoi le message parle de NUMBER ? J'ai fait pleins d'essais, impossible de concaténer de cette mainère.
Quelqu'un à une solution ou une explication ?
le code php :
$sql="UPDATE UP7.INSATER_DOSSIER SET PUBLICATIONS=PUBLICATIONS || '$pub' WHERE NUMERODOSSIER='$ater_dossier'";