2017-10-02 38 views
0

OracleでのSQLの基本的な理解をお待ちしています。 私は現在、オブジェクト型のメソッドを持ってしようとしている、私の試みは、次のようになります。私は上記をコンパイルすることができませんオブジェクト型の年齢の計算 - Oracle

CREATE TYPE Person_Type AS OBJECT 
 
(PersonName VARCHAR2(40), 
 
DateBorn DATE, 
 
DateDied DATE, 
 
MEMBER FUNCTION get_age RETURN NUMBER)

CREATE OR REPLACE TYPE BODY Person_Type AS 
 
MEMBER FUNCTION get_age RETURN NUMBER IS 
 
BEGIN 
 
*Some kind of IF DateDied NOT NULL* 
 
RETURN months_between(trunc(sysdate),DateBorn))/12 
 
END;

。最終的に、私はこのメソッドを呼び出して、今日の何人かの年齢を取得できるようにしたい。

私は現在、私のテーブル内の人の年齢を取得することができるよ経由: 選択MONTHS_BETWEEN(TRUNC(SYSDATE)、DateBorn)/ 12 年齢としてperson_table

からしかし、私はこれを希望呼び出し可能なメソッド。

私の理解では、オブジェクト型の中にメソッドを持つこの方法では、取得した行のいずれかのDateBornフォームを使用しますか?私は明らかに非常に間違っていますが、次のステップが何であるか、そして私が現時点でどのように間違っているかを知る必要があります。

ありがとうございます!

+0

あなたの質問は、あなたが 'DateBorn'がNULLの場合、自動的になります結果明らかにあなたがしようとしたものを伝える必要がありますし、あなたの期待出力 – Ravi

+0

何明確ではありませんNULLにもなります。 –

+0

こんにちはRavi、私は今日の日付に基づいてsomeonesの年齢を返す(months_between(trunc(sysdate)、to_date('01 -01-1990 '、' dd-mm-yyyy '))/ 12)を使用することができます10進形式ですが、これをメンバー関数にどのように変換すればよいでしょうか? – lesovren

答えて

0

私は上記をコンパイルすることができません。最終的に私は メソッドを呼び出すことができ、彼らが今日あるsomebodies年齢を得ることができるようにしたい。

あなたのオブジェクト内にMAP MEMBERを使用する必要があります。以下を参照してください:

CREATE TYPE Person_Type AS OBJECT 
(
    PersonName VARCHAR2 (40), 
    DateBorn DATE, 
    DateDied DATE, 
    MAP MEMBER FUNCTION get_age RETURN NUMBER 
) 
/ 
CREATE OR REPLACE TYPE BODY Person_Type 
AS 
    MAP MEMBER FUNCTION get_age 
     RETURN NUMBER 
    IS 
    BEGIN 
     /*Some kind of IF DateDied NOT NULL*/ 
     RETURN ABS(MONTHS_BETWEEN(SYSDATE, DateBorn)/12); 
    END; 
END; 

使用法:

SQL> DECLARE 
     prsn Person_Type; 
     age NUMBER; 
    BEGIN 
     prsn := 
      Person_Type ('XXX', 
        TO_DATE ('01-01-1990', 'dd-mm-yyyy'), 
        TO_DATE ('01-01-2017', 'dd-mm-yyyy')); 

     age := prsn.get_age; 

    DBMS_OUTPUT.PUT_LINE (age); 
    END; 
/

27.752688172043010752688172043010752692 

PL/SQL procedure successfully completed. 

SQL> 
+0

こんにちは、あなたは 'TO_DATE('01 -01-1990'、 'dd-mm-yyyy'))/ BODYの12 'に何を配置するかに基づいて年齢を返しませんか? DateBornの価値観をどうやって得ることができますか? – lesovren

+0

ありがとうございます。私は '2005年10月19日のDateBornを持ち、1942.9086を返したSELECT p.get_age() person_table p ここでp.PersonId = 10000'を実行しようとしました。私はあなたが私に「dd-mon-yyyy」と示された上記を変えました、どこが間違っていますか? – lesovren

+0

@lesovren。その理由は、 'TRUNC SYSDATE'のために、上記のようにフォーマットを変更して正しい結果を得て、 – XING

関連する問題