Sql 获取失败的id';对于所有保存异常,从中删除

Sql 获取失败的id';对于所有保存异常,从中删除,sql,oracle,exception,plsql,forall,Sql,Oracle,Exception,Plsql,Forall,我正在尝试使用forall更新员工的工资。无论何时更新时发生任何错误,我都需要保存发生员工id错误的文件。 但编译时会出现以下错误 错误(14,24):PLS-00201:必须声明标识符“INDX” 下面是我的代码 PROCEDURE PROC1 (V_EMP_ID DBMS_SQL.NUMBER_TABLE) IS lv_error_string VARCHAR2(4000); BEGIN FORALL INDX IN V_EMP_ID.FIRST..V_EMP_ID.LAS

我正在尝试使用forall更新员工的工资。无论何时更新时发生任何错误,我都需要保存发生员工id错误的文件。 但编译时会出现以下错误 错误(14,24):PLS-00201:必须声明标识符“INDX”

下面是我的代码

PROCEDURE PROC1 (V_EMP_ID DBMS_SQL.NUMBER_TABLE)
IS
     lv_error_string VARCHAR2(4000);
BEGIN
    FORALL INDX IN V_EMP_ID.FIRST..V_EMP_ID.LAST SAVE EXCEPTIONS
    EXECUTE IMMEDIATE 'UPDATE EMPLOYEES SET SALARY=SALARY+10000 WHERE EMP_ID=:1'
    USING V_EMP_ID(INDX);
EXCEPTION
    WHEN OTHERS 
    THEN
    FOR J IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
    LOOP
       lv_error_string:=lv_error_string
                    ||sqlerrm (-sql%bulk_exceptions(j).error_code)
                    || ' for'||V_EMP_ID(INDX);
    END LOOP;
END;

使用此选项:错误是在
异常块
中尝试访问在
开始块
中使用的循环变量

所以你的
| | |代表| | V|u EMP|u ID(INDX)应为“| | | V|u EMP|u ID(J)”的
| |

当您可以轻松执行以下操作时,不确定为什么要使用
executeimmediate

CREATE OR REPLACE PROCEDURE PROC1 (V_EMP_ID DBMS_SQL.NUMBER_TABLE)
IS
     lv_error_string VARCHAR2(4000);
BEGIN
    FORALL INDX IN V_EMP_ID.FIRST..V_EMP_ID.LAST SAVE EXCEPTIONS
    UPDATE EMPLOYEES 
    SET SALARY=SALARY+10000 
    WHERE EMP_ID= V_EMP_ID(INDX);

EXCEPTION
    WHEN OTHERS 
    THEN
    FOR J IN 1 .. SQL%BULK_EXCEPTIONS.COUNT
    LOOP
       lv_error_string:=lv_error_string
                    ||sqlerrm (-sql%bulk_exceptions(j).error_code)
                    || ' for'||V_EMP_ID(J);
    END LOOP;
END;

我建议使用一个DML声明。是的,DML错误日志是可能的。希望这有帮助

--Creating a error log table
BEGIN
  DBMS_ERRLOG.create_error_log (dml_table_name => 'EMPLOYEES');
END;
/
--ERR$_EMPLOYEES --> Errro table created


--Insertion with erroreous record
UPDATE EMPLOYEES
SET SALARY         = SALARY + 10000
where EMP_ID               in (<EMP_ID COLLECTION array
OR simple EMP_IDs>) LOG ERRORS
INTO ERR$_EMPLOYEES ('UPDATE') REJECT LIMIT UNLIMITED;

--Error will be logged into ERR$_EMPLOYEES table
--创建错误日志表
开始
DBMS_ERRLOG.create_error_log(dml_table_name=>“EMPLOYEES”);
结束;
/
--ERR$\u EMPLOYEES-->已创建Errro表
--带错误记录的插入
更新员工
设定薪资=薪资+10000
其中EMP_ID in()记录错误
进入ERR$\u员工(“更新”)拒绝限制;
--错误将被记录到ERR$\u EMPLOYEES表中

这可以工作,但不会给我哪个错误的员工idoccurred@XINGSo谈到您的问题,我不确定当您可以直接运行
更新时,为什么要执行
立即执行
。见我更新的帖子。您没有得到任何
员工id
因为oracle找不到任何
异常
。记录错误是个好主意,但请记住,它将在单个语句中保留成功修改的行,这与保存异常(语句级错误抑制)非常不同。是的。我在这里只考虑了行级错误处理
--Creating a error log table
BEGIN
  DBMS_ERRLOG.create_error_log (dml_table_name => 'EMPLOYEES');
END;
/
--ERR$_EMPLOYEES --> Errro table created


--Insertion with erroreous record
UPDATE EMPLOYEES
SET SALARY         = SALARY + 10000
where EMP_ID               in (<EMP_ID COLLECTION array
OR simple EMP_IDs>) LOG ERRORS
INTO ERR$_EMPLOYEES ('UPDATE') REJECT LIMIT UNLIMITED;

--Error will be logged into ERR$_EMPLOYEES table