2012-12-31 83 views
1

我修改了過程,使其更小,但我真的只想運行select查詢一次。這將降低運行該程序的成本。如何在不運行查詢兩次的情況下獲得prevContectIDnextContentID。這是取代以前的程序,所以我不想更改INOUT,所以我不必找到它被調用的每個地方。Oracle從包中選擇查詢返回兩個變量

procedure getSeq(theContentID IN table.contentID%type, 
       prevContentID OUT table.contentID%type, 
       nextContentID OUT table.contentID%type) 
BEGIN 

    SELECT myPrev into prevContentID, myNext into nextContentID 
    from myTable 
    where contentID=theContentID; 
    RETURN; 
END getSeq; 
+0

哪裏有兩次跑?我只看到一個。 – kmkaplan

回答

5

顯示的程序很可能不會編譯。正確的語法爲SELECT ... INTO使用幾個變量是:

SELECT myPrev, myNext INTO prevContentID, nextContentID 
from myTable 
where contentID = theContentID; 
+0

我認爲這可能很簡單。謝謝。 –

1

您還可以使用光標從myTable。對於你的方法來讀取值,你需要做適當的異常處理,當theContentID不存在在myTable中,因爲這會給你帶來NO_DATA_FOUND異常。

PROCEDURE getSeq (theContentID IN  table.contentID%TYPE, 
        prevContentID  OUT table.contentID%TYPE, 
        nextContentID  OUT table.contentID%TYPE) 
IS 
    CURSOR getcontentID_cur 
    IS 
     SELECT myPrev, myNext 
     FROM myTable 
     WHERE contentID = theContentID; 
BEGIN 
    OPEN getcontentID_cur; 

    FETCH getcontentID_cur 
    INTO prevContentID, nextContentID; 

    CLOSE getcontentID_cur; 
END getSeq; 
+0

theContentID將始終存在,因爲我縮短了代碼,並在運行select之前驗證了contentID。我不想投入更多的代碼來獲得答案。科多給了我我需要的東西。 –

+0

@NathanStanford:更多代碼的參數是什麼?首先,通過掃描myTable來驗證contentId。其次,你需要獲取prev和next id的代碼,這意味着你的整個過程將會掃描你的表格兩次。用我的方法你可以做一次.Nyways只是建議你的方法的優點/缺點。謝謝 –

+0

對不起,它更復雜,然後就像代碼所說的那樣。大多數情況下我的運行時間少於15毫秒。所以我現在很好。感謝您的關注。由於某人正在做一個遊標並獲取所有內容,並通過循環來獲取下一個,並且prev就是我們重寫代碼的原因。我們現在使用Lag(),Lead()來獲得prev和Next。此外,當我們得到First_Value(),然後Last_Value()允許前一個循環到列表的開始或結束時。 –