0

以下のコードでは、最初の挿入ステートメントは、

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

これに対して null 値の挿入エラーが発生しています。はいそうです。

しかし、ブロックのステートメントの下で実行が停止しています。

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;
4

1 に答える 1

1

これに対して null 値の挿入エラーが発生しています。はいそうです。

しかし、ブロックのステートメントの下で実行が停止しています。

例外により、プロセス フローが EXCEPTION ハンドラ セクションに移動しました。これでプログラム ブロックは終了です。そのため、例外を処理した後に処理が停止します。これは標準です。実際、これは例外を処理する適切な方法であるため、質問のタイトルを間違っています。全体のポイントは、トランザクションの ACIDityを保持することです。プログラムの最初の部分が失敗した場合、なぜ処理を続行したいのでしょうか?

ただし、これを適切な方法として説明したので、単に DBMS_OUTPUT を使用して例外を「処理」することは非常に悪い習慣であると言わざるを得ません。progarm を呼び出しても例外が発生したことを認識できないため、これは製品コードでは機能しません。プロシージャーはエラーをログに記録してから、例外を再発生させる必要があります。それ以外はただトラブルを求めているだけです。

于 2013-06-28T09:10:11.727 に答える