2013-05-12 31 views
3

嘗試創建基於pl/sql遊標的函數以從Oracle數據庫返回詳細信息。Oracle包或函數處於無效狀態

相關表格,MEETING,有列 MEETING_ID:數(10),TIME:時間戳(4),TITLE:VARCHAR(20)

CREATE OR REPLACE FUNCTION GetMeeting 
        (meetingnumber MEETING.MEETING_ID%TYPE) 
RETURN VARCHAR 
IS 
    CURSOR current_meeting(meetingnumber MEETING.MEETING_ID%TYPE) 
    IS 
     SELECT TITLE, TIME 
     FROM MEETING 
     WHERE MEETING_ID = meetingnumber; 

    r_meeting current_meeting%ROWTYPE; 
BEGIN 
    OPEN current_meeting(meetingnumber); 

    FETCH current_meeting INTO r_meeting; 

    IF current_meeting%NOTFOUND THEN 
     r_meeting.TITLE := 'UNKNOWN APPOINTMENT'; 
     END IF; 

     CLOSE current_meeting; 

     RETURN r_meeting.TITLE; 
    END; 


SELECT GetMeeting (27) name 
FROM MEETING; 

的功能似乎編譯正常 - 但是當所謂拋出

ORA-06575:包裝或功能GETMEETING處於無效狀態

+0

該函數是否說它已成功編譯或成功地發出警告?如果後者可以在之後立即執行「顯示錯誤」。你也可以稍後'顯示錯誤函數getmeeting',看看它爲什麼無效。但是當你可能得到'%notfound'時,你從'r_meeting'返回一個值,這在運行時可能是一個問題?也許更重要的是,將返回值聲明爲'varchar'而不是'varchar2'可能是個問題,但我不會這麼想的。 – 2013-05-12 13:40:36

+0

這似乎沒有任何問題。用你的表格定義函數編譯並運行OK。你怎麼稱呼它沒有意義,但我認爲這是一個考驗。更新'r_meeting'值可能不正常,但似乎工作正常。 – 2013-05-12 13:51:47

+0

它只是說:「功能創建」。試圖啓用顯示錯誤;導致編譯器去香蕉「遇到符號」SHOW「」 – user137263 2013-05-12 13:52:14

回答

1

或許這將更好地爲您:

create or replace function 
    getmeeting(
    meeting_id number) 
return 
    varchar 
is 
    meeting_title meeting.title%Type; 
begin 
    select title 
    into meeting_title 
    from meeting 
    where meeting_id = getmeeting.meeting_id; 

    return meeting_title; 
exception 
    when NO_DATA_FOUND then 
    return 'UNKNOWN APPOINTMENT'; 
end; 
/

不語法檢查。

0

由作爲SQL關鍵字的列標識符'TIME'生成錯誤;執行時觸發運行時錯誤。當「時間」被刪除

+0

反正這個值沒有被使用,所以你不妨刪除它。然而,這似乎並不是對這個問題的回答。 – 2013-05-12 15:08:12

+0

問題是關於oracle生成的特定錯誤,通過刪除特定列來解決。不幸的是你的代碼(令人驚訝的)拋出了相同的錯誤。 該函數仍然沒有做任何有用的事情,因爲某些原因,除非觸發UNKNOWN APPOINTMENT異常,否則它將返回NULL。 – user137263 2013-05-12 15:14:01

0

代碼不幸的是返回NULL沒有足夠的事實來知道,但我會考慮某種形式的循環依賴。

​​

避免循環依賴的最好方法是使用在哪裏其他包引用僅在體內是由包。避免獨立的功能和過程對象。

相關問題