Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle Ora-6502数字或值错误,请将空值插入到没有空列的表中_Oracle_Plsql_Ora 06502 - Fatal编程技术网

Oracle Ora-6502数字或值错误,请将空值插入到没有空列的表中

Oracle Ora-6502数字或值错误,请将空值插入到没有空列的表中,oracle,plsql,ora-06502,Oracle,Plsql,Ora 06502,我正在使用下面的批量提交过程将记录从表源插入到表1。 TABLE1上的COLUMN1定义为非空 有时我的表\u SOURCE返回零行,在这种情况下,我的进程失败并出现错误: Ora-6502数字或值错误 我试图使用异常中的NO\u DATA\u FOUND忽略该错误,但它也不起作用 你能告诉我如何解决这个问题吗 create or replace PROCEDURE PROC1 AS v_ErrNum NUMBER (20); v_ErrMsg

我正在使用下面的
批量提交
过程将记录从
表源
插入到
表1
TABLE1
上的
COLUMN1
定义为
非空

有时我的
表\u SOURCE
返回零行,在这种情况下,我的进程失败并出现错误:

Ora-6502数字或值错误

我试图使用异常中的
NO\u DATA\u FOUND
忽略该错误,但它也不起作用

你能告诉我如何解决这个问题吗

create or replace PROCEDURE  PROC1  AS
    v_ErrNum            NUMBER (20);
    v_ErrMsg            VARCHAR2 (270);
    v_Last_Record       PLS_INTEGER;

   CURSOR c_Get_Record
   IS
      SELECT Column1, Column2, Column3
        FROM Table1;
    TYPE Target_Rec IS TABLE OF Table1%ROWTYPE
      INDEX BY PLS_INTEGER;
        a_Target_Rec        Target_Rec;
    TYPE FetchSet IS TABLE OF c_Get_Record%ROWTYPE;
        a_Fetch_Set         FetchSet;
    TYPE cursor_var_type IS REF CURSOR;
        CV                  cursor_var_type;
BEGIN
    OPEN CV FOR
        Select  Column1, Column2, Column3 from TABLE_SOURCE where Column1 is NOT NULL;
    FETCH CV 
   BULK COLLECT INTO a_Fetch_Set;
    CLOSE CV;
        v_Last_Record := a_Fetch_Set.LAST;

  FOR i IN 1 .. v_Last_Record
   LOOP
      a_Target_Rec (i).Column1 := a_Fetch_Set (i).Column1;
      a_Target_Rec (i).Column2 := a_Fetch_Set (i).Column2;
      a_Target_Rec (i).Column3 := a_Fetch_Set (i).Column3;

  END LOOP;
        v_Last_Record := 0;
        v_Last_Record := a_Target_Rec.LAST;

   FORALL j IN 1 .. v_Last_Record
      INSERT INTO TABLE1
           VALUES a_Target_Rec (j);

   COMMIT;
     -- *** ** Error Handling ** ***

EXCEPTION
  WHEN OTHERS THEN
        v_ErrNum := SQLCODE ;
        v_ErrMsg := SUBSTR( SQLERRM, 0, 250) ;
        RAISE_APPLICATION_ERROR( -20067 , 'ERROR WHILE LOADING TABLE1  Error Msg: ' || dbms_utility.format_error_stack|| dbms_utility.format_error_backtrace) ;
        ROLLBACK ;
END PROC1;

你有问题是因为

v_Last_Record := a_Fetch_Set.LAST;

  FOR i IN 1 .. v_Last_Record

如果您的游标没有行,则大容量收集不会填充集合,且_Fetch_集为空。在本例中,LAST返回NULL。您应该检查这一点,或者使用一个_Fetch _Set.COUNT。

那么,它在哪一行失败了???您能不能将其重写为简单的SQL?这更难理解,更容易出错,而且速度也会更慢。为了提高处理速度,我们切换到批量提交模式。正如Dmitry所建议的那样,我切换到了COUNT而不是LAST,并且它起作用了,查询复杂性与此无关——所有数据都是通过SQL访问的,而将PL/SQL逻辑放在上面只会减慢查询速度。不管怎样,很高兴它能起作用。