2015-06-08 23 views
-1

我想寫一個返回ROWTYPE的函數,但它應該只返回一條記錄。PL/SQL從函數返回ROWTYPE

這裏是我的功能:

FUNCTION f_get_lastest_by_id (p_id IN T_PERSON_ATTRIBUTE.ID%TYPE) 
     RETURN T_PERSON_ATTRIBUTE%ROWTYPE 
    IS 
     out_rec T_PERSON_ATTRIBUTE%ROWTYPE; 
    BEGIN 
     SELECT * 
      INTO out_rec 
      FROM T_PERSON_ATTRIBUTE 
     WHERE ID = p_id 
     ORDER BY EFFECTIVE_DATE DESC 
     OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY; 

     RETURN out_rec; 
    END; 

我也試過

FUNCTION f_get_lastest_by_id (p_id IN T_PERSON_ATTRIBUTE.ID%TYPE) 
     RETURN T_PERSON_ATTRIBUTE%ROWTYPE 
    IS 
     out_rec T_PERSON_ATTRIBUTE%ROWTYPE; 
    BEGIN 
     SELECT * 
      INTO out_rec 
      FROM T_PERSON_ATTRIBUTE 
     WHERE ID = p_id 
     ORDER BY EFFECTIVE_DATE DESC 
     LIMIT 1; 

     RETURN out_rec; 
    END; 

其中非將編譯。

+0

PL \ SQL中沒有'limit'子句,只是刪除它 –

+0

但該查詢可以返回多行,主鍵是複合鍵,Oracle是否忽略其餘記錄? – greyfox

+0

您正在通過ID進行選擇,但不能在此處顯示多行。在多行的情況下會發生'TOO_MANY_ROWS'異常,如果沒有行,我們將得到'NO_DATA_FOUND'異常 –

回答

0

要只返回您的查詢返回的第一條記錄做:

... 
begin 
    for rec in (select * 
       from t_person_attribute 
       where id = p_id 
      order by effective_date desc) loop 
    return rec; -- just return the first one we find 
    end loop; 
end; 

你正在嘗試與返回多個記錄(order by儘管)查詢一個select...into...。這在PL/SQL中不起作用。那,你正在嘗試Oracle方言中不存在的各種SQL關鍵字。