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

Oracle 如何在批量收集中使用动态查询执行来处理空异常?,oracle,plsql,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行 650200000-“PL/SQL:数字或值错误%s” *原因:算术、数字、字符串、转换或约束错误 发生。例如,如果尝试执行以下操作,则会发生

我的代码是:

EXECUTE IMMEDIATE LV_SEARCH_QUERY bulk collect into  p_search;
p_search
是一个集合

LV_search
是动态查询字符串变量

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

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


如何在collection&bulk collect中获取异常或如何处理异常?

在这种情况下,当我们不使用collection时,如果查询中没有返回行,Oracle会为我们提供
找不到任何数据
异常来处理。但是当我们使用集合时,
NO\u DATA\u 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;
以上内容将显示您的集合为空

----详细示例:-----

正如我在评论中提到的,您得到的错误并不是因为
executeimmediate
语句返回了
NULL
。这是因为您试图在类型声明中插入一个
非数字
字符,以保存
数字
或类似的任何情况

示例1:检查采集是否有数据

使用列作为数据类型创建的表

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.

你好。我试过了,但不起作用。问题是-当我执行bulkcollect行时,它返回空值,然后我在发布它时遇到错误。是的,错误与找不到数据的处理无关。ORA-06502:PL/SQL:数值或值错误字符串原因:发生算术、数值、字符串、转换或约束错误。例如,如果试图将值NULL分配给声明为非NULL的变量,或者试图将大于99的整数分配给声明为数字的变量(2),则会发生此错误。@SabarishMahalingam这是我在回答中解释的,错误显示您正在将非数字值分配给数字字段。实际上,我正在通过execute命令执行Null记录查询,因此当时显示了错误。我的问题是如何在异常情况下处理它或以任何其他方式解决此错误?@SabarishMahalingam。我想你还不明白你犯了什么错误。您得到的错误与executeimmediate语句中的null无关。请参阅我的详细示例。请发布p_搜索声明