2017-03-17 10 views
0

パッケージ内の運転手続きから複数の手続きを呼び出そうとしています。ルックアップテーブルから特定の値を検出した場合、特定のプロシージャを呼び出して、そのルックアップテーブル内の後続のすべての値について後続のプロシージャを呼び出し続けるようなロジックです。問題は、私のコードが無限ループに入ることです。誰もがこれで私を助けることができますか?PLSQLコードのifブロックからプロシージャを繰り返し呼び出す方法はありますか?

PROCEDURE TEST(
    a_archiveDays_in    IN NUMBER, 
    a_amountInstancesToCommit_in IN NUMBER, 
    a_result_out OUT INTEGER, 
    a_resultException_out OUT VARCHAR, 
    stage_val OUT NUMBER) 
IS 
    i NUMBER :=0; 
BEGIN 
    FOR rec IN (SELECT stage FROM completion_status WHERE status_id IS NOT NULL) 
    LOOP 
    i := i+1; 
    IF rec.stage =1 THEN 
     DBMS_output.put_line('Starting Shipment Data population'); 
     /*populate_shipment_data(a_archiveDays_in , 
     a_resultException_out , a_result_out);*/ 
    ELSIF rec.stage = 2 THEN 
     DBMS_output.put_line('Starting Document data population'); 
     /* populate_document_data(a_archiveDays_in, 
     a_resultException_out , a_result_out);*/ 
    ELSIF rec.stage =3 THEN 
     DBMS_output.put_line('Starting Shipment Archiving'); 
     shipment_archive (a_archiveDays_in,a_amountInstancesToCommit_in,a_result_out,a_resultException_out); 
    ELSIF rec.stage =4 THEN 
     DBMS_output.put_line('Starting shipment Master deletion'); 
     shipment_mast_del (a_archiveDays_in,a_amountInstancesToCommit_in,a_result_out ,a_resultException_out); 
    elsif rec.stage =5 THEN 
     DBMS_output.put_line('Starting Document Archiving'); 
     document_archive(a_archiveDays_in,a_amountInstancesToCommit_in,a_result_out ,a_resultException_out); 
    elsif rec.stage =0 THEN 
     DBMS_output.put_line('Archival Completed...'); 
    END IF; 
    END LOOP; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    DBMS_output.put_line('Check Log Table for more info'); 
WHEN too_many_rows THEN 
    DBMS_output.put_line('Not Allowed'); 
WHEN OTHERS THEN 
    DBMS_output.put_line('Check'); 
    a_result_out   := SQLCODE; 
    a_resultException_out := SUBSTR(SQLERRM, 1, 3000); 
END TEST; 
/
+0

は非常に低い1は助けることができるit'sあなた – SomeJavaGuy

+0

無限ループと呼び出し手順はまったく関連していません。他にもいくつかのコードを表示する必要があります。 –

+0

こんにちは、私はこの場所に新しいです。 コードはどこにアップロードしますか?: –

答えて

0

問題は、そうしながら、私のコードは無限ループに入り、です。

ループ内にEXIT文がありません。無限ループを防ぐには、EXITまたはEXIT WHENを使用するか、ループの最後に転送転送を行う例外を発生させる必要があります。

してください研究は、以下のリンク:ループの各反復で


Basic LOOP statement

は、ステートメントが実行され、ループの先頭に制御が戻ります。無限ループを防止するには、ステートメントまたは発生例外がループを終了する必要があります。


EXIT statement

EXIT文は、無条件ループ の現在の反復を終了し、転送が現在 ループまたは封入標識されたループのいずれかの端部に制御します。

簡単な例:

i := 0; 
    LOOP 
    ... 
    ... 
    IF i > 9 THEN 
     EXIT; 
    END IF; 
    i := i + 1; 
    END LOOP 

EXIT WHEN statement

EXITとき 条件節が真であるWHEN文はそのループの現在の反復を終了し、現在のループか、または現在のループのどちらかの最後に制御を移します。 囲みラベル付きループ。

制御がEXIT WHENステートメントに達するたびに、 のWHEN句の条件が評価されます。条件が真でない場合、EXIT WHENステートメントは何も行いません。無限ループを防ぐために、ループ内の文 が

簡単な例真の条件にする必要があります。コードを見ることなく

i := 0; 
LOOP 
    .... 
    .... 
    EXIT WHEN i > 9; 
    i := i + 1; 
END LOOP; 
関連する問題