2015-05-12 4 views
0

Я пытаюсь получить 2 переменных из курсора, не используя цикл.open, fetch, в несколько переменных

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

Спасибо, это ответ, который я хотел. –

Смежные вопросы