2013-06-28 4 views
0

В приведенном ниже коду заявления первого Вкладыша,Невозможно обработать исключение должным образом

insert into customer_master select max(customerid)+1,customer_name from customer_master 
where customer_name not in (select customername from customer_master); 

подводит нулевую ошибку значения вставки для этого. Да, именно так.

Но он останавливается под операциями блока от выполнения.

insert into customer_account_mapping select customerid,upper(pcd(i)),upper(acd(i)),cost from customer_master where customername=customer_name and concat(upper(pcd(i)),upper(acd(i))) not in (select concat(upper(pcode),upper(acode)) from customer_account_mapping); 

insert into user_permissions select distinct user_id,sales_person_name,sales_mgr_name,upper(pcd(i)),upper(acd(i)) from user_permissions where sales_person_name=sales_person and concat(upper(pcd(i)),upper(acd(i))) not in (select concat(upper(pcode),upper(acode)) from user_permissions) and rownum<2 ; 

Полный код приведен ниже.

create or replace 
procedure dashboard_addtion 
     (customer_name varchar2,pcd parray,acd aarray,sales_person varchar2,cost number) 
IS 

begin 
insert into customer_master select max(customerid)+1,customer_name from customer_master 
where customer_name not in (select customername from customer_master); 
for i in 1..acd.count loop 
insert into customer_account_mapping select customerid,upper(pcd(i)),upper(acd(i)),cost from customer_master where customername=customer_name and concat(upper(pcd(i)),upper(acd(i))) not in (select concat(upper(pcode),upper(acode)) from customer_account_mapping); 
insert into user_permissions select distinct user_id,sales_person_name,sales_mgr_name,upper(pcd(i)),upper(acd(i)) from user_permissions where sales_person_name=sales_person and concat(upper(pcd(i)),upper(acd(i))) not in (select concat(upper(pcode),upper(acode)) from user_permissions) and rownum<2 ; 
commit; 
end loop; 
EXCEPTION 
    WHEN OTHERS THEN 
    DBMS_OUTPUT.PUT_LINE (SQLERRM); 
end; 
+1

Что такое ошибка с ошибкой нулевого значения? Можете ли вы указать точную ошибку и DDL вашей таблицы, включая индексы и ограничения? Постскриптум исследовать последовательности. – Ben

+0

@AlexPoole - Это небольшое изменение в этом вопросе. – APC

+0

@APC - это не просто изменение того, какой оператор 'insert' нуждается в оболочке' begin'/'end'? –

ответ

1

Am получает нулевую ошибку значение вставки для этого. Да, именно так.

Но он останавливается под операциями блока от выполнения.

Исключение вызвало поток процесса, чтобы перейти в раздел обработчика EXCEPTION. Это конец программного блока. Поэтому обработка обработки исключается. Это стандарт. Поэтому на самом деле вы неправильно назвали свой вопрос, потому что это правильный способ справиться с исключениями. Все дело в том, чтобы сохранить the ACIDity of the transaction. Почему вы хотите продолжить обработку, если первая часть вашей программы завершилась неудачей?

Хотя, описав это как надлежащий способ, я чувствую, что я должен сказать, что «обработка» исключений простым использованием DBMS_OUTPUT является крайне плохой практикой. Это не будет работать в производственном коде, потому что вызов progarm не будет знать, что произошло исключение. Ваша процедура должна регистрировать ошибку, а затем повторно поднять исключение. Все остальное просто просит неприятностей.