2017-09-12 22 views
-1

我可以執行下面的代碼:如何使用動態查詢處理空異常執行批量收集?

EXECUTE IMMEDIATE LV_SEARCH_QUERY bulk collect into p_search; 

p_search是集合。

LV_search是動態查詢字符串變量。

如果查詢執行,則空值將在該查詢中返回。如何處理下面的錯誤。

錯誤報告 - ORA-06502:PL/SQL:數字或值錯誤ORA-06512:在 線21 06502. 00000 - 「PL/SQL:數字或值錯誤%的」 *原因:發生算術,數字,字符串,轉換或約束錯誤 。例如,如果嘗試向 賦值NULL,將變量聲明爲NOT NULL,或者嘗試使用 將大於99的整數賦值給聲明爲NUMBER(2)的變量 ,則會發生此錯誤。 *操作:更改數據,操作方式或聲明方式 該值不違反約束條件。

如何獲得異常收集&批量收集或如何處理它?

+0

請發表p_search聲明 –

回答

0

在這種情況下,當我們不使用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; 

上面會顯示您的最愛是空的。

---- 煞費苦心例子: -----

正如我在評論中提及了您得到的錯誤不監守你有NULLexecute 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. 
+0

hi xing。我嘗試過,但它不工作。 prblem is-當我執行bulkcollect行時,它返回空值,然後我面臨錯誤,當我發佈它。 –

+0

是的,這個錯誤與No_data_found處理無關。 ORA-06502:PL/SQL:數字或值錯誤字符串 原因:發生算術,數字,字符串,轉換或約束錯誤。例如,如果嘗試將值NULL分配給聲明爲NOT NULL的變量,或者嘗試將大於99的整數分配給聲明爲NUMBER(2)的變量,則會發生此錯誤。 – XING

+0

如何閱讀'找不到數據'。? –