2013-09-30 82 views
2

我有一個包含過程(接受輸入參數;光標名稱)和兩個光標的包。 的程序是使用通過輸入參數傳遞變量的光標名稱

PROCEDURE insertdetails(typ IN VARCHAR2) IS 
    BEGIN 
    OPEN typ; 
    LOOP 
     FETCH typ INTO colA; 
     EXIT WHEN typ%notfound; 
     --MISSING CODE 
    END LOOP; 
    END; 

指定如果我運行該過程,並通過對cusrsor作爲輸入參數i獲得的錯誤PLS-00456的名稱的光標:項「TYP」不是遊標 是他們的出路

+0

我不認爲你可以做到這一點。你可以傳遞一個你可以執行的sql語句,如果有幫助的話?你能提供你正在傳遞的光標的細節/你想要達到的目標嗎? – ChrisProsser

+0

兩個遊標都從同一個表中選擇相同數量的記錄,但每個記錄的條件都不相同。記錄將被插入程序。 – lyno

回答

2

您將需要使用REF CURSORS來做到這一點。 Here's a pretty good explanation

你的程序的定義是這樣的:

PROCEDURE insertdetails(typ IN sys_refcursor) IS 

你可能不會在此過程中打開遊標,通常你打開它在其他地方,在光標定義的代碼。

0

假設光標在包其他地方聲明,你可以使用參數來決定哪些實際光標一起工作,是這樣的:

PROCEDURE insertdetails(typ IN VARCHAR2) IS 
BEGIN 
    IF typ = 'CURSOR_A' THEN 
    OPEN cursor_a; 
    LOOP 
     FETCH cursor_a INTO colA; 
     EXIT WHEN cursor_a%notfound; 
     --MISSING CODE 
    END LOOP; 
    ELSE 
    OPEN cursor_b; 
    LOOP 
     FETCH cursor_b INTO colA; 
     EXIT WHEN cursor_b%notfound; 
     --MISSING CODE 
    END LOOP; 
    END IF; 
END; 

或者,如果遺漏碼是常見的,似乎有可能:

PROCEDURE insertdetails(typ IN VARCHAR2) IS 
BEGIN 
    IF typ = 'CURSOR_A' THEN 
    OPEN cursor_a; 
    ELSE 
    OPEN cursor_b; 
    END IF; 

    LOOP 
    IF typ = 'CURSOR_A' THEN 
     FETCH cursor_a INTO colA; 
     EXIT WHEN cursor_a%notfound; 
    ELSE 
     FETCH cursor_b INTO colA; 
     EXIT WHEN cursor_b%notfound; 
    END IF; 
    --MISSING CODE 
    END LOOP; 
END; 

無論哪種方式,你可能更喜歡在caseif;特別是如果typ可以代表的可能光標的數量增加。

+0

將與此合作。謝謝 – lyno