2017-04-06 2 views
0

Je suis nouveau au SQL, je veux créer une fonction que les professeurs de retour vieillissent en obtenant le Pro_DOB.Fonction dans SQL sur l'erreur de compilation

ICI sont mon code.

Create or Replace FUNCTION pro_age 
(Pro_DOB IN DATE) 
RETURN NUMBER 
IS 
current_age NUMBER; 
BEGIN 
SELECT Pro_DOB,Pno INTO current_age FROM(Select Pro_DOB,Pno FROM professors) 
WHERE Pno =Pro_DOB; 
current_age:=Trunc((SYSDATE - TO_DATE('Pro_DOB', 'MM/DD/YYYY'))/365.25); 
RETURN current_age; 
END; 
/

Il me montre une erreur de compilation après l'avoir créé.

Et comment puis-je l'exécuter?

+0

Par ailleurs, le Pro_DOB est déjà stocker dans le script, je veux juste récupérer dans cette fonction. Je vous remercie. –

+0

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

+0

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

Répondre

0

« 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 
/