が
「私が取得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
/
出典
2017-04-09 06:44:13
APC
ところで、Pro_DOBはすでにスクリプトに格納されていますそれをこの関数に追加します。ありがとうございました。 –
計算に365.25を使用しないでください。代わりに、 'months_between'を使用し、それを12で除算する必要があります。また、' to_date( 'Pro_DBO'、...) Pro_DBO "は日付ではなく、MM/DD/YYYY形式ではありません!その周りから一重引用符を削除します。 – Boneist
また、なぜそのselect文をやっていますか? 2つの列を選択するだけでなく、それらを1つの(レコード/コレクション以外の)変数に戻すだけでなく(エラーになります)、その情報は使用していません。その選択に一致する行が複数ある場合はどうなりますか?渡された生年月日と今日の日付(sysdate)から年齢を計算するだけです。もう何もする必要はありませんよね? – Boneist