此函数如何建

此函数怎么建
共有三个表

表   dw     单位表
        dwid       NUMBER(10,0)     //单位id
        dwname   VARCHAR2(10)     //   单位名称
表   person   个人表
CREATE   TABLE   "QHF ". "PERSON "  
      ( "PERSONID "   NUMBER(10,0)   NOT   NULL   ENABLE,   //   个人id
"NAME "   VARCHAR2(10)   NOT   NULL   ENABLE,           //   个人名称
"DWID "   NUMBER(10,0)   NOT   NULL   ENABLE             //   现在个人所有单位
      )
表   DWCHANGE     //记录一个人的单位变动表
CREATE   TABLE   "DWCHANGE "  
      ( "PERSONID "   NUMBER(10,0)   NOT   NULL   ENABLE,       //个人id
"BEFOREDWID "   NUMBER(10,0)   NOT   NULL   ENABLE,   //变动前单位id
"AFTERDWID "   NUMBER(10,0)   NOT   NULL   ENABLE,     //变动后单位id
"CHANGEDATE "   DATE   NOT   NULL   ENABLE                     //变动日期  
      )  
我要建一个函数
create   or   replace   function   getdwid(grid   in   number,rq   in   date)   return   number   is
    Result   number;
begin
    通过传入参数   grid     为personid
                              rq         为日期
  这里编程   返回     这人在这个时间   他所在的单位   id

    return(Result);
end   getdwid;

------解决方案--------------------
第一作为应届毕业生或者无业人员,beforedwid可能是空,所以不可以设计成not null(非空)

第二
create or replace function getdwid(grid in number,rq in date) return number is
Result number;
begin
result := 0;

select nvl(afterdwid,-1) into Result
from dwchange
where changedate <= rq
and rownum = 1
order by changedate desc;

--(-1代表无效返回)
return(Result);
end getdwid;

------解决方案--------------------
如果参数rq的日期格式是精确到天的(例如:YYYY-MM-DD),那条件应该修改为

select nvl(afterdwid,-1) into Result
from dwchange
where to_date(changedate) <= rq
and rownum = 1
order by changedate desc;