如何使用动态查询处理null异常在批量收集中执行?

时间:2017-09-12 12:04:21

标签: oracle plsql

我的代码是:

EXECUTE IMMEDIATE LV_SEARCH_QUERY bulk collect into  p_search;

p_search是集合。

LV_search是动态查询字符串变量。

如果我正在执行,则从该查询返回null值。如何处理以下错误。

  

错误报告 - ORA-06502:PL / SQL:数字或值错误ORA-06512:at   第21行   06502. 00000 - “PL / SQL:数字或值错误%s”   *原因:算术,数字,字符串,转换或约束错误              发生了。例如,如果尝试,则会发生此错误              将值NULL赋给声明为NOT NULL的变量,或者如果是              尝试将大于99的整数分配给变量              声明NUMBER(2)。   *操作:更改数据,如何操作或如何声明数据              这些值不会违反约束条件。

如何在集合中获得异常&批量收集或如何处理?

1 个答案:

答案 0 :(得分: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;

以上将显示您的收藏是空的。

---- Elaborative示例: -----

正如我在评论中提到的那样,您会收到错误,因为您从NULL声明中返回了execute immediate。这是因为您试图在类型声明中插入non-numeric字符来保存numeric或类似的任何情况。

示例1:检查收件人是否有数据

使用列NUMBER数据类型

创建的表
SQL> desc test2;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NUM                                                NUMBER

SQL> select * from test2;

no rows selected

阻止处理集合中的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> 

示例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.