2013-11-12 4 views
0

У меня возникли некоторые проблемы с моей хранимой процедуры в Oracle 12.1хранимая процедура два исключения выберите заявления

Код удар получает ошибку, и я думаю, что он должен делать с помощью двух заявлений Exception подряд?

Я создал хранимую процедуру для поддельной небольшой онлайн-компании DVD, которая обновляет позицию очереди в таблице очереди аренды. Я использую оператор IF, который говорит, если член уже имеет этот DVD в очереди, а затем обновляет позицию очереди. Чтобы проверить, имеет ли член уже DVD в очереди, я пишу инструкцию SQL Select, которая проверяет наличие DVD в очереди участников. Если оператор находит DVD, он вставляет его в «dvd_check». Если DVD не найден, тогда я устанавливаю DVD_check равным 0.

У меня также есть второй оператор SQL, чтобы определить исходный порядок очередей строки, которая будет обновляться. Оба утверждения отлично работают сами по себе в хранимой процедуре, но когда я складываю их вместе в StoredProcedure перед моим оператором IF, я получаю сообщение об ошибке:

Ошибка (17,5): PLS-00103: Встречался символ " ИСКЛЮЧЕНИЕ "при ожидании одного из следующего: (начальный случай объявляет конечный выход для goto, если loop mod null ... AND

Ошибка (29,4): PLS-00103: Обнаружен символ« конец файла » "когда ожидается одно из следующих действий: конца не Pragma окончательного переопределения инстанциируемого порядка статические ...

Вот мой код:

CREATE OR REPLACE PROCEDURE sp_queueorder (
dvdid_sp number, 
memberid_sp number, 
queueposition_sp number) 
IS 
dvd_check number; 
old_queueposition number; 
BEGIN 

SELECT dvdid INTO dvd_check FROM rentalqueue 
WHERE DVDid = dvdid_sp and memberid = memberid_sp; 
EXCEPTION 
WHEN no_data_found THEN dvd_check := 0; 

SELECT queueposition INTO old_queueposition FROM rentalqueue 
WHERE DVDid = dvdid_sp and memberid = memberid_sp; 
EXCEPTION 
WHEN no_data_found THEN old_queueposition := 0; 

IF dvd_check > 0 THEN 

UPDATE rentalqueue SET queueposition = queueposition + 1 
WHERE memberid = memberid_sp and queueposition >= queueposition_sp AND queueposition <=  old_queueposition; 

UPDATE rentalqueue SET queueposition = queueposition_sp 
WHERE dvdid = dvdid_sp AND memberid = memberid_sp; 

END IF; 
END; 

Большое спасибо за помощь в решении этой проблемы.

ответ

0
CREATE OR REPLACE PROCEDURE sp_queueorder (
    dvdid_sp number, 
    memberid_sp number, 
    queueposition_sp number) 
IS 
    dvd_check number; 
    old_queueposition number; 
BEGIN 
    -- 1st select 
    BEGIN 
     SELECT dvdid INTO dvd_check FROM rentalqueue 
     WHERE DVDid = dvdid_sp and memberid = memberid_sp; 
    EXCEPTION 
     WHEN no_data_found THEN dvd_check := 0; 
    END; 

    -- 2nd select 
    BEGIN 
     SELECT queueposition INTO old_queueposition FROM rentalqueue 
     WHERE DVDid = dvdid_sp and memberid = memberid_sp; 
    EXCEPTION 
     WHEN no_data_found THEN old_queueposition := 0; 
    END; 

    IF dvd_check > 0 THEN 
     UPDATE rentalqueue SET queueposition = queueposition + 1 
     WHERE memberid = memberid_sp and queueposition >= queueposition_sp AND queueposition <= old_queueposition; 

     UPDATE rentalqueue SET queueposition = queueposition_sp 
     WHERE dvdid = dvdid_sp AND memberid = memberid_sp; 

     COMMIT; -- if is not needed remove 
    END IF; 
END; 
0

Отсутствует КОНЕЦ; в вашем коде. В зависимости от того, как предполагается контроль течь может быть должен выглядеть следующим образом:

CREATE OR REPLACE PROCEDURE sp_queueorder (
dvdid_sp number, 
memberid_sp number, 
queueposition_sp number) 
IS 
dvd_check number; 
old_queueposition number; 
BEGIN 

SELECT dvdid INTO dvd_check FROM rentalqueue 
WHERE DVDid = dvdid_sp and memberid = memberid_sp; 
EXCEPTION 
WHEN no_data_found THEN dvd_check := 0; 
---add an END; to the block here? 
END; 
SELECT queueposition INTO old_queueposition FROM rentalqueue 
WHERE DVDid = dvdid_sp and memberid = memberid_sp; 
EXCEPTION 
WHEN no_data_found THEN old_queueposition := 0; 
----or add an end here? 
END; 
IF dvd_check > 0 THEN 

UPDATE rentalqueue SET queueposition = queueposition + 1 
WHERE memberid = memberid_sp and queueposition >= queueposition_sp AND queueposition <=  old_queueposition; 

UPDATE rentalqueue SET queueposition = queueposition_sp 
WHERE dvdid = dvdid_sp AND memberid = memberid_sp; 

END IF; 
END; 
--or add it here? 
END; 
0

У вас есть исключения в середине кода. Вы должны структурировать свой код, чтобы выглядеть следующим образом:

begin 
    begin 
    select ... 
    exception 
    when no_data_found .. 
    end; 

    begin 
    select ... 
    exception 
    when no_data_found .. 
    end; 
    ... 
end; 
Смежные вопросы