【问题标题】:Calculating Age in Object Type FUNCTION - Oracle计算对象类型 FUNCTION 的年龄 - Oracle
【发布时间】:2017-10-02 08:29:34
【问题描述】:

请原谅我对 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;

我无法编译上述内容。最终,我希望能够调用该方法并让某些人达到今天的年龄。

我可以通过以下方式检索当前在我的表中的人的年龄: 选择months_between(TRUNC(sysdate),DateBorn)/12 作为 person_table 的年龄

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

根据我的理解,这种在对象类型中使用方法的方式将使用我检索到的任何行的 DateBorn 表单?我显然是非常错误的,但只需要知道下一步是什么以及我现在有多不正确......

提前致谢!

【问题讨论】:

  • 你的问题不清楚,你需要清楚地告诉你你尝试了什么以及你的预期输出是什么
  • 如果DateBorn 为NULL,那么结果也将自动为NULL。
  • 嗨 Ravi,我可以使用 (months_between(trunc(sysdate),to_date('01-01-1990', 'dd-mm-yyyy'))/12) 来返回某人基于今天日期的年龄转换为十进制格式,但我如何将其转换为成员函数?

标签: oracle function plsql


【解决方案1】:

我无法编译上述内容。最终我希望能够 调用该方法并获取某人今天的年龄。

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

【讨论】:

  • 嗨,Xing,这不会根据您放入身体的 'TO_DATE('01-01-1990', 'dd-mm-yyyy'))/12 ' 中的内容返回年龄吗?我将如何获取 DateBorn 的值?
  • 感谢您回答这个问题。我只是尝试运行'SELECT p.get_age() from person_table p where p.PersonId = 10000',它的 DateBorn 为 05-OCT-1975,它返回 1942.9086。我已将您显示给我的上述内容更改为“dd-mon-yyyy”,它会哪里出错?
  • @lesovren。因为TRUNC SYSDATE,按照上面更新的格式改一下就可以得到正确的结果了,
猜你喜欢
  • 1970-01-01
  • 2013-06-29
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 2012-03-26
  • 1970-01-01
  • 2020-12-28
  • 2016-03-20
相关资源
最近更新 更多