我的代码是:
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)。 *操作:更改数据,如何操作或如何声明数据 这些值不会违反约束条件。
如何在集合中获得异常&批量收集或如何处理?
答案 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.