[mauvaise requête] SQL Error: ORA-01830

Eléphant du PHP | 73 Messages

29 juin 2007, 15:38

Coucou j'ai un p'ti problème de requête comme vous avez pu le voir ^^

voici ma requête :

Code : Tout sélectionner

INSERT INTO GEC_PRETS ( GEC_PRET_NUMERO,GEC_PRET_DATE_DEBUT,GEC_PRET_EMPRUNTEUR,GEC_PRET_COMMENTAIRES,GEC_PRET_STATUT,GEC_PRODUIT_NUMERO ) values ( 2300,'29/06/2007 15:32:50','popo','popo',1,25)

Voici l'erreur retournée :

Error report:
SQL Error: ORA-01830: données surnuméraires après la conversion correcte d'une chaîne en entrée
01830. 00000 - "date format picture ends before converting entire input string"



A priori mon format de date n'est pas correct :(
Sauriez vous comment je peut faire pour faire passer la chose ? :D (je suis en php)
Si vous voulez des précisions sur la base de donnée j'en mettrait ^^

bye bye :D
nouveau dans le monde du php
Maître du phpinfo() ce n'est pas rien tout de même xD

Mammouth du PHP | 693 Messages

29 juin 2007, 15:41

SI tu veux que ca soit l'heure à laquel ce fait l'insertion et que le champs GEC_PRET_DATE_DEBUT est de type DATETIME, tu peux utiliser la fonction NOW()

Eléphant du PHP | 73 Messages

29 juin 2007, 15:58

c'est bien l'heure et la date à laquelle je fait l'insertion que je veut entrer.
Le champs GEC_PRET_DATE_DEBUT est de type DATE (pas DATETIME) je sait pas si ça éxiste sous oracle je n'y connait pas grand chose je ne m'occupe pas de ça ^^

La fonction NOW() ne fonctionne pas :s
C'est comme si php ne la connaissait pas. Tu est sur qu'elle éxiste ?

sinon j'ai fait comme ça pour l'utiliser :


$mavariable_date = now()

merci :D
nouveau dans le monde du php
Maître du phpinfo() ce n'est pas rien tout de même xD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

29 juin 2007, 17:14

NOW() c'est du MySQL ... pour php c'est la fonction date() avec les attributs qui vont bien, quant à oracle, c'est SYSDATE ;)

Sinon pense bien à utiliser la fonction TO_DATE() pour insérer la valeur en base en précisant le format, car sinon il prendra le format paramétré par défaut dans le SGBD et tu risquerais d'avoir de mauvaises surprises lors de changement de version ou d'environnement :)

Code : Tout sélectionner

TO_DATE('29/06/2007 15:32:50', 'dd/mm/yyyy hh24:mi:ss')
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphant du PHP | 73 Messages

02 juil. 2007, 09:47

