共有三个表表 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;

解决方案 »

  1.   

    第一作为应届毕业生或者无业人员,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;
      

  2.   

    如果参数rq的日期格式是精确到天的(例如:YYYY-MM-DD),那条件应该修改为  select nvl(afterdwid,-1) into Result 
        from dwchange
       where to_date(changedate) <= rq
         and rownum = 1
       order by changedate desc;