请原谅我对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表单,无论我检索哪一行?我显然非常错,但只需要知道下一步是什么,以及我现在的错误......
提前致谢!
答案 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>