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_搜索声明