Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/02/2007, 16h48   #1
Invité de passage
 
Étudiant
Inscription : 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 : 1
Points : 1
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.
craweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2007, 17h58   #2
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
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 :
my_proc(param1_in, param2_in, param1_out, param2_out);
Nicolas.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2007, 19h10   #3
Nouveau Membre du Club
 
Inscription : novembre 2005
Messages : 41
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 41
Points : 33
Points : 33
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')
ktano est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2007, 14h58   #4
Invité de passage
 
Étudiant
Inscription : 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 : 1
Points : 1
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 :
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 :
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 :
1
2
 
ORA-01843: NOT a valid month
J'ai cette erreur en testant :
Code :
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 :
1
2
 
v_fonction_emp := selectFct(v_num_emp) ;
puis je fais :
Code :
1
2
 
DELETE FROM v_fonction_emp WHERE num_emp = v_num_emp ;
Et dans "selectFct" j'ai ceci :
Code :
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 :
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.
craweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2007, 15h17   #5
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
Citation:
Envoyé par craweb
Code :
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 :
supEmp(s_date_nais_emp) ;
Nicolas.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2007, 15h21   #6
Invité de passage
 
Étudiant
Inscription : 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 : 1
Points : 1
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 :
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".
craweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2007, 15h33   #7
Membre expérimenté

 
Avatar de NGasparotto
 
Nicolas Gasparotto
Inscription : janvier 2007
Messages : 424
Détails du profil
Informations personnelles :
Nom : Nicolas Gasparotto

Informations forums :
Inscription : janvier 2007
Messages : 424
Points : 500
Points : 500
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.
NGasparotto est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2007, 18h52   #8
Invité de passage
 
Étudiant
Inscription : 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 : 1
Points : 1
Merci pour votre aide et tout particulièrement celle de Nicolas.
Les fonctions marchent enfin !
craweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h26.


 
 
 
 
Partenaires

Hébergement Web