Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 我怎样才能在1。。SQL%BULK_EXCEPTIONS.COUNT是否指向引发异常的集合的元素?_Oracle_Exception_Plsql_Bulkupdate - Fatal编程技术网

Oracle 我怎样才能在1。。SQL%BULK_EXCEPTIONS.COUNT是否指向引发异常的集合的元素?

Oracle 我怎样才能在1。。SQL%BULK_EXCEPTIONS.COUNT是否指向引发异常的集合的元素?,oracle,exception,plsql,bulkupdate,Oracle,Exception,Plsql,Bulkupdate,我将此代码视为: 有人能解释一下V\u EMP\u ID(i)如何指向导致异常的实际元素,因为i位于1。。SQL%BULK\u异常。计数。在第一次迭代中,V_EMP_ID(i)是否应该始终指向集合的第一个元素 PS于2017年12月添加了以下内容 在下面的代码中,我试图模拟合并到功能,而不出于某种原因使用合并到 使用集合,我将记录从临时表插入到主表。如果该行存在于主表中,我们将得到一个DUP\u VAL\u ON\u INDEX错误排序,并使用SAVE EXCEPTIONS保存错误详细信息 在

我将此代码视为:

有人能解释一下
V\u EMP\u ID(i)
如何指向导致异常的实际元素,因为
i
位于
1。。SQL%BULK\u异常。计数
。在第一次迭代中,V_EMP_ID(i)是否应该始终指向集合的第一个元素


PS于2017年12月添加了以下内容

在下面的代码中,我试图模拟
合并到
功能,而不出于某种原因使用
合并到

使用集合,我将记录从临时表插入到主表。如果该行存在于主表中,我们将得到一个
DUP\u VAL\u ON\u INDEX
错误排序,并使用
SAVE EXCEPTIONS
保存错误详细信息
异常
块中,我想更新所有出错的主表行,并使用临时表中的一组值进行更新。
令人惊讶的是,
对于1中的所有i。。SQL%BULK_异常。计数
临时数据(i)
为我更新了主表中的正确行。我也尝试了非顺序行,效果很好。这怎么可能

declare
TYPE data_tbl IS TABLE OF EMPLOYEE_TEMP%rowtype INDEX BY PLS_INTEGER;
    temp_data data_tbl;
begin       
        select * bulk collect into temp_data from EMPLOYEE_TEMP
        where EVENT_OID='30047767_1' and USERID='SINISDI2';
    
   FORALL i IN 1 .. temp_data.COUNT SAVE EXCEPTIONS
       INSERT INTO EMPLOYEE D
        (D.VPD_KEY,
              D.OID,
              D.EVENT_OID,
              D.PID,
              D.AMOUNT,
              D.MIR,
              D.REPORTING,
              D.MODIFIED_BY_USER,
              D.MODIFIED_ON,
              D.VERSION,
              D.TYPE_OID,
              D.F_ELIGIBLE)
       VALUES ( temp_data(i).VPD_KEY,
              temp_data(i).OID,
              temp_data(i).EVENT_OID,
              temp_data(i).PID,
              temp_data(i).AMOUNT,
              temp_data(i).MIR,
              temp_data(i).REPORTING,
              temp_data(i).USERID,
              SYSDATE,
              0,
              temp_data(i).TYPE_OID,
              temp_data(i).F_ELIGIBLE
              );
  
   EXCEPTION
   WHEN OTHERS
   THEN
      IF SQLCODE = -24381
      THEN
    FORALL i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
   UPDATE EMPLOYEE D
     SET      D.AMOUNT=temp_data(i).AMOUNT,
              D.REPORTING=temp_data(i).REPORTING,
              D.MIR=temp_data(i).MIR,
              D.MODIFIED_BY_USER=temp_data(i).USERID,
              D.MODIFIED_ON = temp_data(i).MODIFIED_ON,
              D.VERSION = D.VERSION+1,
              D.F_ELIGIBLE = S.F_ELIGIBLE
       where D.PID = temp_data(i).PID AND D.TYPE_OID = temp_data(i).TYPE_OID;
      ELSE 
         DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE)) ;
      END IF;     
end; 
/  
引自首都:

SQL%BULK\u异常(i)。ERROR\u INDEX是失败的DML语句的编号

DML语句的编号等同于集合中的元素索引

请看以下工作示例:


createtable选项卡(id,valcheck)(valYou是对的,这是不正确的。查看这篇博文中的代码清单2,了解一个非常详细的示例:简短版本,我认为您应该使用
V_EMP_id(sql%BULK_EXCEPTIONS(I).ERROR_INDEX)
谢谢。这也是我的理解。但是你能检查我在问题中的编辑吗?我不相信你上次编辑中的块工作正常。请看上一个例子。我希望更新id=(2,3)而不是id=(2,4)。如果你有另一组数据,请更改DBFIDLE并发布链接。
declare
TYPE data_tbl IS TABLE OF EMPLOYEE_TEMP%rowtype INDEX BY PLS_INTEGER;
    temp_data data_tbl;
begin       
        select * bulk collect into temp_data from EMPLOYEE_TEMP
        where EVENT_OID='30047767_1' and USERID='SINISDI2';
    
   FORALL i IN 1 .. temp_data.COUNT SAVE EXCEPTIONS
       INSERT INTO EMPLOYEE D
        (D.VPD_KEY,
              D.OID,
              D.EVENT_OID,
              D.PID,
              D.AMOUNT,
              D.MIR,
              D.REPORTING,
              D.MODIFIED_BY_USER,
              D.MODIFIED_ON,
              D.VERSION,
              D.TYPE_OID,
              D.F_ELIGIBLE)
       VALUES ( temp_data(i).VPD_KEY,
              temp_data(i).OID,
              temp_data(i).EVENT_OID,
              temp_data(i).PID,
              temp_data(i).AMOUNT,
              temp_data(i).MIR,
              temp_data(i).REPORTING,
              temp_data(i).USERID,
              SYSDATE,
              0,
              temp_data(i).TYPE_OID,
              temp_data(i).F_ELIGIBLE
              );
  
   EXCEPTION
   WHEN OTHERS
   THEN
      IF SQLCODE = -24381
      THEN
    FORALL i IN 1 .. SQL%BULK_EXCEPTIONS.COUNT 
   UPDATE EMPLOYEE D
     SET      D.AMOUNT=temp_data(i).AMOUNT,
              D.REPORTING=temp_data(i).REPORTING,
              D.MIR=temp_data(i).MIR,
              D.MODIFIED_BY_USER=temp_data(i).USERID,
              D.MODIFIED_ON = temp_data(i).MODIFIED_ON,
              D.VERSION = D.VERSION+1,
              D.F_ELIGIBLE = S.F_ELIGIBLE
       where D.PID = temp_data(i).PID AND D.TYPE_OID = temp_data(i).TYPE_OID;
      ELSE 
         DBMS_OUTPUT.PUT_LINE(SQLERRM(SQLCODE)) ;
      END IF;     
end; 
/  
2 row(s) inserted (1 with error).
id=3 sqlerrm=ORA-02290: check constraint (.) violated