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