0

問題なくコンパイルできる次の sproc があります。

CREATE OR REPLACE PROCEDURE SSACHDEV.SyncTeleappWithClientinfo
as
mine varchar2(1);
v_teleCaseNbr      number;
v_cashwithappyn varchar2(1);

CURSOR TeleAppCursor
is
    Select 
        distinct casenbr, cashwithappyn
    from TeleApp;

BEGIN
dbms_output.put_line('begin');
open TeleAppCursor;

LOOP
    fetch TeleAppCursor into v_teleCaseNbr, v_cashwithappyn;
    EXIT when TeleAppCursor%NOTFOUND; -- this one has the problem

    Select cashwithappyn into mine from ClientInfo where casenbr = v_teleCaseNbr and trim(cashwithappyn) is null;

END LOOP;
dbms_output.put_line('end');
END;

しかし、次を使用して実行しようとすると:

BEGIN 
  SSACHDEV.SYNCTELEAPPWITHCLIENTINFO;
END;

次のエラーが発生します。

ORA-01403: no data found
ORA-06512: at "SSACHDEV.SYNCTELEAPPWITHCLIENTINFO", line 21
ORA-06512: at line 2

理由を知っている人はいますか?または、これらの問題を回避するために何ができますか?

4

2 に答える 2

4

これは、プロシージャの 2 番目のselectステートメント ( ) がデータを返さないために発生しています。その例外を処理するために、プロシージャに一部をSelect cashwithappyn into mine from ..追加します。EXCEPTION

CREATE OR REPLACE PROCEDURE SSACHDEV.SyncTeleappWithClientinfo
as
mine varchar2(1);
v_teleCaseNbr      number;
v_cashwithappyn varchar2(1);

CURSOR TeleAppCursor
is
    Select 
        distinct casenbr, cashwithappyn
    from TeleApp;

BEGIN
dbms_output.put_line('begin');
open TeleAppCursor;

LOOP
    fetch TeleAppCursor into v_teleCaseNbr, v_cashwithappyn;
    EXIT when TeleAppCursor%NOTFOUND;

    Select cashwithappyn into mine from ClientInfo where casenbr = v_teleCaseNbr and trim(cashwithappyn) is null;

END LOOP;
dbms_output.put_line('end');

EXCEPTION
  WHEN NO_DATA_FOUND 
  THEN  dbms_output.put_line(' no data found'); -- for example
END;
于 2012-09-28T16:36:07.707 に答える
2

例外セクションをループの外側に配置する必要がありますか? むしろループ内に配置したいと思います。私に関しては、plsqlは次のようになります

CREATE OR REPLACE PROCEDURE SSACHDEV.SyncTeleappWithClientinfo
as
mine varchar2(1);
v_teleCaseNbr      number;
v_cashwithappyn varchar2(1);

CURSOR TeleAppCursor
is
    Select 
        distinct casenbr, cashwithappyn
    from TeleApp;

BEGIN
dbms_output.put_line('begin');
open TeleAppCursor;

LOOP
    fetch TeleAppCursor into v_teleCaseNbr, v_cashwithappyn;
    EXIT when TeleAppCursor%NOTFOUND;
    begin
       Select cashwithappyn into mine from ClientInfo where casenbr = v_teleCaseNbr and trim(cashwithappyn) is null;
    when no_data_found then dbms_output.put_line('end');
    end;

END LOOP;

END;

しかし、ループ内の膨大な数の小さなクエリによってDBが狂ってしまわないように、LEFT JOINを使用してカーソル自体でそのようなことを行う必要があります。

于 2012-09-28T18:40:42.910 に答える