« Je veux créer une fonction que le retour des professeurs âge en obtenir le Pro_DOB »
Votre mise en œuvre des règles semble un peu confus:
WHERE Pno =Pro_DOB
est la vraie logique vous voulez rechercher la date de naissance du professeur en utilisant leur ID (pno
) et ensuite calculer leur âge?
Si oui, votre fonction doit ressembler à ceci:
create or replace function pro_age
(p_id in professors.pno%type)
return number
is
current_age number;
begin
select trunc(months_between(sysdate, pro_dob)/12)
into current_age
from professors
where pno = p_id;
return current_age;
end;
/
L'arithmétique date utilise la fonction intégrée MONTHS_BETWEEN()
pour calculer le nombre de mois entre la date de naissance et la date actuelle. Find out more. Diviser par 12 donne le nombre d'années et le TRUNC()
assure un nombre entier, car l'âge est généralement exprimé en années entières.
Notez que les variables de la clause INTO
doivent correspondre aux colonnes de la projection de la requête (nombre et type de données).
"comment puis-je l'exécuter?" Les fonctions renvoient une valeur que nous devons assigner à quelque chose.
Ainsi, vous pouvez exécuter ce bloc anonyme PL/SQL dans SQL * Plus:
SQL> var age number
SQL> accept professor_id prompt "please enter PNO for professor: "
please enter PNO for professor: 123
SQL> begin
2 :age := pro_age(&professor_id);
3 end;
4/
PL/SQL procedure successfully completed.
SQL> print age
AGE
----------
32
SQL>
Sinon, vous pouvez simplement écrire une fonction qui calcule l'âge à partir d'une date passée de naissance
create or replace function calc_age
(p_dob in date)
return number
is
begin
return trunc(months_between(sysdate, p_dob)/12);
end;
/
Cette fonction que vous pourriez inclure dans une requête comme ça:
select pno
, pro_dob
, calc_age(pro_dob) as pro_age
from professors
/
Par ailleurs, le Pro_DOB est déjà stocker dans le script, je veux juste récupérer dans cette fonction. Je vous remercie. –
N'utilisez pas 365.25 pour faire vos calculs - au lieu de cela, vous devriez utiliser 'months_between', et ensuite diviser par 12. En outre, vous avez' to_date ('Pro_DBO', ...) '... La chaîne" Pro_DBO "n'est pas une date et ce n'est certainement pas au format MM/JJ/AAAA! Enlevez les guillemets simples autour de lui. – Boneist
En outre, pourquoi faites-vous cette instruction select? Non seulement vous sélectionnez deux colonnes, mais vous ne les renvoyez que dans une seule variable (non-enregistrement/collection) (ce qui produira une erreur), vous n'utilisez donc aucune des informations. Et que se passe-t-il si plusieurs lignes correspondent à cette sélection? Vous avez juste besoin de calculer l'âge de la date de naissance passée, et la date d'aujourd'hui (sysdate). Pas besoin de rien d'autre, non? – Boneist