2015-05-12 49 views
0

我想從一個遊標中獲取2個變量而不使用循環。打開,獲取到多個變量

CREATE OR REPLACE PROCEDURE NAK.SET_ORDERS(P_ORDER_ID NAK.ORDER_ID%TYPE) 
 

 
CURSOR C_GET_ORDER_NO IS 
 
    SELECT O.ORDER_ID, O.ORDER_MAL FROM NAK.ORDERS O WHERE O.ORDER_ID = P_ORDER_ID; 
 

 
BEGIN 
 

 
    V_ORDER_SEQ := NULL; 
 
    V_ORDER_MAL := NULL; 
 
    OPEN C_GET_ORDER_NO; 
 
    FETCH C_GET_ORDER_NO VALUES(O.ORDER_ID, O.ORDER_MAL) 
 
    INTO (V_ORDER_ID, V_ORDER_MAL); 
 
    CLOSE C_GET_ORDER_NO; 
 

 
END;

+0

更具體:你知道我怎麼能得到2變量?我在互聯網上找到的原始代碼只有1個變量(v_order_id),我嘗試添加1個變量(v_order_mal))。 –

回答

0

你真的需要一個顯式遊標?你可以簡單地這樣做:

CREATE OR REPLACE PROCEDURE NAK.SET_ORDERS(P_ORDER_ID IN NAK.ORDER_ID%TYPE) 

     V_ORDER_SEQ := NULL; 
     V_ORDER_MAL := NULL; 

    BEGIN 

     SELECT O.ORDER_ID, 
      O.ORDER_MAL 
     INTO V_ORDER_SEQ, 
      V_ORDER_MAL 
     FROM NAK.ORDERS O 
     WHERE O.ORDER_ID = P_ORDER_ID; 

    EXCEPTION 
     WHEN NO_DATA_FOUND THEN 
      dbms_output.put_line("No record found"); 
     WHEN TOO_MANY_ROWS THEN 
      dbms_output.put_line("More than one record found"); 
     WHEN OTHER THEN 
      dbms_output.put_line("Other problem happend"); 
    END; 

重要:這個過程將返回一個異常,如果查詢不返回一個記錄。 (ORA-01403:找不到數據或ORA-00913:值過多)

另外,你應該能夠做出這樣的:

CREATE OR REPLACE PROCEDURE NAK.SET_ORDERS(P_ORDER_ID NAK.ORDER_ID%TYPE) 

CURSOR C_GET_ORDER_NO IS 
    SELECT O.ORDER_ID, 
     O.ORDER_MAL 
    FROM NAK.ORDERS O 
    WHERE O.ORDER_ID = P_ORDER_ID; 

BEGIN 
    V_ORDER_SEQ := NULL; 
    V_ORDER_MAL := NULL; 

    OPEN C_GET_ORDER_NO; 
    FETCH C_GET_ORDER_NO INTO V_ORDER_ID, V_ORDER_MAL; 
    CLOSE C_GET_ORDER_NO; 

END; 
+0

是的,謝謝這工作正常,但我真的想要使用光標。我將爲此代碼添加更多內容,並且我希望通過使用遊標將其分成幾部分。如果查詢返回多條記錄或根本沒有記錄,可以添加一種方法來捕獲異常。 –

+0

添加了異常和使用遊標的方式......順便說一下。如果你沒有數據,你將會遇到問題。如果你有多個記錄,那麼LIMIT 1是你的朋友。 – borjab

+0

謝謝,這是我想要的答案。 –