2
    declare
      e_forall_error exception;
      pragma exception_init(e_forall_error,-24381)
          ;
      type t_numbers is table of emp.empno%type;
      l_numbers t_numbers := t_numbers(null,2,3,4,5,6,7,8,9,10)
          ;
    begin
      forall i in 1..l_numbers.count save exceptions
  --note:empno is primary key     
      insert into emp
       ( empno      , ename
       )
       values
       ( l_numbers(i)
       , 'Name' || to_char(l_numbers(i))
       )
         ;
   exception
   when e_forall_error then
     for i in 1..sql%bulk_exceptions.count
     loop
       dbms_output.put_line('SQLCODE: ' || sql%bulk_exceptions(i).error_code);
       dbms_output.put_line('SQLERRM: ' || sqlerrm(-sql%bulk_exceptions(i).error_code));
       dbms_output.new_line;
     end loop;
   end;
   /

大家好,我有一个现有程序,如上所示,将 empno 和 empname 的值插入到 emp 表中,但问题是该程序提到的错误是

SQLCODE: 1400
SQLERRM: ORA-01400: cannot insert NULL into ()

我想要一个更具体的错误,它通常会抛出什么

SQLERRM: ORA-01400: cannot insert NULL into empno column

这怎么可能在批量插入中实现?

4

1 回答 1

1
CREATE OR REPLACE TABLE logs (logcode NUMBER, logmsg VARCHAR2(1024));
/

CREATE OR REPLACE PROCEDURE logme(I_logcode IN NUMBER, I_logmsg IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    insert into logs (logcode, logmsg) values (I_logcode , I_logmsg);
    commit;
END;
/

CREATE OR REPLACE PROCEDURE insertmyrow(I_prm1 IN VARCHAR2, I_prm2 IN VARCHAR2, ...) IS
BEGIN
    insert into emp  (empno, ename, ...) values (I_prm1, I_prm2, ...);
EXCEPTION WHEN OTHERS THEN                
    logme(sqlcode, sqlerrm);
    RAISE;
END;
/

forall i in 1..l_numbers.count save exceptions
    insertmyrow(l_numbers(i), ...);

这是主要思想,我想可能有点沉重,但为什么不呢?

于 2012-05-24T20:26:34.037 回答