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 に答える