当按下按钮的触发器引发未处理的异常时ora-01401

时间:2019-07-09 10:07:43

标签: oracle plsql import oracleforms

我尝试将.CSV中的数据插入Oracle db中 一切正常,但几秒钟后出现错误

when button pressed trigger raised unhandled exception ora-01401

我大约要插入1200 records,当我检入数据库时​​,我看到插入的对象只有630 record

declare 

   import_file text_io.file_type; 
   export_file text_io.file_type; 
   import_file_name varchar2(1000);
   export_file_name varchar2(1000);

   import_log_file text_io.file_type;
   import_log_file_name varchar2(1000);

   vec_importovano  number;
   brojac number;
   brojac_redova number;
   linebuf varchar2(5000);


   p_rbr     VARCHAR2(30);
   p_polica  VARCHAR2(30);
   p_banka   VARCHAR2(20);
   p_kontakt VARCHAR2(30);

  kraj_fajla number;

begin
    brojac_redova:=0;
    p_rbr:=100001;

    import_file_name := :Global.Lokacija_prenosa||:import.naziv_fajla||:Global.Ekstenzija_prenosa;
    import_file := text_io.fopen(import_file_name,'r');

    delete from zivot_trajni_nalog_ponude where banka is not null;
    commit;

    kraj_fajla := 0;  
    while kraj_fajla = 0 loop
  begin     
    brojac_redova:=brojac_redova+1;
    p_rbr:=p_rbr+1;
    text_io.get_line(import_file, linebuf);               

 if brojac_redova >= 2 then

   p_polica:=substr(linebuf, 1, instr(linebuf,';',1,1)-1);
  -- message(p_polica);
   p_kontakt:=substr(linebuf, instr(linebuf,';',1,1)+1, instr(linebuf,';',1,2) - instr(linebuf,';',1,1)-1);
  -- message(p_kontakt);

   if instr(linebuf,';',1,3) > 0 then 
            p_banka := substr(linebuf, 
                            instr(linebuf,';',1, 2) + 1, 
                            instr(linebuf,';',1,3) - instr(linebuf,';',1,2)-1);

                 --message(p_banka);               
        else
          p_banka := substr(linebuf, 
                            instr(linebuf,';',1, 2) + 1);   
                --message(p_banka);                              
        end if; 

  -- IF p_rbr is not null then
         insert into ZIVOT_TRAJNI_NALOG_PONUDE 
          (BROJ_POLICE,REDNI_BROJ,BROJ_PONUDE,BANKA)     
         values(
         p_polica,
         p_rbr,
         p_kontakt,
         p_banka);      
            commit;                   
   end if;
  -- end if;

     EXCEPTION WHEN NO_DATA_FOUND THEN kraj_fajla := 1;         
     end;

end loop;  
        if p_rbr is not null then
      update zivot_trajni_nalog_ponude set redni_broj=rownum;
        end if;
    text_io.fclose(import_file);
      message('Zavrseno prepisivanje fajla');
end;

到目前为止,我做的是增加缓冲区大小并增加数据库中的数据,但同样是同样的问题。

这是无法插入数据库的数据。所以它停在这里并显示错误。

4555219;773017/1;S-PREMIUM BA
4555220;1862014551963592;ZIR
4555223;1861814551965445;ZIR
4555224;1861634551963417;ZIR
4555226;234011;PBS
4555230;1862614551947169;ZIR
4555231;1862814551965880;ZIR
4555237;234002/1;PBS
4555238;233817/1;PBS
4555239;233982;PBS
4555240;233422;PBS
4555242;233820;PBS
4555243;1861614551961478;ZIR
4555244;1861824551967142;ZIR
4555246;1861644551966181;ZIR
4555247;1861214551966542;ZIR
4555248;1861814551967773;ZIR
4555249;1862224521502138;ZIR
4555250;1861224551967075;ZIR
4555251;1862214551967462;ZIR
4555252;1863214551968285;ZIR
4555253;1863414551943831;ZIR
4555254;1863414551966238;ZIR
4555254;1863414551966238;ZIR
4555255;1863414551962746;ZIR
4555256;107160825;NLB
4555257;107161767;NLB
4555258;107158740;NLB
4555259;107162747;NLB
4555260;107162658;NLB
4555261;107157891;NLB

2 个答案:

答案 0 :(得分:1)

尝试在循环开始时清空linebuf

while kraj_fajla = 0 
loop
begin     
  linebuf := null;

在每次重复之前,都要填充该变量的值。

通过局部变量(p_banka)的长度(20)可能不足以返回值。您可以尝试增加150之类的内容。

答案 1 :(得分:1)

@ 检查所有列的长度,此错误是在插入记录的字符串长度(来自csv文件)大于表列宽度时出现的