Mon update sql oracle plante ?!

Mon update sql oracle plante ?! - SQL/NoSQL - Programmation

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'";

Reply

Marsh Posté le 10-04-2009 à 12:35:52   

Reply

Marsh Posté le 10-04-2009 à 12:58:58    

quel est le type de ton champ publications?


---------------
Can't buy what I want because it's free -
Reply

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.

Reply

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...


---------------
Can't buy what I want because it's free -
Reply

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 ?

Reply

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...)


Message édité par molki le 10-04-2009 à 14:30:58
Reply

Marsh Posté le 10-04-2009 à 14:33:26    

skeye a écrit :


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...



---------------
Can't buy what I want because it's free -
Reply

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

Reply

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...

Reply

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

Reply

Marsh Posté le 10-04-2009 à 17:10:12   

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed