2013-06-28 80 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不会知道发生了异常。您的过程需要记录错误,然后重新提出异常。其他任何事情只是要求麻烦。