2013-06-28 128 views
0

在下面的代碼第一個INSERT語句,無法處理該異常正確

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

我得到空值插入錯誤這一點。對就這樣。

但它正在停止執行塊的語句之下。

異常導致進程流轉到EXCEPTION處理程序部分。這是程序塊的結尾。因此處理異常後處理停止。這是標準。所以實際上,你錯誤地標題爲你的問題,因爲這是處理異常的正確方法。整點要保存the ACIDity of the transaction。如果程序的第一部分失敗,爲什麼還要繼續處理?

儘管我已經說過這是正確的方法,但我覺得我必須說,通過簡單地使用DBMS_OUTPUT來「處理」異常是非常糟糕的做法。這在生產代碼中不起作用,因爲調用progarm不會知道發生了異常。您的過程需要記錄錯誤,然後重新提出異常。其他任何事情只是要求麻煩。