2017-09-12 11 views
-1

iは、以下のコードを実行することができます。コレクションはバルク収集で動的クエリを実行してヌル例外を処理する方法は?

EXECUTE IMMEDIATE LV_SEARCH_QUERY bulk collect into p_search; 

p_searchです。

LV_searchは、動的クエリ文字列変数です。

クエリが実行される場合、null値がそのクエリで返されます。以下のエラーをどのように処理するか。

エラーレポート - ORA-06502:PL/SQL:数値または値のエラーORA-06512: ラインで21 06502. 00000 - "PL/SQL:数値または値のエラー%s" の *原因:算術、数値、文字列、変換、または制約エラー が発生しました。たとえば、 がNOT NULLと宣言された変数にNULL値を割り当てようとした場合、またはNUMBER(2)と宣言された変数 に99より大きい整数を代入しようとすると、 が試みられた場合に発生します。 *処置:データの変更方法、操作方法、または宣言方法を変更してください。 値が制約に違反しないようにしてください。

コレクションで例外を取得するには&一括収集またはどのように処理するのですか?

+0

p_search宣言 –

答えて

0

このような場合、コレクションを使用しない場合、問合せから行が戻らない場合は、処理するために、OracleはNO_DATA_FOUND例外を処理します。しかしコレクションを使用すると、NO_DATA_FOUND例外は処理されません。私たちは以下のように仕事をすることができます。

あなたの文を実行すると:

EXECUTE IMMEDIATE LV_SEARCH_QUERY bulk collect into p_search; 

などのチェックでください:

IF p_search.count = 0 THEN 
    dbms_output.put_line('No Records in the Test Table'); 
END IF; 

上記は、あなたのコレクションが空であることが表示されます。

---- 精巧例:エラーがbecuaseないなっている私のコメントで述べたように-----

あなたが持っているNULLexecute immediateステートメントから返されています。これは、numericを保持する型宣言にnon-numeric文字を挿入しようとしているか、またはそのようなケースがあるためです。

例1:コレクトはNULL

SQL> set serverout on SQL> DECLARE TYPE var IS TABLE OF NUMBER INDEX BY PLS_INTEGER; v_var var; v_sql VARCHAR2 (100); BEGIN v_sql := 'Select num from test2'; EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_var; IF v_var.COUNT = 0 THEN DBMS_OUTPUT.put_line ('No Records in the Test Table'); END IF; END; / No Records in the Test Table PL/SQL procedure successfully completed. SQL> 

コレクションにを処理するためのNUMBERデータ型

SQL> desc test2; 
Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
NUM            NUMBER 

SQL> select * from test2; 

no rows selected 

ブロックと列で作成されたデータか

表を持っているかどうかを確認するには2:数字以外の文字を数値文字を扱うために宣言された型に変換します。あなたはこの問題を抱えています。ここでは、そのような問題を処理するために例外ブロックを使用したことがわかります。したがって例外が発生しても、プロシージャは正常に完了します。

SQL> desc test2; 
    Name          Null? Type 
    ----------------------------------------- -------- ---------------------------- 
    COL1            VARCHAR2(10 CHAR) 

SQL> select * from test2; 

    COL1 
    ---------- 
    XXX 
    YYYW 

    SQL> DECLARE 
    TYPE var IS TABLE OF INTEGER 
     INDEX BY PLS_INTEGER; 

    v_var var; 

    v_sql VARCHAR2 (100); 
BEGIN 
    v_sql := 'Select col1 from test2'; 

     EXECUTE IMMEDIATE v_sql BULK COLLECT INTO v_var; 

    IF v_var.COUNT = 0 
    THEN 
     DBMS_OUTPUT.put_line ('No Records in the Test Table'); 
    END IF; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     DBMS_OUTPUT.put_line (SQLERRM); 
END; 
/
ORA-01722: invalid number 
ORA-06512: at line 11 

PL/SQL procedure successfully completed. 
+0

ハイキングを投稿してください。私はそれを試みたが、それは動作していない。私がバルクコール線を実行しているとき、それはヌル値を返し、投稿したときに私はエラーに直面しました。 –

+0

はい、エラーはNo_data_found処理とは関係ありません。 ORA-06502:PL/SQL:数値または値のエラー文字列 原因:算術演算、数値演算、文字列演算、または変換エラーまたは制約エラーが発生しました。たとえば、NOT NULLと宣言された変数にNULL値を代入しようとした場合、またはNUMBER(2)で宣言された変数に99より大きい整数を代入しようとすると、このエラーが発生します。 – XING

+0

読む方法 'データが見つかりません'。 –

関連する問題