Merci de m'avoir éclairé mais j'ai toujours un problème car en fait je ne maitrise pas ma requête sql (j'utilise une library pour faire mes requêtes update/insert).
Il faudrait donc que je puisse mettre la date dans le bon format directement via php et là je suis à nouveau bloqué.

Code : Tout sélectionner

INSERT INTO GEC_PRETS ( GEC_PRET_NUMERO,GEC_PRET_DATE_DEBUT,GEC_PRET_EMPRUNTEUR,GEC_PRET_COMMENTAIRES,GEC_PRET_STATUT,GEC_PRODUIT_NUMERO ) values ( 2300,'ICI IL ME FAUT MA DATE DIRECTEMENT INSERABLE','popo','popo',1,25)
Donc là ou j'ai mis : ICI IL ME FAUT MA DATE DIRECTEMENT INSERABLE et bien c'est ce qu'il me faut :D .

je ne peut pas enlever les ' qui sont dans ma requête :(
Si vous avez une solution à me proposer... moi je n'en voit pas :)

mici

EDIT : je suis effectivement sous oracle et non sous mysql et les TO_DATE ne correspondent pas à ce que je veut car je ne peut pas les faire.
Ce que je cherche à faire c'est mettre une date au format oracle via php.

EDIT2 : J'arrive à récupérer ceci dans ma requete :

Code : Tout sélectionner

INSERT INTO GEC_PRETS ( GEC_PRET_NUMERO,GEC_PRET_DATE_DEBUT,GEC_PRET_EMPRUNTEUR,GEC_PRET_COMMENTAIRES,GEC_PRET_STATUT,GEC_PRODUIT_NUMERO ) values ( 7200,'02/07/2007 11:19','85','85',1,85)
ce format de date ne passe toujours pas :(

EDIT 3 :

A la limite si j'arrivais a faire en sorte d'enlever les quote qui sont avant et après l'ouverture et la fermeture de mes parenthèses ça derait passer non ? mais je n'y arrive pas :

'(to_date(''02/07/2007 12:04'',''DD/MM/YYYY HH24:MI''))' :roll:

EDIT 4 :

Je n'ai même pas besoin d'une variable en fait dans php vu que c'est la date en cour que je veut entrer en base je n'ai qu'a mettre sysdate dans ma requête ! n'empêche que ya toujours les 'sysdate'
nouveau dans le monde du php
Maître du phpinfo() ce n'est pas rien tout de même xD

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 juil. 2007, 15:12

Faudrait voir comment fonctionne la librairie que tu utilises... doit y avoir un moyen pour qu'il ne t'ajoute pas automatiquement les apostrophes (il ne le fait pas sur les nombre, y a peut être donc un moyen de le forcer)
Ou alors envisager une petite bidouille pour qu'il gère un to_date() lorsque tu spécifies une date... de même dans la requête de selection, il faudrait prévoir un to_char() pour convertir la date dans le bon format, quel que soit le langage de la base :)

Le soucis, c'est qu'il n'y a pas de "format de date oracle", il utilise celui défini dans le paramétrage par défaut lors de la création de la base de données (et généralement lié à la fonction de la langue utilisée). Si celui-ci ne changera pas tu peux éventuellement t'en passer en passant en dur le bon format, format que tu devrais trouver ici :

Code : Tout sélectionner

SELECT NLS_DATE_FORMAT FROM nls_database_parameters;
Au pire tu peux le modifier avec un ALTER SESSION pour lui donner le format que tu utilises :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 juil. 2007, 15:38

Bibliothèque ou pas si tu écris SYSDATE dans ta requête ça devra passer, car c'est Oracle qui va l'exécuter pas ta bibliothèque php. sysdate est une fonction oracle qui permet de donner la date du jour automatiquement:

Code : Tout sélectionner

INSERT INTO GEC_PRETS ( GEC_PRET_NUMERO,GEC_PRET_DATE_DEBUT,GEC_PRET_EMPRUNTEUR, GEC_PRET_COMMENTAIRES,GEC_PRET_STATUT,GEC_PRODUIT_NUMERO ) values ( 2300, sysdate, 'popo', 'popo', 1, 25)
ou bien si tu veux utiliser la fonction oracle to_date() pour formater une date donnée tu écrit ceci:

Code : Tout sélectionner

INSERT INTO GEC_PRETS ( GEC_PRET_NUMERO,GEC_PRET_DATE_DEBUT,GEC_PRET_EMPRUNTEUR, GEC_PRET_COMMENTAIRES,GEC_PRET_STATUT,GEC_PRODUIT_NUMERO ) values ( 2300, to_date('02/07/2007', 'dd-mm-yyyy'), 'popo', 'popo', 1, 25)
Et si tu veux faire intervenir php dans tout ça, il suffit de rendre variables les valeurs à transmettre et laisser figés les mot-clés SQL pour Oracle

Code : Tout sélectionner

INSERT INTO GEC_PRETS ( GEC_PRET_NUMERO,GEC_PRET_DATE_DEBUT,GEC_PRET_EMPRUNTEUR, GEC_PRET_COMMENTAIRES,GEC_PRET_STATUT,GEC_PRODUIT_NUMERO ) values ( $pret_numero, to_date('$pret_date_debut', 'dd-mm-yyyy'), '$pret_emprunteur', '$pret_comment', $pre_statut, $gec_produit_numero)
Modifié en dernier par sadeq le 02 juil. 2007, 15:59, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 juil. 2007, 15:58

A priori son problème vient du fait que la librairie qu'il utilise lui colle quoi qu'il arrive des apostrophes autour de sa valeur... :? du coup ses SYSDATE, to_char() et autre se retrouvent formatés comme de bêtes chaines et ne sont pas interprétés par oracle... :(
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 juil. 2007, 16:03

Je ne pense pas, quelle bibliothèque sensée fonctionne ainsi ? elle lui demande une requête SQL, il n'a qu'à donner la requête bien formée. La preuve est qu'il a des données dans le Value qui ne sont pas entourées par des ''.

Qu'en dis-tu Pierig ?
Modifié en dernier par sadeq le 05 juil. 2007, 10:24, modifié 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

02 juil. 2007, 16:38

Aaaah mais j'ai jamais dit qu'il utilisait une bibliothèque sensée ;)
EDIT 3 :

A la limite si j'arrivais a faire en sorte d'enlever les quote qui sont avant et après l'ouverture et la fermeture de mes parenthèses ça derait passer non ? mais je n'y arrive pas :

'(to_date(''02/07/2007 12:04'',''DD/MM/YYYY HH24:MI''))' :roll:

EDIT 4 :

Je n'ai même pas besoin d'une variable en fait dans php vu que c'est la date en cour que je veut entrer en base je n'ai qu'a mettre sysdate dans ma requête ! n'empêche que ya toujours les 'sysdate'
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Invité
Invité n'ayant pas de compte PHPfrance

02 juil. 2007, 17:08

Okay j'ai tout comprit !
J'ai réussi à retrouver la fonction en question ce qui fut laborieux car elle était bien cachée (appellée par la classe de la classe mère d'une de mes classes !!) et jai donc mieux comprit le truc (forcément moi on me dit tu utilise la fonction sauve() et dedans tu met ta requête en variable et ça fait tout...je gobe ça comme ça :lol: ), en fait j'ai des fichiers de mapping de mes table dans lesquels je précise le type(char,number ou date) le truc que je ne savait pas et qu'on ne m'avait pas dit c'est que dedans il me fallait aussi préciser le format donc pour la date il fallait que je mette ceci :


Code : Tout sélectionner

<property name="pret_date_debut" type="date" format='DD/MM/YYYY' column="GEC_PRET_DATE_DEBUT"/>
et non ceci :

Code : Tout sélectionner

<property name="pret_date_debut" type="date" column="GEC_PRET_DATE_DEBUT"/>
car en fait si il n'y a as de format de précisé et bien par défaut (par rapport a un if (mal placé? :s .....) ma variable était considérée comme une chaine !! D'ou les quotes...
On peut dire que j'aurai bien lutter (je suis dessus non stop depuis ce matin :shock: )

Au moins j'aurai apprit pas mal de chose sur les bases de données oracle grâce à vous et ce message qui résume un p'ti peu tout sur les dates devrait pouvoir servir à quelqu'un (si il met de côté le fait que je ne comprenne encore rien au classes...)

Merci encore à vous pour votre temps ! :D

ps : désolé de ne pas vous mettre la fonction mais je ne pense pas que ce serait intéressant vu qu'elle est en fait découpée dans plusieurs classes (une fonction test si il faut faire un update ou un insert , l'autre fait le mapping , l'autre fait encore autre chose etc).

bonne soirée :)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

02 juil. 2007, 19:17

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

02 juil. 2007, 19:59

oops, désolé, Ryle, sa fonction n'est pas comme on pensait, effectivement il passe champ par champ, au temps pour moi :oops:
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène