2012-01-02 68 views
1

我想在一個過程中返回多個遊標,一個基於另一個過程。PLSQL:輸出多個遊標的過程

我目前的代碼是:

TYPE REFCURSOR IS REF CURSOR; 

PROCEDURE GETCARS(oCARS OUT REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
END GETCARS; 

我不知道這是更多鈔票,但我要讓類似:

PROCEDURE GETCARS(oCARS OUT REFCURSOR, oREPAIRS OUT REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
    ..??.. 
END GETCARS; 

這將返回作爲第二個參數與連接的所有維修當前獲取的oCARS行。 (表修理有一個FK從汽車的id_car)

現在我這樣做,在C#的一面,當我從oCARS遊標讀取一行我打電話,給了我修理的列表第二個步驟,但也許是在某種程度上可能這樣做,在一個程序(這將使我的性能提升? - 我不想使用加入,因爲它返回乘汽車的每個維修)

+0

爲什麼不能有2個程序(getcars和getrepairs)?或者更好的是,只需在需要時選擇你需要的東西:從汽車中選擇*而不是執行getcars() – tbone 2012-01-02 17:55:34

+0

調用平面選擇不太安全,然後調用參數化過程(sql注入保護)。 我認爲調用2個程序的效率較低..我希望有一些其他經驗的人在這裏.. – 2012-01-03 00:36:43

+1

調用一個正確的參數化select語句不會比調用過程安全。只要不將參數值連接到select語句中,就沒有用於SQL注入的向量。 – Allan 2012-01-03 16:46:34

回答

1

簡單的答案是你不能做你正在嘗試的東西。

遊標基本上只是指向包含查詢結果的結果集的開始的指針。直到你獲取一行,沒有辦法知道該行將包含。由於您的應用程序(而非PL/SQL代碼)正在執行讀取操作,因此PL/SQL部分不知道要返回的值。

要做你正在嘗試的事情,數據庫必須檢測第一個查詢的提取,使用第二個查詢創建一個新的結果集,然後將新的結果集放在過程最初返回的地址第二個遊標。數據庫只是沒有設計來處理這種操作。

2

如何

PROCEDURE GETCARS(oCARS OUT SYS_REFCURSOR, oREPAIRS OUT SYS_REFCURSOR, oCHARGES OUT SYS_REFCURSOR) 
BEGIN 
    OPEN oCARS FOR SELECT * FROM CARS; 
    OPEN oREPAIRS FOR SELECT * FROM REPAIRS; 
    OPEN oCHARGES FOR SELECT * FROM CHARGES; 
END GETCARS; 

分享和享受。

+0

這很好,當我想要返回所有oCars時幾乎是好的。 但是,如果我添加一些額外的代碼,對於某些字段的分頁或日期限制,休息遊標會返回我更多,然後我需要。 我希望有一些想法,這將允許我綁定到oCars中當前獲取的行的id,並基於修改返回oRepairs。 喜歡的東西: OPEN oRepairs爲SELECT * FROM維修,其中id_car = ocars.id_car 我不知道如果多數民衆贊成更多鈔票。 – 2012-01-03 08:47:10

+2

@XXs - 你爲什麼不把你的全部要求拼寫出來*而不是用這個「是的」而不是浪費人們的時間? – APC 2012-01-03 12:05:31

+0

瞭解如何閱讀「哪些將作爲第二個參數返回與當前獲取的oCARS行相關的所有修復」。是的,我想通過遊標返回整個數據庫來提高性能.. -.- 哈哈,當我在這裏問問題時,我要求可擴展的解決方案,而不是最簡單的解決方案。 – 2012-01-03 14:15:36