IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Problème type DATE et fonctions PL/SQL


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Problème type DATE et fonctions PL/SQL
    Bonjour,
    j'ai une procédure PL/SQL qui crée un formulaire HTML dans lequel on peut saisir un nom, un prénom et une date de naissance.
    Je souhaite que l'utilisateur saisisse sa date de naissance sous ce format : 01/01/01 par exemple.
    Cependant quand je fais un "INSERT" dans ma table, je suis obligé de mettre la date dans se format : "DD-MON-YY" pour que le SGBD veuille l'insérer. Une fois que l'insertion est réussie, la date dans la table est sous ce format : "DD/MM/YY". C'est là que le problème se situe car je ne souhaite pas que l'utilisateur saisisse la date : "01-JAN-01" mais bien 01/01/01. J'ai vu sur des forums/sites qu'il fallait utiliser la fonction "to_date" mais je ne sais pas comment faire pour l'utiliser correctement avant l'insertion car si je fais : to_date(ma_date, 'DD-MON-YY') ORACLE renvoie une erreur et me dit que le format de mois est incorrect et si je met 'DD/MM/YY' il me dit la même erreur et l'insertion est impossible.

    Une autre question, est-ce que quelqu'un sait comment appeler dans une procédure SQL une fonction SQL ?
    Parce que dans une procédure j'arrive à appeler ma procédure mais vu que ma fonction retourne 2 paramètres je ne sais pas comment l'appeler. Exemple :

    test := supEmp(nom_emp, prenom_emp)

    Ceci ne peux pas marcher car il y a 2 paramètres mais lorsqu'il y en a 1 seul ça ne semble pas marcher pour autant.
    Merci pour vos réponses.

  2. #2
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par craweb
    Bonjour,
    j'ai une procédure PL/SQL qui crée un formulaire HTML dans lequel on peut saisir un nom, un prénom et une date de naissance.
    Je souhaite que l'utilisateur saisisse sa date de naissance sous ce format : 01/01/01 par exemple.
    Cependant quand je fais un "INSERT" dans ma table, je suis obligé de mettre la date dans se format : "DD-MON-YY" pour que le SGBD veuille l'insérer. Une fois que l'insertion est réussie, la date dans la table est sous ce format : "DD/MM/YY". C'est là que le problème se situe car je ne souhaite pas que l'utilisateur saisisse la date : "01-JAN-01" mais bien 01/01/01. J'ai vu sur des forums/sites qu'il fallait utiliser la fonction "to_date" mais je ne sais pas comment faire pour l'utiliser correctement avant l'insertion car si je fais : to_date(ma_date, 'DD-MON-YY') ORACLE renvoie une erreur et me dit que le format de mois est incorrect et si je met 'DD/MM/YY' il me dit la même erreur et l'insertion est impossible.
    Pour le to_date, tu dois mentionner le format de date saisi qu'il y a dans le premier argument.
    Exemple, tu saisis 31/12/06, donc tu mentionnes DD/MM/YY.
    to_date('31/12/06','DD/MM/YY').

    Citation Envoyé par craweb
    Une autre question, est-ce que quelqu'un sait comment appeler dans une procédure SQL une fonction SQL ?
    Parce que dans une procédure j'arrive à appeler ma procédure mais vu que ma fonction retourne 2 paramètres je ne sais pas comment l'appeler. Exemple :

    test := supEmp(nom_emp, prenom_emp)

    Ceci ne peux pas marcher car il y a 2 paramètres mais lorsqu'il y en a 1 seul ça ne semble pas marcher pour autant.
    Merci pour vos réponses.
    supEmp est une fonction ou une procédure ? Parce qu'une fonction ne retourne qu'une valeur, jamais plus, ce n'est pas possible. Dans ton cas, c'est test qui prendra la valeur retournée.
    Une procédure peut renvoyer ou pas une ou des valeurs. Dans ce cas l'appel se fera par exemple comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my_proc(param1_in, param2_in, param1_out, param2_out);
    Nicolas.

  3. #3
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 41
    Points : 43
    Points
    43
    Par défaut
    pour la date tu peux utiliser la combinaison de to_char et to_date
    exp pour avoir 01/01/01 si date en 01-JAN-01 faire to_date(to_char(ma_date,'DD/MM/YY'),'DD/MM/YY')

  4. #4
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    tout d'abord merci pour vos réponses mais j'ai toujours un problème.
    Je vais mettre mon code pour voir si vous trouvez ce qui ne va pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE PROCEDURE saisieSupEmp (s_date_nais_emp date DEFAULT NULL
    ...) IS
     
    BEGIN
    ...
    HTP.tableData('Date de naissance de l''employe : ') ;
    HTP.tableData(HTF.formText(cname=>'s_date_nais_emp', cvalue=>s_date_nais_emp, csize=>'10')) ;
    ...
    supEmp(to_date(s_date_nais_emp,'DD/MM/RR')) ;
    ...
    END saisieSupEmp ;
    /
    Maintenant le code dans supEmp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE OR REPLACE PROCEDURE supEmp (v_date_nais_emp date) IS
    BEGIN
    HTP.tableData(cvalue=>v_date_nais_emp) ;
    END supEmp ;
    /
    Je met juste un tableData pour voir le résultat.
    Quand je remplis mon formulaire, et que je clique sur "envoyer" pour envoyer ce que j'ai tappé ex: '03/02/80'
    Voilà l'erreur ORACLE que j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORA-01843: not a valid month
    J'ai cette erreur en testant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    to_date(s_date_nais_emp,'DD/MM/RR')
    et
    to_date(to_char(s_date_nais_emp,'DD/MM/YY')
    Donc là je vois plus trop quoi faire si vous avez une idée...

    Mon autre problème et là c'est plus important car encore la date bon je peux dire à l'utilisateur de la rentrer sous le format DD-Mon-YY mais là je suis totalement bloqué.
    Dans la procédure "supEmp" je fais appel à ma fonction : "selectFct" comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    v_fonction_emp := selectFct(v_num_emp) ;
    puis je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delete from v_fonction_emp where num_emp = v_num_emp ;
    Et dans "selectFct" j'ai ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    BEGIN
    	SELECT fonction into v_fonction
    	from view_fonction_employe
    	where num_emp = v_num_emp ;
     
    	return (v_fonction) ;
    END selectFct ;
    Le problème est que la table view_fonction_employe n'existe pas, c'est une vue composée d'un numéro d'employé : "num_emp" et de l'attribut "fonction" qui est dans mon "select".
    Donc lorsque j'essaye de créer ma procédure supEmp en fesant "@supEmp" j'ai cette erreur ORACLE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PL/SQL: ORA-00942: table or view does not exist
    Alors que précédemment j'avais crée la vue et il m'avait dit "view created" donc la vue existe et la fonction "selectFct" est crée sans problèmes mais apparement il ne peux pas accéder à la vue via la fonction donc comment faire autrement ?

    Merci pour vos réponses.

  5. #5
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par craweb
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE OR REPLACE PROCEDURE saisieSupEmp (s_date_nais_emp date DEFAULT NULL
    ...) IS
     
    BEGIN
    ...
    HTP.tableData('Date de naissance de l''employe : ') ;
    HTP.tableData(HTF.formText(cname=>'s_date_nais_emp', cvalue=>s_date_nais_emp, csize=>'10')) ;
    ...
    supEmp(to_date(s_date_nais_emp,'DD/MM/RR')) ;
    ...
    END saisieSupEmp ;
    /
    Pourquoi faire un to_date sur la varable s_date_nais_emp qui est déjà définie comme une date ?
    Essaies de remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    supEmp(s_date_nais_emp) ;
    Nicolas.

  6. #6
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Parce que si je récupère la date directement : "21/01/80" l'insertion est impossible, il y a un problème avec le mois. Si je fais mon insert avec 21-JAN-80 ça marche mais avec la date écrite comme ceci.

    Si ça peut aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select VALUE from V$NLS_PARAMETERS where PARAMETER='NLS_DATE_FORMAT'
    Renvoie :
     
    VALUE
    DD/MM/RR
     
    SELECT * FROM v$version
    Renvoie :
    BANNER
    Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit Production
    PL/SQL Release 9.2.0.3.0 - Production
    C'est ça le pire c'est que je dois dans mon "insert" faire "insert into table('01-JAN-01)" par exemple alors qu'après ORACLE la convertit et dans ma base la date est écrite : "01/01/01".

  7. #7
    Membre confirmé Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Points : 603
    Points
    603
    Par défaut
    J'avoue avoir vraiment du mal à suivre.
    Tes fonctions changent tout le temps.
    S'il te plait, colles ici le code un peu plus cohérent, ou bien fais des petites fonctions pour tester et colles ici le code et le test exact qui ne marche pas.

    Le format de date est session dépendant, il dépend d'une config sur le poste, c'est pour çà qu'il vaut mieux faire sur le champs lui-même un to_date adéquate.

    Enfin, tu ne peux pas faire un delete sur une fonction comme si s'était une table.
    Le mélange des problèmes ajoute un peu de confusion ici.

    Nicolas.

  8. #8
    Futur Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre aide et tout particulièrement celle de Nicolas.
    Les fonctions marchent enfin !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD12] probléme de date entre WD12 et SQL server 2005
    Par Bassemca dans le forum WinDev
    Réponses: 5
    Dernier message: 19/12/2008, 21h27
  2. Réponses: 10
    Dernier message: 26/11/2008, 18h13
  3. Problème renvoie de valeurs (Fonction Transact SQL)
    Par chicken92000 dans le forum Développement
    Réponses: 1
    Dernier message: 12/09/2008, 15h18
  4. [Dates] Problème de date / recherche fonction
    Par Fluxy dans le forum Langage
    Réponses: 2
    Dernier message: 23/07/2007, 19h12
  5. Problème de date dans fonction utlisateur
    Par lutin2003 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/04/2005, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo