"呼叫'>'"""""在比较PLSQL中的日期时

时间:2017-03-26 15:11:01

标签: sql oracle

这是我的代码。我为什么要到这个例外?它是同一类型的! mitarbeitergehalt.gueltigab = DATE.

CREATE OR REPLACE FUNCTION fu_gehalt_am(p_maID IN mitarbeiter.mitarbeiterid%TYPE
                                       ,p_Date IN mitarbeitergehalt.gueltigab%TYPE)
RETURN NUMBER AS
  v_gehalt mitarbeitergehalt.gehalt%TYPE DEFAULT 0;
BEGIN
  FOR v_dates IN (SELECT gueltigab
                  FROM mitarbeitergehalt
                  WHERE mitarbeiterid = p_maID
                  ORDER BY 1)      
  LOOP
    IF v_dates > p_Date THEN <--------------------------------------- HERE!!
      SELECT gehalt
      INTO v_gehalt
      FROM mitarbeitergehalt
      WHERE v_dates = gueltigab AND mitarbeiterid = p_maID;

      RETURN gehalt;
    END IF;
  END LOOP;
  RETURN 0;
END;
/

1 个答案:

答案 0 :(得分:1)

对于您的原始问题,这是固定代码。

CREATE OR REPLACE FUNCTION fu_gehalt_am(p_maID IN mitarbeiter.mitarbeiterid%TYPE
                                       ,p_Date IN mitarbeitergehalt.gueltigab%TYPE)
RETURN NUMBER AS
  v_gehalt mitarbeitergehalt.gehalt%TYPE DEFAULT 0;
BEGIN
  FOR v_dates IN (SELECT gueltigab
                  FROM mitarbeitergehalt
                  WHERE mitarbeiterid = p_maID
                  ORDER BY 1)      
  LOOP
    IF v_dates.gueltigab > p_Date THEN <----------- HERE!!
      SELECT gehalt
      INTO v_gehalt
      FROM mitarbeitergehalt
      WHERE v_dates.gueltigab = gueltigab AND mitarbeiterid = p_maID;  <--- and here

      RETURN v_gehalt;  <------ and here.
    END IF;
  END LOOP;
  RETURN 0;
END;
/

但我认为您可以使用select intoDENSE_RANK FIRST代替循环来简化它:

CREATE OR REPLACE FUNCTION fu_gehalt_am(p_maID IN mitarbeiter.mitarbeiterid%TYPE
                                       ,p_Date IN mitarbeitergehalt.gueltigab%TYPE)
RETURN NUMBER AS
  v_gehalt mitarbeitergehalt.gehalt%TYPE DEFAULT 0;
BEGIN
    select coalesce(max(gehalt) over (dense_rank first order by gueltigab), 0)
    into v_gehalt
    from mitarbeitergehalt
    where mitarbeiterid = p_maID
        and gueltigab > p_Date;
    return v_gehalt;
END;
/