2017-04-06 10 views
0

私はSQLを初めて使っているので、Pro_DOBを取得して教授を返す関数を作成したいと考えています。コンパイルエラーに関するSQLの関数

ここに私のコードがあります。

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

作成後、コンパイルエラーが表示されます。

どうすれば実行できますか?

+0

ところで、Pro_DOBはすでにスクリプトに格納されていますそれをこの関数に追加します。ありがとうございました。 –

+0

計算に365.25を使用しないでください。代わりに、 'months_between'を使用し、それを12で除算する必要があります。また、' to_date( 'Pro_DBO'、...) Pro_DBO "は日付ではなく、MM/DD/YYYY形式ではありません!その周りから一重引用符を削除します。 – Boneist

+0

また、なぜそのselect文をやっていますか? 2つの列を選択するだけでなく、それらを1つの(レコード/コレクション以外の)変数に戻すだけでなく(エラーになります)、その情報は使用していません。その選択に一致する行が複数ある場合はどうなりますか?渡された生年月日と今日の日付(sysdate)から年齢を計算するだけです。もう何もする必要はありませんよね? – Boneist

答えて

0

「私が取得Pro_DOBで教授の年齢を返す関数を作成したい」ルールの実装では、少し混乱しそうです:

WHERE Pno =Pro_DOB 

は、その本当のロジックです彼らのID(pno)を使って教授の生年月日を調べて年齢を計算したいのですか?

もしそうなら、あなたの関数は次のようになります。

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

日付の計算は、DOBと現在の日付の間の月数を計算する組み込み関数MONTHS_BETWEEN()を使用しています。 Find out more. 12で除算すると年数が与えられ、TRUNC()は整数を保証します。なぜなら、年齢は一般的に年数で表されるからです。

INTO句の変数は、クエリの投影(数値とデータ型)の列と一致する必要があることに注意してください。

「どうすれば実行できますか?」

関数は何かに割り当てる必要がある値を返します。だから、SQL * Plusで、この無名PL/SQLブロックを実行することができます:

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> 

またあなたは、単にこの誕生

の合格日から
create or replace function calc_age 
    (p_dob in date) 
    return number 
is 
begin 
    return trunc(months_between(sysdate, p_dob)/12); 
end; 
/

を、年齢を計算する関数を書くことができあなたは次のようなクエリに含めることができます:

select pno       
     , pro_dob 
     , calc_age(pro_dob) as pro_age 
from professors 
/
関連する問題