2017-03-26 47 views
0

這是我的代碼。爲什麼我在這裏得到這個異常?它屬於同一類型! mitarbeitergehalt.gueltigab = DATE.「在PLSQL中比較日期時,調用'>'時出現錯誤的參數數量或類型

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

什麼是表的定義第'mitarbeitergehalt'? –

+2

它應該是'IF v_dates.gueltigab> p_Date',因爲'v_dates'是一個不是DATE變量的遊標變量, –

+0

謝謝Tony! – asparagus

回答

2

對於您原來的問題,這裏是固定的代碼。

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; 
/
相關問題