[PHP] oracle et paramètre de type date ( ou alors sysdate ;) )

oracle et paramètre de type date ( ou alors sysdate ;) ) [PHP] - PHP - Programmation

Marsh Posté le 28-01-2008 à 19:16:19    

salut !
 
j'ai un gros problème, j'ai un appel à une fonction oracle qui ne marche pas  :(  
après moult débogages j'ai enfin qualifié mon problème ;)
c'est une date qui n'arrive pas à passer à ma fonction
donc je me suis fait une fonction toute simple que j'appelle comme ca :

Code :
  1. $sqls = "declare result varchar2(40);\n";
  2.   $sqls .= "BEGIN\n";
  3.   $sqls .= " result := test_variable_out(:un, :deux, :trois, :quatre);\n";
  4.   $sqls .= "END;\n";


 
:deux est le paramètre qui doit être une date, tout les autres sont varchar2
:trois est un paramètre out ( un autre test ;) )
 
ensuite :
 

Code :
  1. $stmt = ociparse($con, $sqls);
  2. $un = "'1'";
  3. $deux = "'22-NOV-06'";
  4. $deux = "28-Janv-1999";
  5. $deux = "28-janv.-2008 05:38:35 PM";
  6. $trois = "";
  7. $quatre= "'3'";
  8. ocibindbyname($stmt, ":un", &$un, -1);
  9. ocibindbyname($stmt, ":deux", &$deux, -1);
  10. ocibindbyname($stmt, ":trois", &$trois, -1);
  11. ocibindbyname($stmt, ":quatre", &$quatre, -1);
  12. $rsResult = OCIExecute($stmt);
  13. if ($rsResult)
  14. {
  15.   //return $result;
  16. }
  17. else
  18. {
  19.   $e = oci_error($stmt);
  20.   echo htmlentities($e['message']);
  21.   echo '<pre>';
  22.   echo htmlentities($e['sqltext']);
  23.   printf("\n%" . ($e['offset'] + 1) . "s", "^" );
  24.   echo '</pre>';
  25.   OCIFreeStatement($stmt);
  26.   OCILogoff();}
  27. OCIFreeStatement($stmt);
  28. OCILogoff();


 
et voilà l'erreur que je recois : (comme on voit ci-dessus j'ai déjà essayé pas mal de format  :whistle: )
 
ORA-01841: (full) year must be between -4713 and +9999, and not be 0 ORA-06512: at line 3
 
 
une idée ?
en même temps, je préférerais quand même lui passer la fonction sysdate ..
 

Reply

Marsh Posté le 28-01-2008 à 19:16:19   

Reply

Marsh Posté le 28-01-2008 à 21:44:11    


 
Et si tu enlève le zéro devant le 6 à la date de deux de la ligne 3 ?


Message édité par Profil supprimé le 28-01-2008 à 21:44:28
Reply

Marsh Posté le 28-01-2008 à 21:53:26    

Ces encapsulations sont bien compliquées, une petite usine à gaz pour pas grand chose.
Que cache test_variable_out ? Un select, update, insert ?
Supposons que c'est un insert.
 
Essayer ceci :

$sqls = "insert into la_table(colonne_date, colonne_chaine)"
$sqls = $sqls . " values(sysdate, :un)"
$sqls = $sqls . " returning res into :result"
$stmt = ociparse($con, $sqls);
ocibindbyname($stmt, ":un", &$un, -1);
ocibindbyname($stmt, ":result", &$rsResult, -1);"

Ou

$deux = "28-01-1999";
$sqls = "insert into la_table(colonne_date, colonne_chaine)"
$sqls = $sqls . " values(to_date(:deux, 'dd-mm-yyyy'), :un)"
$sqls = $sqls . " returning res into :result"
$stmt = ociparse($con, $sqls);
ocibindbyname($stmt, ":un", &$un, -1);
ocibindbyname($stmt, ":deux", &$deux, -1);
ocibindbyname($stmt, ":result", &$rsResult, -1);"

Sur la page http://us.php.net/manual/en/function.ocibindbyname.php vous trouverez un exemple d'insertion de date.


Message édité par olivthill le 28-01-2008 à 21:54:37
Reply

Marsh Posté le 29-01-2008 à 13:18:05    

salut !
 
merci pour les réponses ;)
 
jovalise -- ça peut paraître idiot mais j'avais déjà essayé ;)
 
olivthill -- test_variable_out c'est juste un test pour pouvoir passer une date à l'appel d'une fonction, ensuite la vrai fonction que je veux appeler fais des tonnes de trucs donc pas possible de remplacer par une seule requête
j'avais déjà essayé avec sysdate en paramêtre mais ca voulait pas fonctionner, il me disait que tout les params n'étaient pas bindés évidemment
 
mais le coup du to_date(:deux, 'dd-mm-yyyy') j'ai pas essayé, je teste ca dans l'après-midi ;)

Message cité 1 fois
Message édité par bill_clinton le 29-01-2008 à 13:20:44
Reply

Marsh Posté le 29-01-2008 à 15:38:45    

bill_clinton a écrit :

le coup du to_date(:deux, 'dd-mm-yyyy') j'ai pas essayé, je teste ca dans l'après-midi ;)


c'est le plus simple pour manipuler des dates quand tu n'es pas sûr du format à utiliser...


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

Marsh Posté le 29-01-2008 à 20:27:04    

re-salut !
 
j'ai finalement pris le to_date à mettre dans le sql :
 

Code :
  1. $sqls = "declare result varchar2(40);\n";
  2. $sqls .= "BEGIN\n";
  3. $sqls .= " result := test_variable_out(:un, to_date(:deux, 'dd-mm-yyyy'), :trois, :quatre);\n";
  4. $sqls .= "END;\n";
  5. $stmt = ociparse($con, $sqls);
  6. $un = "'1'";
  7. $deux = '28-01-2008';
  8. $trois = "''";
  9. $quatre= "'3'";
  10. ocibindbyname($stmt, ":un", &$un, -1);
  11. ocibindbyname($stmt, ":deux", &$deux, -1);
  12. ocibindbyname($stmt, ":trois", &$trois, -1);
  13. ocibindbyname($stmt, ":quatre", &$quatre, -1);


 
évidemment ca va pas être utilisé tel quel dans le code, j'ai un module d'accès aux données qui va s'en charger, donc je lui passerais juste les paramètres avec leurs types dans une collection et la fonction qui exécute les fonctions stockées se chargera ou non de mettre le to_date pour les valeur de paramètres concernés.
 
 
merci :)


Message édité par bill_clinton le 29-01-2008 à 20:46:11
Reply

Sujets relatifs:

Leave a Replay

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