这是我的代码。我为什么要到这个例外?它是同一类型的! 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;
/
答案 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 into
和DENSE_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;
/