计算对象类型的年龄功能 - Oracle

时间:2017-10-02 08:29:35

标签: oracle function plsql

请原谅我对Oracle中SQL的极为基本的理解。 我目前正在尝试在对象类型中使用方法,我的尝试看起来像这样:

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;

我无法通过以上方式进行编译。最终,我希望能够调用该方法,并让他们今天的身体年龄。

我可以通过以下方式检索当前在我桌子内的人的年龄: select months_between(TRUNC(sysdate),DateBorn)/ 12 来自person_table的年龄

但我希望这是一种可调用的方法。

我的理解,这种在对象类型中使用方法的方法会使用DateBorn表单,无论我检索哪一行?我显然非常错,但只需要知道下一步是什么,以及我现在的错误......

提前致谢!

1 个答案:

答案 0 :(得分:0)

  

我无法通过以上方式进行编译。最终我希望能够   打电话给这个方法,让他们今天变得年轻。

您需要在对象中使用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>