在這種情況下,當我們不使用collection時,如果我們沒有從查詢返回行,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;
上面會顯示您的最愛是空的。
---- 煞費苦心例子: -----
正如我在評論中提及了您得到的錯誤不監守你有NULL
從execute immediate
語句返回。這是因爲您正試圖在類型聲明中插入non-numeric
字符來保存numeric
或任何類似的情況。
例1:要檢查收集有數據或不與列作爲NUMBER
數據類型
SQL> desc test2;
Name Null? Type
----------------------------------------- -------- ----------------------------
NUM NUMBER
SQL> select * from test2;
no rows selected
塊創建
表中收集
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>
實施例來處理NULL
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聲明 –