このような場合、コレクションを使用しない場合、問合せから行が戻らない場合は、処理するために、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ないなっている私のコメントで述べたように-----
あなたが持っているNULL
がexecute 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.
p_search宣言 –